use rat_event::{ConsumedEvent, Outcome};
use std::cmp::Ordering;
use std::mem;
#[derive(Debug, Clone, Copy)]
#[must_use]
#[non_exhaustive]
pub enum Control<Event> {
Continue,
Unchanged,
Changed,
Event(Event),
#[cfg(feature = "dialog")]
Close(Event),
Quit,
}
impl<Event> Eq for Control<Event> {}
impl<Event> PartialEq for Control<Event> {
fn eq(&self, other: &Self) -> bool {
mem::discriminant(self) == mem::discriminant(other)
}
}
impl<Event> Ord for Control<Event> {
fn cmp(&self, other: &Self) -> Ordering {
match self {
Control::Continue => match other {
Control::Continue => Ordering::Equal,
Control::Unchanged => Ordering::Less,
Control::Changed => Ordering::Less,
Control::Event(_) => Ordering::Less,
#[cfg(feature = "dialog")]
Control::Close(_) => Ordering::Less,
Control::Quit => Ordering::Less,
},
Control::Unchanged => match other {
Control::Continue => Ordering::Greater,
Control::Unchanged => Ordering::Equal,
Control::Changed => Ordering::Less,
Control::Event(_) => Ordering::Less,
#[cfg(feature = "dialog")]
Control::Close(_) => Ordering::Less,
Control::Quit => Ordering::Less,
},
Control::Changed => match other {
Control::Continue => Ordering::Greater,
Control::Unchanged => Ordering::Greater,
Control::Changed => Ordering::Equal,
Control::Event(_) => Ordering::Less,
#[cfg(feature = "dialog")]
Control::Close(_) => Ordering::Less,
Control::Quit => Ordering::Less,
},
Control::Event(_) => match other {
Control::Continue => Ordering::Greater,
Control::Unchanged => Ordering::Greater,
Control::Changed => Ordering::Greater,
Control::Event(_) => Ordering::Equal,
#[cfg(feature = "dialog")]
Control::Close(_) => Ordering::Less,
Control::Quit => Ordering::Less,
},
#[cfg(feature = "dialog")]
Control::Close(_) => match other {
Control::Continue => Ordering::Greater,
Control::Unchanged => Ordering::Greater,
Control::Changed => Ordering::Greater,
Control::Event(_) => Ordering::Greater,
Control::Close(_) => Ordering::Equal,
Control::Quit => Ordering::Less,
},
Control::Quit => match other {
Control::Continue => Ordering::Greater,
Control::Unchanged => Ordering::Greater,
Control::Changed => Ordering::Greater,
Control::Event(_) => Ordering::Greater,
#[cfg(feature = "dialog")]
Control::Close(_) => Ordering::Greater,
Control::Quit => Ordering::Equal,
},
}
}
}
impl<Event> PartialOrd for Control<Event> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl<Event> ConsumedEvent for Control<Event> {
fn is_consumed(&self) -> bool {
!matches!(self, Control::Continue)
}
}
impl<Event, T: Into<Outcome>> From<T> for Control<Event> {
fn from(value: T) -> Self {
let r = value.into();
match r {
Outcome::Continue => Control::Continue,
Outcome::Unchanged => Control::Unchanged,
Outcome::Changed => Control::Changed,
}
}
}