aboutsummaryrefslogtreecommitdiff
path: root/tests/trivial.rs
blob: 5bc1e913acc514a7b2ac3c733127c23c32aa5c62 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#![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>(A);

free!(TrivialFreeMonad<A>, TrivialFunctor<TrivialFreeMonad<A>>);

#[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!()
    }
}