pub struct Undefined;
pub trait Maybe<T> {
fn maybe_or(self, or: impl FnOnce() -> T) -> T;
}
impl<T> Maybe<T> for T
where
T: Default,
{
fn maybe_or(self, _: impl FnOnce() -> T) -> T {
self
}
}
impl<T> Maybe<T> for Option<T> {
fn maybe_or(self, or: impl FnOnce() -> T) -> T {
self.unwrap_or_else(or)
}
}
impl<T> Maybe<Option<T>> for T
where
T: Default,
{
fn maybe_or(self, _: impl FnOnce() -> Option<T>) -> Option<T> {
Some(self)
}
}
impl<T> Maybe<T> for Undefined {
fn maybe_or(self, or: impl FnOnce() -> T) -> T {
or()
}
}