use std::cmp::Ordering;
use std::slice::Iter;
use self::Suit::*;
#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Debug)]
pub enum Suit {
Spades,
Hearts,
Diamonds,
Clubs,
}
impl Ord for Suit {
fn cmp(&self, other: &Suit) -> Ordering {
let o1 = self.ordinal();
let o2 = other.ordinal();
if o1 < o2 {
return Ordering::Less;
} else if o1 > o2 {
return Ordering::Greater;
}
Ordering::Equal
}
}
impl Suit {
pub fn iterator() -> Iter<'static, Suit> {
Suit::suits().into_iter()
}
pub fn ordinal(&self) -> usize {
match *self {
Spades => 0,
Hearts => 1,
Diamonds => 2,
Clubs => 3,
}
}
pub fn from_char(ch: char) -> Result<Suit, &'static str> {
let s = Suit::chars().to_string();
for (i, c) in s.chars().enumerate() {
if c == ch {
return Ok(Suit::suits()[i]);
}
}
Err("Invalid suit")
}
pub fn to_char(&self) -> char {
let ord = self.ordinal();
let b: &[u8] = Suit::chars().as_bytes();
b[ord] as char
}
pub fn to_str(&self) -> &'static str {
match *self {
Spades => "Spades",
Hearts => "Hearts",
Diamonds => "Diamonds",
Clubs => "Clubs",
}
}
pub fn suits() -> &'static [Suit] {
static SUITS: [Suit; 4] = [Spades, Hearts, Diamonds, Clubs];
&SUITS[..]
}
fn chars() -> &'static str {
"SHDC"
}
}