bind
Make this compile and pass tests:
#![allow(unused)] fn main() { mod __ { fn bind<T, F: Fn(T) -> Option<T>>(f: F, fa: Option<T>) -> Option<T> { match fa { Some(a) => f(a), None => None, } } } fn bind<T, F: FnOnce(T) -> Option<T>>(f: F, fa: Option<T>) -> Option<T> { fa.and_then(f) } // don't change anything below 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(|_: String| Some(banana), Some("apple".to_string())), Some("banana".to_string()), ); }
Try solving it in the playground:
fn bind<T, F: Fn(T) -> Option<T>>(f: F, fa: Option<T>) -> Option<T> { match fa { Some(a) => f(a), None => None, } } fn main() { 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(|_: String| Some(banana), Some("apple".to_string())), Some("banana".to_string()), ); }