keepops/
lib.rs

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}