nv_card/deck/
non_duplicate_deck.rs

1use collection::{Collection, MutableCollection, Sliceable};
2use card::{StandardCard};
3use deck::deck_creator;
4
5use std::cmp::PartialEq;
6
7///A Deck that wont contain duplicate cards
8#[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}