Skip to main content

or_else_map/
lib.rs

1#![doc = include_str!("../README.md")]
2
3/// `Option::map_or_else` but with the english words in "WYSIWYG" order
4pub trait OptionOrElseMap<T> {
5    fn or_else_map<U, D, F>(self, default: D, map: F) -> U
6    where
7        D: FnOnce() -> U,
8        F: FnOnce(T) -> U;
9}
10
11impl<T> OptionOrElseMap<T> for Option<T> {
12    #[inline]
13    fn or_else_map<U, D, F>(self, default: D, map: F) -> U
14    where
15        D: FnOnce() -> U,
16        F: FnOnce(T) -> U,
17    {
18        Self::map_or_else(self, default, map)
19    }
20}
21
22/// `Result::map_or_else` but with the english words in "WYSIWYG" order
23pub trait ResultOrElseMap<T, E> {
24    fn or_else_map<U, D, F>(self, default: D, map: F) -> U
25    where
26        D: FnOnce(E) -> U,
27        F: FnOnce(T) -> U;
28}
29
30impl<T, E> ResultOrElseMap<T, E> for Result<T, E> {
31    #[inline]
32    fn or_else_map<U, D, F>(self, default: D, map: F) -> U
33    where
34        D: FnOnce(E) -> U,
35        F: FnOnce(T) -> U,
36    {
37        Self::map_or_else(self, default, map)
38    }
39}
40
41pub mod prelude {
42    pub use super::{OptionOrElseMap, ResultOrElseMap};
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn result_or_else_map() {
51        let result: Result<i32, &str> = Ok(10);
52        let value = result.or_else_map(|_| 0, |x| x * 2);
53        assert_eq!(value, 20);
54
55        let result: Result<i32, &str> = Err("error");
56        let value = result.or_else_map(|_| 0, |x| x * 2);
57        assert_eq!(value, 0);
58    }
59
60    #[test]
61    fn option_or_else_map() {
62        let option: Option<i32> = Some(10);
63        let value = option.or_else_map(|| 0, |x| x * 2);
64        assert_eq!(value, 20);
65
66        let option: Option<i32> = None;
67        let value = option.or_else_map(|| 0, |x| x * 2);
68        assert_eq!(value, 0);
69    }
70}