#![no_std]
pub trait Intoage<T, X>: Sized {
#[must_use]
fn intoage(self) -> T;
}
pub trait Fromage<T, X>: Sized {
#[must_use]
fn fromage(value: T) -> Self;
}
pub trait TryIntoage<T, X>: Sized {
type Error;
fn try_intoage(self) -> Result<T, Self::Error>;
}
pub trait TryFromage<T, X>: Sized {
type Error;
fn try_fromage(value: T) -> Result<Self, Self::Error>;
}
impl<T, U, X> Intoage<U, X> for T
where
U: Fromage<T, X>,
{
#[inline]
#[track_caller]
fn intoage(self) -> U {
U::fromage(self)
}
}
impl<T> Fromage<T, ()> for T {
#[inline(always)]
fn fromage(t: T) -> T {
t
}
}
impl<T, U, X> TryIntoage<U, X> for T
where
U: TryFromage<T, X>,
{
type Error = U::Error;
#[inline]
fn try_intoage(self) -> Result<U, U::Error> {
U::try_fromage(self)
}
}
impl<T, U> TryFromage<U, ()> for T
where
U: Intoage<T, ()>,
{
type Error = core::convert::Infallible;
#[inline]
fn try_fromage(value: U) -> Result<Self, Self::Error> {
Ok(U::intoage(value))
}
}