1use super::{associative_flatten::*, covariant::*, hkt::*};
2
3pub trait Monad<'a>: AssociativeFlatten<'a> + Covariant<'a> {
4 fn flat_map<A: 'a, B: 'a, F: FnMut(A) -> Self::Member<B> + 'a>(
5 fa: Self::Member<A>,
6 f: F,
7 ) -> Self::Member<B> {
8 Self::flatten(Self::map(fa, f))
9 }
10}
11impl<'a, T: AssociativeFlatten<'a> + Covariant<'a>> Monad<'a> for T {}
12
13pub trait MonadSyntax<'a, Mon: Monad<'a>>: Mirror<'a, Family = Mon> {
14 fn flat_map<B: 'a, F: FnMut(Self::T) -> Mon::Member<B> + 'a>(
15 self,
16 f: F,
17 ) -> Mon::Member<B> {
18 Mon::flat_map(self.as_member(), f)
19 }
20}
21impl<'a, F: Monad<'a>, T: Mirror<'a, Family = F>> MonadSyntax<'a, F> for T {}