use std::cmp::Ordering;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum Effect {
Pure,
MayRead,
MayThrow,
MayWrite,
Unknown,
}
impl Effect {
pub fn is_pure(self) -> bool {
self == Effect::Pure
}
pub fn worst(self, other: Effect) -> Effect {
if self.rank() >= other.rank() {
self
} else {
other
}
}
fn rank(self) -> u8 {
match self {
Effect::Pure => 0,
Effect::MayRead => 1,
Effect::MayThrow => 2,
Effect::MayWrite => 3,
Effect::Unknown => 4,
}
}
}
impl PartialOrd for Effect {
fn partial_cmp(&self, other: &Effect) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Effect {
fn cmp(&self, other: &Effect) -> Ordering {
self.rank().cmp(&other.rank())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ordering() {
assert!(Effect::Pure < Effect::MayRead);
assert!(Effect::MayRead < Effect::MayThrow);
assert!(Effect::MayThrow < Effect::MayWrite);
assert!(Effect::MayWrite < Effect::Unknown);
assert_eq!(Effect::Pure.worst(Effect::MayThrow), Effect::MayThrow);
}
}