1mod keep_and_then_single;
2mod keep_and_then_tuple;
3mod keep_map_single;
4mod keep_map_single_iterator;
5mod keep_map_tuple;
6mod keep_map_tuple_iterator;
7mod tuple_family;
8
9pub mod prelude {
10 pub use super::keep_and_then_single::*;
11 pub use super::keep_and_then_tuple::*;
12 pub use super::keep_map_single::*;
13 pub use super::keep_map_single_iterator::*;
14 pub use super::keep_map_tuple::*;
15 pub use super::keep_map_tuple_iterator::*;
16}
17
18#[cfg(test)]
19mod tests {
20 use crate::prelude::*;
21 #[derive(Debug)]
22 struct WeirdStruct;
23
24 #[test]
25 fn iterator_compiles() {
26 let x = Some(1).iter().keep_map(|&x| x + 1);
27
28 let z = x
29 .map(|x| (x, 2))
30 .keep_tuple_map(|&(a, b)| a.0 + b)
31 .keep_map(|&(a, b, c)| a.0 + b + c)
32 .next();
33 println!("{z:?}");
34
35 let z = Some(WeirdStruct).iter().keep_map(|_| 1).next();
36 println!("{z:?}");
37 }
38
39 #[test]
40 fn map_compiles() {
41 let x = Some(1);
42
43 let z = x
44 .map(|x| (x, 2))
45 .keep_tuple_map(|&(a, b)| a + b)
46 .keep_map(|&(a, b, c)| a + b + c);
47 println!("{z:?}");
48
49 let z = Some(WeirdStruct).keep_map(|_| 1);
50 println!("{z:?}");
51 }
52
53 #[test]
54 fn and_then_compiles() {
55 let x = Some(1);
56
57 let z = x
58 .map(|x| (x, 2))
59 .keep_tuple_and_then(|&(a, b)| "4".parse::<usize>().ok().map(|c| a + b + c))
60 .keep_and_then(|&(a, b, c)| Some(a + b + c));
61 println!("{z:?}");
62
63 let z = Some(WeirdStruct).keep_and_then(|_| Some(()));
64 println!("{z:?}");
65 }
66
67 #[test]
68 fn example_from_readme_because_i_not_sure_if_it_works_lol() {
69 #[derive(Debug)]
70 pub struct Apple;
71 #[derive(Debug)]
72 pub struct Banana;
73 #[derive(Debug)]
74 pub struct Chocolate;
75 #[derive(Debug)]
76 pub struct AppleBananaChocolateCakeRecipe;
77 #[derive(Debug)]
78 pub struct AppleBananaChocolateCake;
79
80 fn try_gather_fruits() -> Option<(Apple, Banana)> {
81 Some((Apple, Banana))
82 }
83 fn get_some_chocolate_and_hold_onto(_apple: &Apple, _banana: &Banana) -> Chocolate {
84 Chocolate
85 }
86 fn search_for_recipe_in_book_shelf_while_carrying(
87 _apple: &Apple,
88 _banana: &Banana,
89 _chocolate: &Chocolate,
90 ) -> Option<AppleBananaChocolateCakeRecipe> {
91 Some(AppleBananaChocolateCakeRecipe)
92 }
93 fn bake_cake(
94 _apple: Apple,
95 _banana: Banana,
96 _chocolate: Chocolate,
97 _recipe: &AppleBananaChocolateCakeRecipe,
98 ) -> AppleBananaChocolateCake {
99 AppleBananaChocolateCake
100 }
101
102 let _bad_cake = try_gather_fruits()
103 .map(|(apple, banana)| {
104 let chocolate = get_some_chocolate_and_hold_onto(&apple, &banana);
105 (apple, banana, chocolate)
106 })
107 .and_then(|(apple, banana, chocolate)| {
108 search_for_recipe_in_book_shelf_while_carrying(&apple, &banana, &chocolate)
109 .map(|recipe| (apple, banana, chocolate, recipe))
110 })
111 .map(|(apple, banana, chocolate, recipe)| bake_cake(apple, banana, chocolate, &recipe));
112
113 let _super_yummy_cake = try_gather_fruits()
114 .keep_tuple_map(|(apple, banana)| get_some_chocolate_and_hold_onto(apple, banana))
115 .keep_tuple_and_then(|(apple, banana, chocolate)| {
116 search_for_recipe_in_book_shelf_while_carrying(apple, banana, chocolate)
117 })
118 .map(|(apple, banana, chocolate, recipe)| bake_cake(apple, banana, chocolate, &recipe));
119 }
120}