35 lines
995 B
Rust
35 lines
995 B
Rust
use super::*;
|
|
|
|
pub trait MonadExt<'a>: Monad<'a> {
|
|
/// [`FnMut`] version of [`Monad::iterate`].
|
|
/// Reasoning for this method existing at all is that
|
|
/// most usecases are better modelled with [`FnMut`]
|
|
/// rather than some dedicated state type.
|
|
fn iterate_mut<A: 'a, B: 'a>(
|
|
a: A,
|
|
f: impl 'a + FnMut(A) -> Self::F<ControlFlow<B, A>>,
|
|
) -> Self::F<B> {
|
|
Self::iterate(BindableMut::new(a, f))
|
|
}
|
|
|
|
fn bind2<A: 'a, B: 'a, C: 'a>(
|
|
fa: Self::F<A>,
|
|
fb: Self::F<B>,
|
|
f: impl 'a + FnOnce(A, B) -> Self::F<C>,
|
|
) -> Self::F<C> {
|
|
Self::join(Self::la2(fa, fb, f))
|
|
}
|
|
}
|
|
|
|
pub trait MonadFailAnyExt<'a>: MonadFailAny<'a> {
|
|
fn pure<E: 'a, A: 'a>(a: A) -> WrapE<'a, A, E, Self> {
|
|
<Self::W<E> as Pure>::pure(a)
|
|
}
|
|
|
|
fn fail<E: 'a, A: 'a>(e: E) -> WrapE<'a, A, E, Self> {
|
|
<Self::W<E> as Fail<E>>::fail(e)
|
|
}
|
|
}
|
|
|
|
impl<'a, Fallible: ?Sized + MonadFailAny<'a>> MonadFailAnyExt<'a> for Fallible {}
|