/// Solutions to some exercises by Alisa Feistel. /// Included here for their relevance to the whole Monad theme. /// Also, Alisa is too lazy to put them in a separate project for now. #[cfg(test)] mod tests { fn bind Option>(f: F, fa: Option) -> Option { match fa { Some(a) => f(a), None => None, } } #[test] fn test() { assert_eq!(bind(|x: i32| Some(x + 3), Some(2)), Some(5)); assert_eq!(bind(|x: i32| Some(x + 3), None), None); assert_eq!(bind(|_: i32| None, Some(2)), None); assert_eq!(bind(|_: i32| None, None), None); assert_eq!(bind(|x: &str| Some(x), Some("apple")), Some("apple")); assert_eq!( bind(|_: &str| Some("banana"), Some("apple")), Some("banana") ); let banana = "banana".to_string(); assert_eq!( bind(|_: &str| Some(banana.as_str()), Some("apple")), Some("banana") ); let banana = "banana".to_string(); assert_eq!( bind(|_: String| Some(banana), Some("apple".to_string())), Some("banana".to_string()) ); } } #[cfg(test)] mod reftests { fn refbind<'a, 'b, T: 'a + ?Sized, F: 'a + Fn(&'a T) -> Option<&'b T>>( f: F, fa: Option<&'a T>, ) -> Option<&'b T> { match fa { Some(a) => f(a), None => None, } } #[test] fn test() { let apple = "apple".to_string(); let banana = "banana".to_string(); assert_eq!( refbind(|_: &String| Some(&banana), Some(&apple)), Some(&banana) ); let banana = "banana"; assert_eq!(refbind(|_: &str| Some(banana), Some("apple")), Some(banana)); } }