1use crate::{CKCNumber, CardNumber};
2
3pub const DECK_SIZE: usize = 52;
4
5#[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}