aboutsummaryrefslogtreecommitdiff
path: root/tests/trivial.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/trivial.rs')
-rw-r--r--tests/trivial.rs39
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