use crate::{
Effect3Unbound, Effect4Unbound, Effect5Unbound, HKT4Unbound, HKT5Unbound, HKT6Unbound,
Satisfies,
};
pub trait MonadEffect3Unbound<E: Effect3Unbound> {
fn pure<S, T>(value: T) -> <E::HktWitness as HKT4Unbound>::Type<E::Fixed1, S, S, T>
where
S: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>,
T: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>,
E::Fixed1: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>;
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
S1: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>,
S2: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>,
S3: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>,
T: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>,
U: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>,
E::Fixed1: Satisfies<<E::HktWitness as HKT4Unbound>::Constraint>,
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>
where
S: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
T: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
E::Fixed1: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
E::Fixed2: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>;
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
S1: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
S2: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
S3: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
T: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
U: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
E::Fixed1: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
E::Fixed2: Satisfies<<E::HktWitness as HKT5Unbound>::Constraint>,
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>
where
S: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
T: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
E::Fixed1: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
E::Fixed2: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
E::Fixed3: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>;
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
S1: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
S2: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
S3: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
T: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
U: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
E::Fixed1: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
E::Fixed2: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
E::Fixed3: Satisfies<<E::HktWitness as HKT6Unbound>::Constraint>,
Func: FnMut(
T,
) -> <E::HktWitness as HKT6Unbound>::Type<
E::Fixed1,
E::Fixed2,
E::Fixed3,
S2,
S3,
U,
>;
}