1#![doc = include_str!("../README.md")]
2
3pub 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
22pub 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}