nv_card/deck/
non_duplicate_deck.rs1use collection::{Collection, MutableCollection, Sliceable};
2use card::{StandardCard};
3use deck::deck_creator;
4
5use std::cmp::PartialEq;
6
7#[derive(Debug)]
9pub struct NoDuplicatesDeck<T: PartialEq> {
10 _cards: Vec<T>
11}
12
13impl<T> NoDuplicatesDeck<T>
14 where T: PartialEq
15{
16 pub fn new() -> NoDuplicatesDeck<T>
17 {
18 NoDuplicatesDeck{_cards:Vec::new()}
19 }
20
21 pub fn new_standard_deck() -> NoDuplicatesDeck<StandardCard>
22 {
23 NoDuplicatesDeck{_cards: deck_creator::create_standard_deck()}
24 }
25
26 fn contains(&self, item: &T) -> bool
27 {
28 self._cards.contains(item)
29 }
30}
31
32impl<T> Collection for NoDuplicatesDeck<T>
33 where T: PartialEq
34{
35 type Item=T;
36 fn size(&self) -> usize
37 {
38 self._cards.len()
39 }
40}
41
42impl<T> MutableCollection for NoDuplicatesDeck<T>
43 where T: PartialEq
44{
45 fn push(&mut self, item: Self::Item) -> ()
46 {
47 if !self.contains(&item)
48 {self._cards.push(item)}
49 }
50
51 fn pop(&mut self) -> Option<Self::Item>
52 {
53 self._cards.pop()
54 }
55
56 fn insert_at(&mut self, index: usize, item: Self::Item) -> ()
57 {
58 if !self.contains(&item)
59 {self._cards.insert(index, item)}
60 }
61
62 fn remove_at(&mut self, index:usize) -> Option<Self::Item>
63 {
64 self._cards.remove_at(index)
65 }
66}
67
68impl<T> Sliceable for NoDuplicatesDeck<T>
69 where T: PartialEq
70{
71 type Item = T;
72 fn as_mut_slice(&mut self) -> &mut [T]
73 {
74 self._cards.as_mut_slice()
75 }
76}
77
78#[cfg(test)]
79mod non_duplicate_tests
80{
81 use super::NoDuplicatesDeck;
82
83 use deck::{Deck};
84
85 #[test]
86 fn cannot_add_duplicates() -> ()
87 {
88 let item = 1;
89 let mut deck = NoDuplicatesDeck::new();
90 deck.add_card_to_bottom(item);
91 assert_eq!(deck.size(), 1);
92 deck.add_card_to_bottom(item);
93 assert_eq!(deck.size(), 1);
94 }
95}