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];