#[derive(Clone, Copy, Debug)]
pub(crate) enum AxialDirection {
Positive,
Negative,
}
#[derive(Clone, Copy, Debug)]
enum PlaneAxis {
First,
Second,
}
#[derive(Clone, Copy, Debug)]
struct PlanarDirection {
axis: PlaneAxis,
direction: AxialDirection,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum ScreenDirection {
Up,
Down,
Left,
Right,
}
impl ScreenDirection {
#[inline]
#[must_use]
pub(crate) const fn vertical_direction(self) -> Option<AxialDirection> {
match self {
Self::Up => Some(AxialDirection::Negative),
Self::Down => Some(AxialDirection::Positive),
Self::Left | Self::Right => None,
}
}
}
impl From<PlanarDirection> for ScreenDirection {
#[inline]
fn from(planar_direction: PlanarDirection) -> Self {
match planar_direction.axis {
PlaneAxis::First => match planar_direction.direction {
AxialDirection::Positive => Self::Down,
AxialDirection::Negative => Self::Up,
},
PlaneAxis::Second => match planar_direction.direction {
AxialDirection::Positive => Self::Right,
AxialDirection::Negative => Self::Left,
},
}
}
}
impl From<ScreenDirection> for PlanarDirection {
#[inline]
fn from(screen_direction: ScreenDirection) -> Self {
match screen_direction {
ScreenDirection::Up => Self {
axis: PlaneAxis::First,
direction: AxialDirection::Positive,
},
ScreenDirection::Down => Self {
axis: PlaneAxis::First,
direction: AxialDirection::Negative,
},
ScreenDirection::Left => Self {
axis: PlaneAxis::Second,
direction: AxialDirection::Negative,
},
ScreenDirection::Right => Self {
axis: PlaneAxis::Second,
direction: AxialDirection::Positive,
},
}
}
}