tuples/
lib.rs

1#![no_std]
2#![allow(unused_imports)]
3
4#[cfg(feature = "tuple_meta")]
5mod meta {
6    /// Tuple meta
7    pub trait Tuple {
8        /// Get arity of the tuple
9        fn arity(&self) -> usize;
10    }
11
12    impl Tuple for () {
13        fn arity(&self) -> usize {
14            0
15        }
16    }
17
18    impl<T> Tuple for (T,) {
19        fn arity(&self) -> usize {
20            1
21        }
22    }
23
24    /// Tuple meta
25    pub trait TupleV2: Tuple {
26        /// Get arity of the tuple
27        const ARITY: usize;
28
29        type Item<const N: usize>
30        where
31            Self: crate::TupleItemN<N>;
32    }
33
34    impl TupleV2 for () {
35        const ARITY: usize = 0;
36
37        type Item<const N: usize>
38            = <Self as crate::TupleItemN<N>>::ItemN
39        where
40            Self: crate::TupleItemN<N>;
41    }
42
43    impl<T> TupleV2 for (T,) {
44        const ARITY: usize = 1;
45
46        type Item<const N: usize>
47            = <Self as crate::TupleItemN<N>>::ItemN
48        where
49            Self: crate::TupleItemN<N>;
50    }
51
52    /// Mark traits for all tuples with all item is same type
53    pub trait TupleSame<T>: Tuple {}
54
55    impl<T> TupleSame<T> for () {}
56    impl<T> TupleSame<T> for (T,) {}
57
58    /// Mark traits for all tuples with all item is same type
59    pub trait TupleSameV2<T>: TupleV2 + TupleSame<T> {}
60
61    impl<T> TupleSameV2<T> for () {}
62    impl<T> TupleSameV2<T> for (T,) {}
63
64    include!("./gen/tuple_impl.rs");
65
66    #[cfg(test)]
67    mod tests {
68        use crate::*;
69
70        #[test]
71        fn test0() {
72            let a = (1, 2.0, '3', "4", true);
73            assert_eq!(a.arity(), 5);
74        }
75
76        #[test]
77        fn test1() {
78            assert_eq!(<(i32, f64, char) as TupleV2>::ARITY, 3);
79            assert_eq!(<(i32, f64, char)>::ARITY, 3);
80        }
81
82        #[test]
83        fn test2() {
84            let _: <(i32, f64, char) as TupleV2>::Item<1> = 3.14f64;
85        }
86    }
87}
88#[cfg(feature = "tuple_meta")]
89pub use meta::*;
90
91/// TupleN
92#[cfg(feature = "tuple_meta")]
93pub mod tuple_n {
94    use crate::meta::*;
95
96    pub trait Tuple0: Tuple {}
97    impl Tuple0 for () {}
98
99    pub trait Tuple1: Tuple {
100        type Item0;
101    }
102
103    impl<T> Tuple1 for (T,) {
104        type Item0 = T;
105    }
106
107    include!("./gen/tuple_n.rs");
108}
109#[cfg(all(feature = "tuple_meta", feature = "re-exports"))]
110pub use tuple_n::*;
111
112/// TupleItemN
113#[cfg(feature = "tuple_meta")]
114pub mod tuple_item_n {
115    use crate::meta::*;
116
117    pub trait TupleItemN<const N: usize>: TupleV2 {
118        type ItemN;
119    }
120
121    include!("./gen/tuple_item_n.rs");
122}
123#[cfg(all(feature = "tuple_meta", feature = "re-exports"))]
124pub use tuple_item_n::*;
125
126#[cfg(feature = "shorthand")]
127mod shorthand {
128    include!("./gen/tuple_alias.rs");
129
130    /// Convenient shorthand
131    ///
132    /// # Syntax
133    ///
134    /// - `tuple![<type>; <repeat times>]`
135    /// - `tuple![<expr>; <repeat times>]`
136    /// - `tuple![<tuple size>; <type>, <type> ...]`
137    ///
138    /// # Examples
139    /// *Repeat type*
140    /// ```
141    /// # use tuples::*;
142    /// let a: tuple![u8; 3] = (5, 5, 5);
143    /// # drop(a)
144    /// ```
145    /// *Repeat expr*
146    /// ```
147    /// # use tuples::*;
148    /// let a: (u8, u8, u8) = tuple![5; 3];
149    /// # drop(a)
150    /// ```
151    /// *Auto types*
152    /// ```
153    /// # use tuples::*;
154    /// let a: tuple![3; u8] = (5, 5, 5usize);
155    /// let b: (u8, i32, usize) = tuple![5; 3];
156    /// assert_eq!(a, b);
157    /// ```
158    /// *Iter*
159    /// ```
160    /// # use tuples::*;
161    /// let a = (1, 2, 3)
162    ///     .into_iter()
163    ///     .map(|v| v * 3)
164    ///     .collect_tuple::<tuple![3;]>();
165    /// let b: (i32, i32, i32) = (3, 6, 9);
166    /// assert_eq!(a, b);
167    /// ```
168    /// ----
169    /// ```ignore
170    /// tuple![u8; 3] => (u8, u8, u8)
171    /// tuple![5; 3] => (5, 5, 5)
172    /// tuple![3; u8, u8, u8] => (u8, u8, u8)
173    /// tuple![3; u8] => (u8, _, _)
174    /// tuple![3;] => (_, _, _)
175    /// ```
176    #[macro_export]
177    macro_rules! tuple {
178        { $($t:tt)* } => { tuple_! { $($t)* } }
179    }
180}
181#[cfg(feature = "shorthand")]
182pub use shorthand::*;
183
184#[cfg(feature = "tuple_as")]
185pub mod tuple_as;
186#[cfg(all(feature = "tuple_as", feature = "re-exports"))]
187pub use tuple_as::*;
188
189#[cfg(feature = "tuple_iter")]
190pub mod tuple_iter;
191#[cfg(all(feature = "tuple_iter", feature = "re-exports"))]
192pub use tuple_iter::*;
193
194#[cfg(feature = "tuple_map")]
195pub mod tuple_map;
196#[cfg(all(feature = "tuple_map", feature = "re-exports"))]
197pub use tuple_map::*;
198
199#[cfg(feature = "combin")]
200pub mod combin;
201#[cfg(all(feature = "combin", feature = "re-exports"))]
202pub use combin::*;
203
204/// Split tuples
205#[cfg(any(feature = "split_by", feature = "split_to_tuple_by", feature = "split_at", feature = "split_to_tuple_at"))]
206pub mod split {
207    #[cfg(feature = "split_parts")]
208    pub mod split_parts;
209    #[cfg(all(feature = "split_parts", feature = "re-exports"))]
210    pub use split_parts::*;
211
212    #[cfg(feature = "split_by")]
213    pub mod split_by;
214    #[cfg(all(feature = "split_by", feature = "re-exports"))]
215    pub use split_by::*;
216
217    #[cfg(feature = "split_to_tuple_by")]
218    pub mod split_to_tuple_by;
219    #[cfg(all(feature = "split_to_tuple_by", feature = "re-exports"))]
220    pub use split_to_tuple_by::*;
221
222    #[cfg(feature = "split_at")]
223    pub mod split_at;
224    #[cfg(all(feature = "split_at", feature = "re-exports"))]
225    pub use split_at::*;
226
227    #[cfg(feature = "split_to_tuple_at")]
228    pub mod split_to_tuple_at;
229    #[cfg(all(feature = "split_to_tuple_at", feature = "re-exports"))]
230    pub use split_to_tuple_at::*;
231}
232#[cfg(all(any(feature = "split_by", feature = "split_to_tuple_by", feature = "split_at", feature = "split_to_tuple_at"), feature = "re-exports"))]
233pub use split::*;
234
235#[cfg(feature = "transpose")]
236pub mod transpose;
237#[cfg(all(feature = "transpose", feature = "re-exports"))]
238pub use transpose::*;
239
240#[cfg(feature = "flatten")]
241pub mod flatten;
242#[cfg(all(feature = "flatten", feature = "re-exports"))]
243pub use flatten::*;
244
245#[cfg(feature = "cloned")]
246pub mod cloned;
247#[cfg(all(feature = "cloned", feature = "re-exports"))]
248pub use cloned::*;
249
250#[cfg(feature = "tuple_call")]
251pub mod tuple_call;
252#[cfg(all(feature = "tuple_call", feature = "re-exports"))]
253pub use tuple_call::*;
254
255#[cfg(feature = "apply_tuple")]
256pub mod apply_tuple;
257#[cfg(all(feature = "apply_tuple", feature = "re-exports"))]
258pub use apply_tuple::*;
259
260#[cfg(feature = "capt")]
261pub mod capt;
262#[cfg(all(feature = "capt", feature = "re-exports"))]
263pub use capt::*;
264
265#[cfg(feature = "tuple_get")]
266pub mod tuple_get;
267#[cfg(all(feature = "tuple_get", feature = "re-exports"))]
268pub use tuple_get::*;
269
270#[cfg(all(feature = "sort", feature = "tuple_meta", feature = "tuple_get"))]
271pub mod sort;
272#[cfg(all(feature = "sort", feature = "tuple_meta", feature = "tuple_get", feature = "re-exports"))]
273pub use sort::*;
274
275#[cfg(any(feature = "tuple_swap_n", test, doc))]
276pub mod tuple_swap_n;
277#[cfg(any(all(feature = "tuple_swap_n", feature = "re-exports"), test, doc))]
278pub use tuple_swap_n::*;
279
280#[cfg(any(feature = "permutations", test, doc))]
281pub mod permutations;
282#[cfg(any(all(feature = "permutations", feature = "re-exports"), test, doc))]
283pub use permutations::*;
284
285#[cfg(any(feature = "combinations", test, doc))]
286pub mod combinations;
287#[cfg(any(all(feature = "combinations", feature = "re-exports"), test, doc))]
288pub use combinations::*;
289
290#[cfg(any(feature = "afn", test, doc))]
291pub mod afn;
292
293#[cfg(any(feature = "uniform_map", test, doc))]
294pub mod uniform_map;
295#[cfg(any(all(feature = "uniform_map", feature = "re-exports"), test, doc))]
296pub use uniform_map::*;
297
298#[cfg(any(feature = "uniform_map_by", test, doc))]
299pub mod uniform_map_by;
300#[cfg(any(all(feature = "uniform_map_by", feature = "re-exports"), test, doc))]
301pub use uniform_map_by::*;
302
303#[cfg(any(feature = "uniform_map_by", test, doc))]
304mod param;
305
306#[cfg(any(feature = "get2", test, doc))]
307pub mod get2;
308// #[cfg(any(all(feature = "get2", feature = "re-exports"), test, doc))]
309// pub use get2::*;