use crate::{Adjunction, HKT, Satisfies};
pub trait AliasAdjunction<L, R, Context>: Adjunction<L, R, Context>
where
L: HKT,
R: HKT,
{
#[inline]
fn integrate<A, B, Func>(ctx: &Context, a: A, f: Func) -> R::Type<B>
where
A: Satisfies<L::Constraint> + Satisfies<R::Constraint> + Clone,
B: Satisfies<R::Constraint>,
L::Type<A>: Satisfies<R::Constraint>,
Func: Fn(L::Type<A>) -> B,
{
Self::left_adjunct(ctx, a, f)
}
#[inline]
fn differentiate<A, B, Func>(ctx: &Context, la: L::Type<A>, f: Func) -> B
where
A: Satisfies<L::Constraint> + Clone,
B: Satisfies<L::Constraint> + Satisfies<R::Constraint> + Clone,
R::Type<B>: Satisfies<L::Constraint>,
Func: FnMut(A) -> R::Type<B>,
{
Self::right_adjunct(ctx, la, f)
}
}
impl<T, L, R, Context> AliasAdjunction<L, R, Context> for T
where
T: Adjunction<L, R, Context>,
L: HKT,
R: HKT,
{
}