#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Unique<T> {
None,
One(T),
Ambiguous(T, T),
}
impl<T> Unique<T> {
pub fn unique(&self) -> Option<&T> {
if let Unique::One(s) = self {
Some(s)
} else {
None
}
}
pub fn is_unique(&self) -> bool {
matches!(self, Unique::One(_))
}
pub fn is_ambiguous(&self) -> bool {
matches!(self, Unique::Ambiguous(_, _))
}
pub fn map<U>(self, f: impl Fn(T) -> U) -> Unique<U> {
match self {
Unique::None => Unique::None,
Unique::One(s) => Unique::One(f(s)),
Unique::Ambiguous(s1, s2) => Unique::Ambiguous(f(s1), f(s2)),
}
}
}