use crate::prelude::Monad;
use super::def::Cont;
impl<'a, R, A> Monad<'a, A> for Cont<'a, R, A>
where
R: 'a,
A: 'a,
{
fn bind<F, B>(self, f: F) -> Self::Type<B>
where
F: Fn(A) -> Self::Type<B> + 'a,
B: 'a,
{
let brr = move |br: Box<dyn FnOnce(B) -> R + 'a>| -> R {
let ar = Box::new(move |a: A| -> R {
let abrr = move |a: A| -> Self::Type<B> { f(a) };
let brr = abrr(a).run_cont;
brr(br)
});
let arr = self.run_cont;
arr(ar)
};
Self::Type::<B> {
run_cont: Box::new(brr),
}
}
}