lubeck 0.0.0-prealpha.5-abandoned

Functional programming framework written in cutting edge rust
Documentation
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,
    {
        // (B -> R) -> R
        let brr = move |br: Box<dyn FnOnce(B) -> R + 'a>| -> R {
            // A -> R
            let ar = Box::new(move |a: A| -> R {
                // A -> ((B -> R) -> R)
                let abrr = move |a: A| -> Self::Type<B> { f(a) };

                // (B -> R) -> R
                let brr = abrr(a).run_cont;
                // R
                brr(br)
            });
            // (A -> R) -> R
            let arr = self.run_cont;
            // R
            arr(ar)
        };
        Self::Type::<B> {
            run_cont: Box::new(brr),
        }
    }
}