#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Clone, Copy)]
pub enum OneOff<T> {
Left(T),
Right(T),
}
impl<T> OneOff<T> {
pub fn left(self) -> Option<T> {
match self {
OneOff::Left(t) => Some(t),
_ => None,
}
}
pub fn right(self) -> Option<T> {
match self {
OneOff::Right(t) => Some(t),
_ => None,
}
}
pub fn is_left(&self) -> bool {
matches!(self, OneOff::Left(_))
}
pub fn is_right(&self) -> bool {
matches!(self, OneOff::Right(_))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_oneoff() {
let left = OneOff::Left(1);
let right = OneOff::Right(2);
assert_eq!(left, OneOff::Left(1));
assert_eq!(right, OneOff::Right(2));
assert_eq!(left.cmp(&right), std::cmp::Ordering::Less);
assert_eq!(right.cmp(&left), std::cmp::Ordering::Greater);
}
}