use crate::{
Effect3Unbound, Effect4Unbound, Effect5Unbound, HKT4Unbound, HKT5Unbound, HKT6Unbound,
};
pub trait MonadEffect3Unbound<E: Effect3Unbound> {
fn pure<S, T>(value: T) -> <E::HktWitness as HKT4Unbound>::Type<E::Fixed1, S, S, T>;
fn ibind<S1, S2, S3, T, U, Func>(
effect: <E::HktWitness as HKT4Unbound>::Type<E::Fixed1, S1, S2, T>,
f: Func,
) -> <E::HktWitness as HKT4Unbound>::Type<E::Fixed1, S1, S3, U>
where
Func: FnMut(T) -> <E::HktWitness as HKT4Unbound>::Type<E::Fixed1, S2, S3, U>;
}
#[allow(clippy::type_complexity)]
pub trait MonadEffect4Unbound<E: Effect4Unbound> {
fn pure<S, T>(value: T) -> <E::HktWitness as HKT5Unbound>::Type<E::Fixed1, E::Fixed2, S, S, T>;
fn ibind<S1, S2, S3, T, U, Func>(
effect: <E::HktWitness as HKT5Unbound>::Type<E::Fixed1, E::Fixed2, S1, S2, T>,
f: Func,
) -> <E::HktWitness as HKT5Unbound>::Type<E::Fixed1, E::Fixed2, S1, S3, U>
where
Func: FnMut(T) -> <E::HktWitness as HKT5Unbound>::Type<E::Fixed1, E::Fixed2, S2, S3, U>;
}
#[allow(clippy::type_complexity)]
pub trait MonadEffect5Unbound<E: Effect5Unbound> {
fn pure<S, T>(
value: T,
) -> <E::HktWitness as HKT6Unbound>::Type<E::Fixed1, E::Fixed2, E::Fixed3, S, S, T>;
fn ibind<S1, S2, S3, T, U, Func>(
effect: <E::HktWitness as HKT6Unbound>::Type<E::Fixed1, E::Fixed2, E::Fixed3, S1, S2, T>,
f: Func,
) -> <E::HktWitness as HKT6Unbound>::Type<E::Fixed1, E::Fixed2, E::Fixed3, S1, S3, U>
where
Func: FnMut(
T,
) -> <E::HktWitness as HKT6Unbound>::Type<
E::Fixed1,
E::Fixed2,
E::Fixed3,
S2,
S3,
U,
>;
}