#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum Presence<T> {
#[default]
Absent,
Null,
Present(T),
}
impl<T> Presence<T> {
pub fn present(self) -> Option<T> {
match self {
Presence::Present(value) => Some(value),
_ => None,
}
}
pub fn is_given(&self) -> bool {
!matches!(self, Presence::Absent)
}
pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Presence<U> {
match self {
Presence::Absent => Presence::Absent,
Presence::Null => Presence::Null,
Presence::Present(value) => Presence::Present(f(value)),
}
}
}