lisbeth_tuple_tools/
map.rs

1macro_rules! declare_map_n {
2    (
3        #[doc = $ordinal:literal]
4        $name:ident::$fn_name:ident
5    ) => {
6        #[doc = "Allows to map the "]
7        #[doc = $ordinal]
8        #[doc = " element of a tuple to another type."]
9        pub trait $name<T, U> {
10            type Output;
11            fn $fn_name<Func>(self, f: Func) -> Self::Output
12            where
13                Func: FnOnce(T) -> U;
14        }
15    };
16}
17
18declare_map_n! {
19    /// first
20    TupleMap1::map_1
21}
22declare_map_n! {
23    /// second
24    TupleMap2::map_2
25}
26declare_map_n! {
27    /// third
28    TupleMap3::map_3
29}
30declare_map_n! {
31    /// fourth
32    TupleMap4::map_4
33}
34declare_map_n! {
35    /// difth
36    TupleMap5::map_5
37}
38declare_map_n! {
39    /// sixth
40    TupleMap6::map_6
41}
42declare_map_n! {
43    /// seventh
44    TupleMap7::map_7
45}
46declare_map_n! {
47    /// eighth
48    TupleMap8::map_8
49}
50
51macro_rules! impl_map_n {
52    (
53        $trait:ident::$fn:ident for ( $( $before:ident, )* _ $( , $after:ident )* $(,)? ) $(,)?
54    ) => {
55        impl<$( $before, )* $( $after, )* T, U> $trait<T, U> for ( $( $before, )* T, $( $after, )* ) {
56            type Output = ( $( $before, )* U, $( $after, )* );
57
58            #[allow(non_snake_case)]
59            fn $fn<Func>(self, f: Func) -> Self::Output
60            where
61                Func: FnOnce(T) -> U,
62            {
63                let ( $( $before, )* t, $( $after, )* ) = self;
64                let u = f(t);
65                ( $( $before, )* u, $( $after, )* )
66            }
67        }
68    };
69}
70
71impl_map_n! { TupleMap1::map_1 for (_,) }
72impl_map_n! { TupleMap1::map_1 for (_, B) }
73impl_map_n! { TupleMap1::map_1 for (_, B, C) }
74impl_map_n! { TupleMap1::map_1 for (_, B, C, D) }
75impl_map_n! { TupleMap1::map_1 for (_, B, C, D, E) }
76impl_map_n! { TupleMap1::map_1 for (_, B, C, D, E, F) }
77impl_map_n! { TupleMap1::map_1 for (_, B, C, D, E, F, G) }
78impl_map_n! { TupleMap1::map_1 for (_, B, C, D, E, F, G, H) }
79
80impl_map_n! { TupleMap2::map_2 for (A, _) }
81impl_map_n! { TupleMap2::map_2 for (A, _, C) }
82impl_map_n! { TupleMap2::map_2 for (A, _, C, D) }
83impl_map_n! { TupleMap2::map_2 for (A, _, C, D, E) }
84impl_map_n! { TupleMap2::map_2 for (A, _, C, D, E, F) }
85impl_map_n! { TupleMap2::map_2 for (A, _, C, D, E, F, G) }
86impl_map_n! { TupleMap2::map_2 for (A, _, C, D, E, F, G, H) }
87
88impl_map_n! { TupleMap3::map_3 for (A, B, _) }
89impl_map_n! { TupleMap3::map_3 for (A, B, _, D) }
90impl_map_n! { TupleMap3::map_3 for (A, B, _, D, E) }
91impl_map_n! { TupleMap3::map_3 for (A, B, _, D, E, F) }
92impl_map_n! { TupleMap3::map_3 for (A, B, _, D, E, F, G) }
93impl_map_n! { TupleMap3::map_3 for (A, B, _, D, E, F, G, H) }
94
95impl_map_n! { TupleMap4::map_4 for (A, B, C, _) }
96impl_map_n! { TupleMap4::map_4 for (A, B, C, _, E) }
97impl_map_n! { TupleMap4::map_4 for (A, B, C, _, E, F) }
98impl_map_n! { TupleMap4::map_4 for (A, B, C, _, E, F, G) }
99impl_map_n! { TupleMap4::map_4 for (A, B, C, _, E, F, G, H) }
100
101impl_map_n! { TupleMap5::map_5 for (A, B, C, D, _) }
102impl_map_n! { TupleMap5::map_5 for (A, B, C, D, _, F) }
103impl_map_n! { TupleMap5::map_5 for (A, B, C, D, _, F, G) }
104impl_map_n! { TupleMap5::map_5 for (A, B, C, D, _, F, G, H) }
105
106impl_map_n! { TupleMap6::map_6 for (A, B, C, D, E, _) }
107impl_map_n! { TupleMap6::map_6 for (A, B, C, D, E, _, G) }
108impl_map_n! { TupleMap6::map_6 for (A, B, C, D, E, _, G, H) }
109
110impl_map_n! { TupleMap7::map_7 for (A, B, C, D, E, F, _) }
111impl_map_n! { TupleMap7::map_7 for (A, B, C, D, E, F, _, H) }
112
113impl_map_n! { TupleMap8::map_8 for (A, B, C, D, E, F, G, _) }