radn-rs/src/xrcs.rs
2023-03-12 10:43:58 +00:00

65 lines
1.8 KiB
Rust

/// 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<T, F: FnOnce(T) -> Option<T>>(f: F, fa: Option<T>) -> Option<T> {
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));
}
}