use core::marker::PhantomData;
use crate::invariant::Invariant;
pub fn lift_contravariant<FA, B>(
mut f: impl FnMut(B) -> FA::Param,
) -> impl FnMut(FA) -> FA::Target<B>
where
FA: Contravariant<B>,
{
move |fa: FA| fa.contramap(&mut f)
}
pub trait Contravariant<B>: Invariant<B> {
fn contramap(self, f: impl FnMut(B) -> Self::Param) -> Self::Target<B>;
}
impl<A, B> Contravariant<B> for PhantomData<A> {
#[inline]
fn contramap(self, _f: impl FnMut(B) -> Self::Param) -> PhantomData<B> {
PhantomData
}
}