radn-rs/src/func/extensions.rs

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