diff options
| author | Andreas Grois <andi@grois.info> | 2023-03-28 21:55:26 +0200 |
|---|---|---|
| committer | Andreas Grois <andi@grois.info> | 2023-03-28 21:55:26 +0200 |
| commit | ea1814025f3bbab7a0aac640e69c56d983a18308 (patch) | |
| tree | 62dbdf29b7ea4bccbcbcad0abc9ea2974bade186 /tests | |
| parent | 334a080b7fa3da1670cf8ecd160e7bf0e12ae508 (diff) | |
Add integration test for trivial case with lifetime dependency
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/trivial_lifetime.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/trivial_lifetime.rs b/tests/trivial_lifetime.rs new file mode 100644 index 0000000..fe05234 --- /dev/null +++ b/tests/trivial_lifetime.rs @@ -0,0 +1,37 @@ +//! Tests if a trivial functor, which's lifetime depends on the mapping function, works. +use std::rc::Rc; +use higher::{Functor, Bind}; +use higher_free_macro::free; + +#[derive(Clone)] +struct TrivWithLifetime<'a,A,B>{ + next : Rc<dyn Fn(B)->A + 'a>, +} + +impl<'a,A : 'a,B : 'a> Functor<'a,A> for TrivWithLifetime<'a,A,B> { + type Target<T> = TrivWithLifetime<'a,T,B>; + + fn fmap<C, F>(self, f: F) -> Self::Target<C> + where + F: Fn(A) -> C + 'a { + TrivWithLifetime{ next : Rc::new(move |x| f((self.next)(x)))} + } +} + +free!(<'a>, FreeTriv<'a,A,B>, TrivWithLifetime<'a,FreeTriv<'a,A,B>,B>); + +#[test] +fn test_trivial_with_lifetime(){ + let f = FreeTriv::lift_f(TrivWithLifetime{next : Rc::new(|x : i32| x.abs() as u32)}); + let f = f.bind(|x| FreeTriv::Pure(x)); + match f { + FreeTriv::Free(f) => { + let n = (f.next)(-4); + match n { + FreeTriv::Pure(v) => assert_eq!(v,4u32), + FreeTriv::Free(_) => unreachable!(), + } + }, + _ => unreachable!() + } +}
\ No newline at end of file |
