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
use crate::{Card, CardCollection, ACE};
pub type Cascade = Vec<Card>;
fn fits_on_top_of(lower_card: Card, higher_card: Card) -> bool {
lower_card.suit.colour() != higher_card.suit.colour() &&
lower_card.rank + 1 == higher_card.rank
}
impl CardCollection for Cascade {
fn add_card(&self, card: Card) -> Result<Cascade, ()> {
if card.rank == ACE {
return Err(());
}
match self.last() {
Some(&top_card) => {
if fits_on_top_of(card, top_card) {
let mut clone = (*self).clone();
clone.push(card);
Ok(clone)
} else {
Err(())
}
}
None => Ok(vec![card]),
}
}
fn pop_card(&self) -> Vec<(Cascade, Card)> {
let mut clone = (*self).clone();
match clone.pop() {
Some(card) => vec![(clone, card)],
None => Vec::new(),
}
}
}
pub type Cascades = [Cascade; 8];