lubeck 0.0.0-prealpha.5-abandoned

Functional programming framework written in cutting edge rust
Documentation
use crate::traits::Applicative;

use super::def::Reader;

impl<'a, R, A> Applicative<'a, A> for Reader<'a, R, A>
where
    R: Clone + 'a,
    A: 'a,
{
    type PureT<T> = T where T: 'a;

    fn pure(env: Self::PureT<A>) -> Self::Type<Self::PureT<A>> {
        Reader::<R, Self::PureT<A>>::new(move |_| env)
    }

    fn app<F, B>(self, reader_f: Self::Type<F>) -> Self::Type<B>
    where
        F: Fn(A) -> B + 'a,
    {
        Reader::<R, B>::new(move |r| {
            // R -> A
            let a = self.run(r.clone());
            // R -> (A -> B)
            let f = reader_f.run(r);
            // A -> B
            f(a)
        })
    }
}