23 lines
677 B
Rust
23 lines
677 B
Rust
use super::{controlflow::BindableMut, *};
|
|
|
|
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))
|
|
}
|
|
}
|