summaryrefslogtreecommitdiff
path: root/webapp/src/card.rs
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-09-05 15:48:02 -0400
committerKjetil Orbekk <kj@orbekk.com>2022-09-05 15:50:04 -0400
commit699a54e42fd1dc90f1b73b00aca5f1e52284037b (patch)
tree224682021a4530a0b1bc121a18d6b554767e64b5 /webapp/src/card.rs
parente49f9799fbce40a3266a04e36670a04990aea7a1 (diff)
Sort hands when displaying cards
Diffstat (limited to 'webapp/src/card.rs')
-rw-r--r--webapp/src/card.rs25
1 files changed, 17 insertions, 8 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<Card> {
result
}
-#[derive(Default, PartialEq, Eq)]
+#[derive(Default, PartialEq, Eq, Copy, Clone)]
pub enum RankOrder {
#[default]
Descending,
Ascending,
}
-pub fn sort_cards<Suits: Iterator<Item = Suit>>(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<Card>,
}
+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<R>(rng: &mut R) -> Deal
where
R: Rng,