aboutsummaryrefslogtreecommitdiff
path: root/tests/with_lifetimes.rs
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2023-03-18 22:05:20 +0100
committerAndreas Grois <andi@grois.info>2023-03-18 22:05:20 +0100
commitbb7719d6d050d7bf957f0df7a78e6c74b1c9615b (patch)
tree4fcfa39520793069357f0ec29d45f424347c3aa5 /tests/with_lifetimes.rs
parent7e739c74a68b1b5adfbcb93c01ef87365946dad0 (diff)
First few integration tests: trivial types
Diffstat (limited to 'tests/with_lifetimes.rs')
-rw-r--r--tests/with_lifetimes.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/with_lifetimes.rs b/tests/with_lifetimes.rs
new file mode 100644
index 0000000..2e87878
--- /dev/null
+++ b/tests/with_lifetimes.rs
@@ -0,0 +1,60 @@
+//! Test for the case that the Functor the Free Monad is based on has lifetime parameters that do not depend on the
+//! lifetime of the mapping function in the Functor implementation.
+
+use higher_free_macro::free;
+use higher::{Functor, Bind, Apply};
+
+#[derive(Functor, Clone)]
+struct WithLifetimes<'a,'b, A>{
+ s1 : &'a str,
+ s2 : &'b str,
+ next : A
+}
+
+free!(FreeWithLifetimes<'a,'b,A>, WithLifetimes<'a,'b,FreeWithLifetimes<'a,'b,A>>);
+
+fn lifetime_helper<'a,'b>(s1 : &'a str, s2 : &'b str) -> FreeWithLifetimes<'a, 'b, u32>{
+ let fv = FreeWithLifetimes::lift_f(WithLifetimes{ s1, s2, next: 15});
+ fv.fmap(|x| x+1)
+}
+
+#[test]
+fn test_with_lifetimes(){
+ let s1 = "First";
+ let s2 = "Second";
+ let fv = lifetime_helper(s1, s2);
+ let s3 = "Third";
+ let s4 = "Fourth";
+ let fv = fv.bind(|x| FreeWithLifetimes::lift_f(WithLifetimes{ s1: s3, s2: s4, next : x+2}));
+ let s5 = "Fifth";
+ let s6 = "Sixth";
+ let fa = FreeWithLifetimes::lift_f(WithLifetimes{s1: s5, s2: s6, next : (|x| x+3).into()});
+ let fv = fv.apply(fa);
+ match fv {
+ FreeWithLifetimes::Free(v) => {
+ assert_eq!(v.s1, s5);
+ assert_eq!(v.s2, s6);
+ match v.next {
+ FreeWithLifetimes::Free(v) => {
+ assert_eq!(v.s1, s1);
+ assert_eq!(v.s2, s2);
+ match v.next {
+ FreeWithLifetimes::Free(v) => {
+ assert_eq!(v.s1, s3);
+ assert_eq!(v.s2, s4);
+ match v.next {
+ FreeWithLifetimes::Free(_) => unreachable!(),
+ FreeWithLifetimes::Pure(a) => {
+ assert_eq!(a, 21);
+ },
+ }
+ },
+ FreeWithLifetimes::Pure(_) => unreachable!(),
+ }
+ },
+ FreeWithLifetimes::Pure(_) => unreachable!(),
+ }
+ },
+ FreeWithLifetimes::Pure(_) => unreachable!()
+ }
+} \ No newline at end of file