use crate::{HKT2Unbound, Satisfies};
pub trait Profunctor<P: HKT2Unbound> {
fn dimap<A, B, C, D, F1, F2>(pab: P::Type<A, B>, f_pre: F1, f_post: F2) -> P::Type<C, D>
where
A: 'static + Satisfies<P::Constraint>,
B: 'static + Satisfies<P::Constraint>,
C: 'static + Satisfies<P::Constraint>,
D: 'static + Satisfies<P::Constraint>,
F1: FnMut(C) -> A + 'static,
F2: FnMut(B) -> D + 'static;
fn lmap<A, B, C, F1>(pab: P::Type<A, B>, f_pre: F1) -> P::Type<C, B>
where
A: 'static + Satisfies<P::Constraint>,
B: 'static + Satisfies<P::Constraint> + Clone,
C: 'static + Satisfies<P::Constraint>,
F1: FnMut(C) -> A + 'static,
{
Self::dimap(pab, f_pre, |b| b)
}
fn rmap<A, B, D, F2>(pab: P::Type<A, B>, f_post: F2) -> P::Type<A, D>
where
A: 'static + Satisfies<P::Constraint> + Clone,
B: 'static + Satisfies<P::Constraint>,
D: 'static + Satisfies<P::Constraint>,
F2: FnMut(B) -> D + 'static,
{
Self::dimap(pab, |a| a, f_post)
}
}