1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
use std::fmt::{Display, Formatter, Result};
use std::ops::AddAssign;
use super::*;
#[derive(Clone)]
pub struct Hand {
pub cards: Vec<Card>,
}
impl Display for Hand {
fn fmt(&self, f: &mut Formatter) -> Result {
let mut result = String::with_capacity(self.cards.len() * 3);
self.cards.iter().enumerate().for_each(|(i, card)| {
result.push_str(&card.to_str());
if i < self.cards.len() - 1 {
result.push(',');
}
});
write!(f, "{}", result)
}
}
impl Default for Hand {
fn default() -> Self {
Self { cards: Vec::new() }
}
}
impl<'a> AddAssign<&'a Hand> for Hand {
fn add_assign(&mut self, rhs: &Hand) {
self.push_hand(rhs);
}
}
impl AddAssign<Card> for Hand {
fn add_assign(&mut self, rhs: Card) {
self.push_card(rhs);
}
}
impl Cards for Hand {
fn cards(&self) -> &[Card] {
self.cards.as_slice()
}
fn mut_cards(&mut self) -> &mut [Card] {
self.cards.as_mut_slice()
}
}
impl Hand {
pub fn new() -> Self { Self::default() }
pub fn from_hand(hand: &Hand) -> Hand {
Hand::from_cards(hand.cards())
}
pub fn from_cards(cards: &[Card]) -> Hand {
Hand { cards: Vec::from(cards) }
}
pub fn from_strings(card_slice: &[&str]) -> Hand {
let cards = card_slice.iter().map(|s| card!(s)).collect::<Vec<Card>>();
Hand { cards }
}
pub fn push_card(&mut self, card: Card) {
self.cards.push(card);
}
pub fn push_cards(&mut self, cards: &[Card]) {
self.cards.extend(cards);
}
pub fn push_hand(&mut self, other: &Hand) {
self.cards.extend(other.cards());
}
pub fn len(&self) -> usize {
self.cards.len()
}
pub fn clear(&mut self) {
self.cards.clear();
}
pub fn remove(&mut self, index: usize) -> Card {
self.cards.remove(index)
}
pub fn remove_cards(&mut self, cards: &[Card]) {
for c in cards {
let _ = self.remove_card(c);
}
}
pub fn remove_all_cards(&mut self, cards: &[Card]) {
for c in cards {
while self.remove_card(c) {}
}
}
pub fn remove_card(&mut self, card: &Card) -> bool {
if let Some(pos) = self.cards.iter().position(|c| c == card) {
let _ = self.cards.remove(pos);
true
} else {
false
}
}
pub fn cards_of_rank(&self, rank: Rank) -> Vec<Card> {
cards_of_rank(&self.cards, rank)
}
pub fn cards_of_suit(&self, suit: Suit) -> Vec<Card> {
cards_of_suit(&self.cards, suit)
}
}