use crate::core::card::{Card, Suit, Value};
use std::collections::hash_set::{IntoIter, Iter};
use std::collections::HashSet;
#[derive(Debug)]
pub struct Deck {
cards: HashSet<Card>,
}
impl Deck {
#[must_use]
pub fn default() -> Self {
let mut cards: HashSet<Card> = HashSet::new();
for v in &Value::values() {
for s in &Suit::suits() {
cards.insert(Card {
value: *v,
suit: *s,
});
}
}
Self { cards }
}
#[must_use]
pub fn contains(&self, c: Card) -> bool {
self.cards.contains(&c)
}
pub fn remove(&mut self, c: Card) -> bool {
self.cards.remove(&c)
}
#[must_use]
pub fn len(&self) -> usize {
self.cards.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.cards.is_empty()
}
#[must_use]
pub fn iter(&self) -> Iter<Card> {
self.cards.iter()
}
}
impl IntoIterator for Deck {
type Item = Card;
type IntoIter = IntoIter<Card>;
#[must_use]
fn into_iter(self) -> IntoIter<Card> {
self.cards.into_iter()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::card::*;
#[test]
fn test_contains_in() {
let d = Deck::default();
assert!(d.contains(Card {
value: Value::Eight,
suit: Suit::Heart,
}));
}
#[test]
fn test_remove() {
let mut d = Deck::default();
let c = Card {
value: Value::Ace,
suit: Suit::Heart,
};
assert!(d.contains(c));
assert!(d.remove(c));
assert!(!d.contains(c));
assert!(!d.remove(c));
}
}