From 699a54e42fd1dc90f1b73b00aca5f1e52284037b Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Mon, 5 Sep 2022 15:48:02 -0400 Subject: Sort hands when displaying cards --- webapp/src/card.rs | 25 +++++++++++++++++-------- webapp/src/main.rs | 11 +++++++---- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/webapp/src/card.rs b/webapp/src/card.rs index 6bb34eb..58e322d 100644 --- a/webapp/src/card.rs +++ b/webapp/src/card.rs @@ -161,17 +161,17 @@ fn make_deck() -> Vec { result } -#[derive(Default, PartialEq, Eq)] +#[derive(Default, PartialEq, Eq, Copy, Clone)] pub enum RankOrder { #[default] Descending, Ascending, } -pub fn sort_cards>(suits: Suits, ord: RankOrder, cards: &mut [Card]) { +pub fn sort_cards(suits: &[Suit; 4], ord: RankOrder, cards: &mut [Card]) { let mut score: [u8; Suit::COUNT] = [0; Suit::COUNT]; - for (i, suit) in suits.enumerate() { - score[suit as usize] = i as u8; + for (i, suit) in suits.iter().enumerate() { + score[*suit as usize] = i as u8; } cards.sort_by(|&Card(s1, r1), &Card(s2, r2)| { let order = { @@ -200,7 +200,7 @@ mod tests { assert_eq!([card("♥2"), card("♥3"), card("♥4"),], { let mut cards = [card("♥2"), card("♥4"), card("♥3")]; sort_cards( - [Suit::Heart, Suit::Spade, Suit::Club, Suit::Diamond].into_iter(), + &[Suit::Heart, Suit::Spade, Suit::Club, Suit::Diamond], RankOrder::Ascending, &mut cards, ); @@ -209,16 +209,16 @@ mod tests { assert_eq!([card("♥A"), card("♥3"), card("♥2"),], { let mut cards = [card("♥2"), card("♥A"), card("♥3")]; sort_cards( - [Suit::Heart, Suit::Spade, Suit::Club, Suit::Diamond].into_iter(), + &[Suit::Heart, Suit::Spade, Suit::Club, Suit::Diamond], RankOrder::Descending, &mut cards, ); cards }); assert_eq!([card("♠A"), card("♥A"), card("♣A"), card("♦A"),], { - let mut cards = [card("♣A"), card("♠A"), card("♥A"), card("♦A"),]; + let mut cards = [card("♣A"), card("♠A"), card("♥A"), card("♦A")]; sort_cards( - [Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade].into_iter(), + &[Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade], RankOrder::Descending, &mut cards, ); @@ -248,6 +248,15 @@ pub struct Deal { pub east: Vec, } +impl Deal { + pub fn sort(&mut self, suits: &[Suit; 4], ord: RankOrder) { + sort_cards(suits, ord, self.north.as_mut_slice()); + sort_cards(suits, ord, self.west.as_mut_slice()); + sort_cards(suits, ord, self.south.as_mut_slice()); + sort_cards(suits, ord, self.east.as_mut_slice()); + } +} + pub fn deal(rng: &mut R) -> Deal where R: Rng, diff --git a/webapp/src/main.rs b/webapp/src/main.rs index 61e007c..b8ac4bb 100644 --- a/webapp/src/main.rs +++ b/webapp/src/main.rs @@ -11,6 +11,8 @@ extern crate wee_alloc; #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; +pub const SUIT_DISPLAY_ORDER: [Suit; 4] = [Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade]; + fn main() { std::panic::set_hook(Box::new(console_error_panic_hook::hook)); wasm_logger::init(wasm_logger::Config::default()); @@ -20,7 +22,8 @@ fn main() { #[function_component(App)] pub fn app() -> Html { let mut rng = rand::thread_rng(); - let deal = card::deal(&mut rng); + let mut deal = card::deal(&mut rng); + deal.sort(&SUIT_DISPLAY_ORDER, card::RankOrder::Descending); let north = use_state(|| HandProps::from_iter(deal.north.into_iter())); let west = use_state(|| HandProps::from_iter(deal.west.into_iter())); @@ -35,7 +38,8 @@ pub fn app() -> Html { Callback::from(move |_| { let mut rng = rand::thread_rng(); - let deal = card::deal(&mut rng); + let mut deal = card::deal(&mut rng); + deal.sort(&SUIT_DISPLAY_ORDER, card::RankOrder::Descending); north.set(deal.north.into_iter().collect()); west.set(deal.west.into_iter().collect()); south.set(deal.south.into_iter().collect()); @@ -145,8 +149,7 @@ pub fn bidding_box(props: &BiddingBoxProps) -> Html { } else { classes!("enabled") }; - class.extend( - classes!(bid_css_class(bid.suit))); + class.extend(classes!(bid_css_class(bid.suit))); html! {
{ bid.level } -- cgit v1.2.3