65 lines
1.8 KiB
Rust
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));
|
|
}
|
|
}
|