pub trait SubsetOf<T>: Sized {
fn to_superset(&self) -> T;
fn is_in_subset(element: &T) -> bool {
let _ = element;
true
}
fn from_superset(element: &T) -> Option<Self> {
if Self::is_in_subset(element) {
Some(Self::from_superset_unchecked(element))
} else {
None
}
}
fn from_superset_unchecked(element: &T) -> Self;
}
pub trait SupersetOf<T>: Sized {
fn to_subset(&self) -> Option<T>;
fn from_subset(element: &T) -> Self;
fn is_in_subset(&self) -> bool;
}
impl<SS, SP> SupersetOf<SS> for SP
where
SS: SubsetOf<SP>,
{
fn to_subset(&self) -> Option<SS> {
SS::from_superset(self)
}
fn from_subset(element: &SS) -> Self {
element.to_superset()
}
fn is_in_subset(&self) -> bool {
SS::is_in_subset(self)
}
}