ckc_rs/
deck.rs

1use crate::{CKCNumber, CardNumber};
2
3pub const DECK_SIZE: usize = 52;
4
5/// Represents a Standard52 deck as an immutable array of
6/// Cactus Kev Cards (`PokerCard`).
7#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
8pub struct Deck([CKCNumber; DECK_SIZE]);
9
10pub const POKER_DECK: Deck = Deck([
11    CardNumber::ACE_SPADES,
12    CardNumber::KING_SPADES,
13    CardNumber::QUEEN_SPADES,
14    CardNumber::JACK_SPADES,
15    CardNumber::TEN_SPADES,
16    CardNumber::NINE_SPADES,
17    CardNumber::EIGHT_SPADES,
18    CardNumber::SEVEN_SPADES,
19    CardNumber::SIX_SPADES,
20    CardNumber::FIVE_SPADES,
21    CardNumber::FOUR_SPADES,
22    CardNumber::TREY_SPADES,
23    CardNumber::DEUCE_SPADES,
24    CardNumber::ACE_HEARTS,
25    CardNumber::KING_HEARTS,
26    CardNumber::QUEEN_HEARTS,
27    CardNumber::JACK_HEARTS,
28    CardNumber::TEN_HEARTS,
29    CardNumber::NINE_HEARTS,
30    CardNumber::EIGHT_HEARTS,
31    CardNumber::SEVEN_HEARTS,
32    CardNumber::SIX_HEARTS,
33    CardNumber::FIVE_HEARTS,
34    CardNumber::FOUR_HEARTS,
35    CardNumber::TREY_HEARTS,
36    CardNumber::DEUCE_HEARTS,
37    CardNumber::ACE_DIAMONDS,
38    CardNumber::KING_DIAMONDS,
39    CardNumber::QUEEN_DIAMONDS,
40    CardNumber::JACK_DIAMONDS,
41    CardNumber::TEN_DIAMONDS,
42    CardNumber::NINE_DIAMONDS,
43    CardNumber::EIGHT_DIAMONDS,
44    CardNumber::SEVEN_DIAMONDS,
45    CardNumber::SIX_DIAMONDS,
46    CardNumber::FIVE_DIAMONDS,
47    CardNumber::FOUR_DIAMONDS,
48    CardNumber::TREY_DIAMONDS,
49    CardNumber::DEUCE_DIAMONDS,
50    CardNumber::ACE_CLUBS,
51    CardNumber::KING_CLUBS,
52    CardNumber::QUEEN_CLUBS,
53    CardNumber::JACK_CLUBS,
54    CardNumber::TEN_CLUBS,
55    CardNumber::NINE_CLUBS,
56    CardNumber::EIGHT_CLUBS,
57    CardNumber::SEVEN_CLUBS,
58    CardNumber::SIX_CLUBS,
59    CardNumber::FIVE_CLUBS,
60    CardNumber::FOUR_CLUBS,
61    CardNumber::TREY_CLUBS,
62    CardNumber::DEUCE_CLUBS,
63]);
64
65impl Deck {
66    #[must_use]
67    pub fn arr(&self) -> [CKCNumber; DECK_SIZE] {
68        self.0
69    }
70
71    #[must_use]
72    pub fn get(index: usize) -> CKCNumber {
73        if index < Deck::len() {
74            POKER_DECK.0[index]
75        } else {
76            CardNumber::BLANK
77        }
78    }
79
80    #[must_use]
81    pub fn len() -> usize {
82        DECK_SIZE
83    }
84}
85
86#[cfg(test)]
87#[allow(non_snake_case)]
88mod deck_tests {
89    use super::*;
90
91    #[test]
92    fn arr() {
93        for i in 0..Deck::len() {
94            let card = Deck::get(i);
95
96            assert_eq!(card, POKER_DECK.arr()[i]);
97        }
98        assert_eq!(DECK_SIZE, Deck::len());
99        assert_eq!(Deck::get(Deck::len()), CardNumber::BLANK);
100    }
101
102    #[test]
103    fn get() {
104        for i in 0..Deck::len() {
105            let card = Deck::get(i);
106
107            assert_eq!(card, POKER_DECK.0[i]);
108        }
109        assert_eq!(DECK_SIZE, Deck::len());
110        assert_eq!(Deck::get(Deck::len()), CardNumber::BLANK);
111    }
112}