#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Direction {
Up,
Down,
Left,
Right,
}
impl Direction {
#[inline]
pub const fn is_vertical(self) -> bool {
matches!(self, Direction::Up | Direction::Down)
}
#[inline]
pub const fn is_horizontal(self) -> bool {
matches!(self, Direction::Left | Direction::Right)
}
#[inline]
pub const fn sign(self) -> i32 {
match self {
Direction::Down | Direction::Right => 1,
Direction::Up | Direction::Left => -1,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn vertical_directions() {
assert!(Direction::Up.is_vertical());
assert!(Direction::Down.is_vertical());
assert!(!Direction::Left.is_vertical());
assert!(!Direction::Right.is_vertical());
}
#[test]
fn horizontal_directions() {
assert!(Direction::Left.is_horizontal());
assert!(Direction::Right.is_horizontal());
assert!(!Direction::Up.is_horizontal());
assert!(!Direction::Down.is_horizontal());
}
#[test]
fn signs() {
assert_eq!(Direction::Up.sign(), -1);
assert_eq!(Direction::Down.sign(), 1);
assert_eq!(Direction::Left.sign(), -1);
assert_eq!(Direction::Right.sign(), 1);
}
}