#[derive(Clone, Copy, PartialEq, Eq)]
pub enum Truth {
True,
False,
Unknown
}
impl Truth {
pub fn not(&self) -> Self {
match self {
Self::True => Self::False,
Self::False => Self::True,
Self::Unknown => Self::Unknown
}
}
pub fn and(&self, b: Self) -> Self {
match (self, b) {
(Self::False, _) | (_, Self::False) => Self::False,
(Self::Unknown, _) | (_, Self::Unknown) => Self::Unknown,
(Self::True, Self::True) => Self::True,
}
}
pub fn or(&self, b: Self) -> Self {
match (self, b) {
(Self::True, _) | (_, Self::True) => Self::True,
(Self::Unknown, _) | (_, Self::Unknown) => Self::Unknown,
(Self::False, Self::False) => Self::False,
}
}
}
use std::fmt;
impl fmt::Display for Truth {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::True => write!(f, "True"),
Self::False => write!(f, "False"),
Self::Unknown => write!(f, "Unknown"),
}
}
}
impl fmt::Debug for Truth {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Truth({})", self)
}
}