#![deny(clippy::pedantic)]
#![deny(clippy::all)]
//! A trivial test functor. Not holding any data, so this is basically just a linked list of free-nodes.
use higher_free_macro::free;
use higher::{Functor, Bind, Apply};
#[derive(Functor, Clone)]
struct TrivialFunctor(A);
free!(TrivialFreeMonad, TrivialFunctor>);
#[test]
fn test_trivial_functor() {
let m = TrivialFreeMonad::lift_f(TrivialFunctor(37u32));
let m = m.fmap(|x| x*2);
let m = m.bind(|x| TrivialFreeMonad::Free(Box::new(TrivialFunctor(TrivialFreeMonad::Pure(x)))));
let f = TrivialFreeMonad::Pure((|x| x*3).into());
let m = m.apply(f);
match m {
TrivialFreeMonad::Free(b) => {
match *b {
TrivialFunctor(f) => {
match f {
TrivialFreeMonad::Free(b) => {
match *b {
TrivialFunctor(f) => {
match f{
TrivialFreeMonad::Pure(x) => assert_eq!(x, 37*6),
TrivialFreeMonad::Free(_) => unreachable!()
}
}
}
},
TrivialFreeMonad::Pure(_) => unreachable!()
}
}
}
}
TrivialFreeMonad::Pure(_) => unreachable!()
}
}