use crate::error::EngineError;
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum Meaning {
Plain,
Delta,
Time,
}
impl Meaning {
pub fn combine(
self,
other: Meaning,
plain: fn(Meaning) -> Result<Meaning, EngineError>,
delta: fn(Meaning) -> Result<Meaning, EngineError>,
time: fn(Meaning) -> Result<Meaning, EngineError>,
) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => plain(other),
Meaning::Delta => delta(other),
Meaning::Time => time(other),
}
}
pub fn pdt(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Ok(Meaning::Plain),
Meaning::Delta => Ok(Meaning::Delta),
Meaning::Time => Ok(Meaning::Time),
}
}
pub fn pdx(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Ok(Meaning::Plain),
Meaning::Delta => Ok(Meaning::Delta),
Meaning::Time => Err(EngineError::BadTimeOp),
}
}
pub fn pxx(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Ok(Meaning::Plain),
Meaning::Delta => Err(EngineError::BadTimeOp),
Meaning::Time => Err(EngineError::BadTimeOp),
}
}
pub fn ddt(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Ok(Meaning::Delta),
Meaning::Delta => Ok(Meaning::Delta),
Meaning::Time => Ok(Meaning::Time),
}
}
pub fn ddx(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Ok(Meaning::Delta),
Meaning::Delta => Ok(Meaning::Delta),
Meaning::Time => Err(EngineError::BadTimeOp),
}
}
pub fn dxx(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Ok(Meaning::Delta),
Meaning::Delta => Err(EngineError::BadTimeOp),
Meaning::Time => Err(EngineError::BadTimeOp),
}
}
pub fn ttd(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Ok(Meaning::Time),
Meaning::Delta => Ok(Meaning::Time),
Meaning::Time => Ok(Meaning::Delta),
}
}
pub fn ttx(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Ok(Meaning::Time),
Meaning::Delta => Ok(Meaning::Time),
Meaning::Time => Err(EngineError::BadTimeOp),
}
}
pub fn xxx(self) -> Result<Meaning, EngineError> {
match self {
Meaning::Plain => Err(EngineError::BadTimeOp),
Meaning::Delta => Err(EngineError::BadTimeOp),
Meaning::Time => Err(EngineError::BadTimeOp),
}
}
}