use std::marker::PhantomData; #[doc(no_inline)] pub use std::ops::ControlFlow; use super::{weakfunctorany::WeakFunctorAny, Functor, Pure, WeakFunctor, Wrap}; pub(super) struct ControlFlowInstance(ControlFlow<(), C>); impl WeakFunctorAny for ControlFlowInstance { type FAny<'a, A: 'a> = ControlFlow where Self: 'a; } impl<'a, C: 'a> Functor<'a> for ControlFlowInstance { fn fmap(fa: Self::F, f: impl 'a + FnOnce(A) -> B) -> Self::F { match fa { ControlFlow::Continue(c) => ControlFlow::Continue(c), ControlFlow::Break(a) => ControlFlow::Break(f(a)), } } } impl<'a, C: 'a> Pure<'a> for ControlFlowInstance { fn pure(a: A) -> Self::F { ControlFlow::Break(a) } } pub struct BindableMut(A, F, PhantomData, PhantomData); impl<'a, T: ?Sized + Functor<'a>, A: 'a, B: 'a, F: 'a + FnMut(A) -> T::F>> BindableMut { pub fn new(a: A, f: F) -> Self { BindableMut(a, f, PhantomData, PhantomData) } } impl<'a, T: ?Sized + Functor<'a>, A: 'a, B: 'a, F: 'a + FnMut(A) -> T::F>> Iterative<'a> for BindableMut { type B = B; type T = T; fn next(mut self) -> IterativeWrapped<'a, Self> { let fstate = self.1(self.0); T::fmap(fstate, move |state| { ControlFlow::Continue(BindableMut::new(state?, self.1)) }) } } /// Next [Iterative] state, wrapped. pub type IterativeWrapped<'a, F> = Wrap<'a, ControlFlow<>::B, F>, >::T>; /// Value passed to [`Monad::iterate`]. /// /// [`Monad::iterate`]: super::Monad::iterate pub trait Iterative<'a>: 'a + Sized { /// [`ControlFlow::Break`]. type B: 'a; /// Corresponding [`WeakFunctor`]. type T: ?Sized + WeakFunctor<'a>; /// Get next state. fn next(self) -> IterativeWrapped<'a, Self>; }