use crate::{Effect3, Effect4, Effect5, Functor, HKT3, HKT4, HKT5};
pub trait MonadEffect3<E: Effect3>
where
E::HktWitness: Functor<E::HktWitness> + Sized,
{
fn pure<T>(value: T) -> <E::HktWitness as HKT3<E::Fixed1, E::Fixed2>>::Type<T>;
fn bind<T, U, Func>(
effect: <E::HktWitness as HKT3<E::Fixed1, E::Fixed2>>::Type<T>,
f: Func,
) -> <E::HktWitness as HKT3<E::Fixed1, E::Fixed2>>::Type<U>
where
Func: FnMut(T) -> <E::HktWitness as HKT3<E::Fixed1, E::Fixed2>>::Type<U>,
U: Default;
}
pub trait MonadEffect4<E: Effect4>
where
E::HktWitness: Functor<E::HktWitness> + Sized,
{
fn pure<T>(value: T) -> <E::HktWitness as HKT4<E::Fixed1, E::Fixed2, E::Fixed3>>::Type<T>;
fn bind<T, U, Func>(
effect: <E::HktWitness as HKT4<E::Fixed1, E::Fixed2, E::Fixed3>>::Type<T>,
f: Func,
) -> <E::HktWitness as HKT4<E::Fixed1, E::Fixed2, E::Fixed3>>::Type<U>
where
Func: FnMut(T) -> <E::HktWitness as HKT4<E::Fixed1, E::Fixed2, E::Fixed3>>::Type<U>,
U: Default;
}
pub trait MonadEffect5<E: Effect5>
where
E::HktWitness: Functor<E::HktWitness> + Sized,
{
#[allow(clippy::type_complexity)]
fn pure<T>(
value: T,
) -> <E::HktWitness as HKT5<E::Fixed1, E::Fixed2, E::Fixed3, E::Fixed4>>::Type<T>;
#[allow(clippy::type_complexity)]
fn bind<T, U, Func>(
effect: <E::HktWitness as HKT5<E::Fixed1, E::Fixed2, E::Fixed3, E::Fixed4>>::Type<T>,
f: Func,
) -> <E::HktWitness as HKT5<E::Fixed1, E::Fixed2, E::Fixed3, E::Fixed4>>::Type<U>
where
Func: FnMut(
T,
)
-> <E::HktWitness as HKT5<E::Fixed1, E::Fixed2, E::Fixed3, E::Fixed4>>::Type<U>,
U: Default;
}