|
|
@@ -1,6 +1,7 @@
|
|
1
|
1
|
use std::fmt;
|
|
|
2
|
+use std::cmp::Ordering;
|
|
2
|
3
|
|
|
3
|
|
-#[derive(Copy, Clone)]
|
|
|
4
|
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
|
|
4
|
5
|
pub enum Suit {
|
|
5
|
6
|
Clubs,
|
|
6
|
7
|
Diamonds,
|
|
|
@@ -25,7 +26,7 @@ impl Suit {
|
|
25
|
26
|
}
|
|
26
|
27
|
}
|
|
27
|
28
|
|
|
28
|
|
-#[derive(Copy, Clone)]
|
|
|
29
|
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
|
|
29
|
30
|
pub enum Symbol {
|
|
30
|
31
|
Ace,
|
|
31
|
32
|
Two,
|
|
|
@@ -83,13 +84,19 @@ impl Symbol {
|
|
83
|
84
|
}
|
|
84
|
85
|
}
|
|
85
|
86
|
|
|
86
|
|
-#[derive(Copy, Clone)]
|
|
|
87
|
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd)]
|
|
87
|
88
|
pub struct Face {
|
|
88
|
89
|
pub suit: Suit,
|
|
89
|
90
|
pub symbol: Symbol,
|
|
90
|
91
|
}
|
|
91
|
92
|
|
|
92
|
|
-#[derive(Copy, Clone)]
|
|
|
93
|
+impl Ord for Face {
|
|
|
94
|
+ fn cmp(&self, face: &Face) -> Ordering {
|
|
|
95
|
+ self.symbol.cmp(&face.symbol)
|
|
|
96
|
+ }
|
|
|
97
|
+}
|
|
|
98
|
+
|
|
|
99
|
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
|
|
93
|
100
|
pub enum Trump {
|
|
94
|
101
|
One,
|
|
95
|
102
|
Two,
|
|
|
@@ -168,7 +175,7 @@ impl Trump {
|
|
168
|
175
|
}
|
|
169
|
176
|
}
|
|
170
|
177
|
|
|
171
|
|
-#[derive(Copy, Clone)]
|
|
|
178
|
+#[derive(Copy, Clone, Eq, PartialEq, PartialOrd)]
|
|
172
|
179
|
pub enum Card {
|
|
173
|
180
|
Face(Face),
|
|
174
|
181
|
Trump(Trump),
|
|
|
@@ -185,3 +192,16 @@ impl fmt::Display for Card {
|
|
185
|
192
|
}
|
|
186
|
193
|
}
|
|
187
|
194
|
}
|
|
|
195
|
+
|
|
|
196
|
+impl Ord for Card {
|
|
|
197
|
+ fn cmp(&self, card: &Card) -> Ordering {
|
|
|
198
|
+ match (self, card) {
|
|
|
199
|
+ (&Card::Fool, _) => Ordering::Less,
|
|
|
200
|
+ (_, &Card::Fool) => Ordering::Greater,
|
|
|
201
|
+ (&Card::Trump(_), &Card::Face(_)) => Ordering::Greater,
|
|
|
202
|
+ (&Card::Face(_), &Card::Trump(_)) => Ordering::Less,
|
|
|
203
|
+ (&Card::Trump(trump1), &Card::Trump(trump2)) => trump1.cmp(&trump2),
|
|
|
204
|
+ (&Card::Face(face1), &Card::Face(face2)) => face1.cmp(&face2),
|
|
|
205
|
+ }
|
|
|
206
|
+ }
|
|
|
207
|
+}
|