ratz/
monad.rs

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 {}