#![allow(dead_code, unused)]
#[macro_use]
extern crate kinder;
use kinder::lift::*;
#[derive(Debug)] struct Holder<T> {
elem: T, }
lift!(Holder);
impl<A,B> Functor<A> for Holder<B> {
fn fmap<F>(&self, f: F) -> Holder<A>
where F: Fn(&B) -> A
{
Holder{ elem: f(&self.elem) } }
}
impl<A, B> Monad<A> for Holder<B> {
fn lift(x:A) -> <Self as Higher<A>>::C {
Holder { elem: x }
}
fn bind<F>(&self, mut f: F) -> Holder<A>
where F: FnMut(&B) -> Holder<A>
{
f(&self.elem) }
}
fn main() {
let test = Holder::lift(2);
println!("{:?}", test);
let mapped = test.fmap(|x| x+4);
println!("{:?}", mapped);
}