pub trait AsGeneral<T>: Sized
where
T: TryAsSpecific<Self> + From<Self>,
{
fn as_general(self) -> T;
}
pub trait TryAsGeneral<T>: Sized
where
T: TryAsSpecific<Self>,
{
fn try_as_general(self) -> Option<T>;
}
pub trait AsSpecific<T>: Sized {
fn as_specific(self) -> T;
}
pub trait TryAsSpecific<T>: Sized {
fn try_as_specific(self) -> Option<T>;
}
impl<T, This> TryAsGeneral<T> for This
where
This: AsGeneral<T>,
T: TryAsSpecific<Self> + From<Self>,
{
fn try_as_general(self) -> Option<T> {
Some(self.as_general())
}
}
impl<T, This> TryAsSpecific<T> for This
where
This: AsSpecific<T>,
{
fn try_as_specific(self) -> Option<T> {
Some(self.as_specific())
}
}