diff options
| author | Andreas Grois <andi@grois.info> | 2023-03-18 22:05:20 +0100 |
|---|---|---|
| committer | Andreas Grois <andi@grois.info> | 2023-03-18 22:05:20 +0100 |
| commit | bb7719d6d050d7bf957f0df7a78e6c74b1c9615b (patch) | |
| tree | 4fcfa39520793069357f0ec29d45f424347c3aa5 /tests/trivial.rs | |
| parent | 7e739c74a68b1b5adfbcb93c01ef87365946dad0 (diff) | |
First few integration tests: trivial types
Diffstat (limited to 'tests/trivial.rs')
| -rw-r--r-- | tests/trivial.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/trivial.rs b/tests/trivial.rs new file mode 100644 index 0000000..5468fe4 --- /dev/null +++ b/tests/trivial.rs @@ -0,0 +1,39 @@ +//! 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), + _ => unreachable!() + } + } + } + }, + _ => unreachable!() + } + } + } + } + _ => unreachable!() + } +}
\ No newline at end of file |
