#[derive(Debug, Copy, Clone)]
enum Size {
Small,
Medium,
Big,
}
#[derive(Debug, Copy, Clone)]
#[repr(u8)]
enum Direction {
North,
East,
South,
West,
}
#[derive(Debug, Copy, Clone)]
#[repr(u16)]
enum Greek {
Alpha,
Beta,
Gamma,
Delta,
Epsilon,
}
fn shrink(size: Size) -> Size {
match size {
Size::Small => panic!("Can't be smaller"),
Size::Medium => Size::Small,
Size::Big => Size::Medium,
}
}
fn flip(dir: Direction) -> Direction {
match dir {
Direction::North => Direction::South,
Direction::East => Direction::West,
Direction::South => Direction::North,
Direction::West => Direction::East,
}
}
fn advance(greek: Greek) -> Greek {
match greek {
Greek::Alpha => Greek::Beta,
Greek::Beta => Greek::Gamma,
Greek::Gamma => Greek::Delta,
Greek::Delta => Greek::Epsilon,
Greek::Epsilon => panic!("No where"),
}
}
fn main() {
let big = Size::Big;
let medium = shrink(big);
assert!(matches!(medium, Size::Medium));
dbg!((big, medium));
let north = Direction::North;
let south = flip(north);
assert!(matches!(south, Direction::South));
dbg!((north, south));
let east = Direction::East;
let west = flip(east);
assert!(matches!(west, Direction::West));
dbg!((east, west));
let alpha = Greek::Alpha;
let beta = advance(alpha);
assert!(matches!(beta, Greek::Beta));
dbg!((alpha, beta));
let beta = Greek::Beta;
let gamma = advance(beta);
assert!(matches!(gamma, Greek::Gamma));
dbg!((beta, gamma));
let gamma = Greek::Gamma;
let delta = advance(gamma);
assert!(matches!(delta, Greek::Delta));
dbg!((gamma, delta));
}