#![no_std]
use core::fmt;
pub use XOR::*;
#[derive(Debug)]
#[derive(Clone)]
#[derive(PartialEq)]
#[derive(Eq)]
pub enum XOR<This, That> {
This(This),
That(That)
}
impl<This, That> XOR<This, That> {
pub fn is_this(&self) -> bool {
matches!(self, This(_))
}
pub fn is_that(&self) -> bool {
matches!(self, That(_))
}
pub fn this(self) -> Option<This> {
if let This(data) = self {
return Some(data)
}
None
}
pub fn that(self) -> Option<That> {
if let That(data) = self {
return Some(data)
}
None
}
pub fn map_this<Hook, NewThis>(&self, hook: Hook) -> XOR<NewThis, That>
where
Hook: FnOnce(&This) -> NewThis,
That: Clone {
match self {
This(data) => This(hook(data)),
That(data) => {
let data: That = data.clone();
That(data)
}
}
}
pub fn map_that<Hook, NewThat>(&self, hook: Hook) -> XOR<This, NewThat>
where
Hook: FnOnce(&That) -> NewThat,
This: Clone {
match self {
This(data) => {
let data: This = data.clone();
This(data)
},
That(data) => That(hook(data))
}
}
pub fn as_ref(&self) -> XOR<&This, &That> {
match self {
This(data) => This(data),
That(data) => That(data)
}
}
pub fn unwrap_this(self) -> This {
if let This(data) = self {
return data
}
panic!("Tried to unwrap `This` variant, but it was `That`.")
}
pub fn unwrap_that(self) -> That {
if let That(data) = self {
return data
}
panic!("Tried to unwrap `That` variant, but it was `This`.")
}
}
impl<This: fmt::Display, That: fmt::Display> fmt::Display for XOR<This, That> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
This(data) => write!(f, "This({})", data),
That(data) => write!(f, "That({})", data)
}
}
}