1macro_rules! impl_tuples {
2 ($macro:ident) => {
3 $macro!();
4 $macro!(a0);
5 $macro!(a0, a1);
6 $macro!(a0, a1, a2);
7 $macro!(a0, a1, a2, a3);
8 $macro!(a0, a1, a2, a3, a4);
9 $macro!(a0, a1, a2, a3, a4, a5);
10 $macro!(a0, a1, a2, a3, a4, a5, a6);
11 $macro!(a0, a1, a2, a3, a4, a5, a6, a7);
12 $macro!(a0, a1, a2, a3, a4, a5, a6, a7, a8);
13 $macro!(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
14 };
15}
16
17pub trait ZipExt<T> {
18 type Output;
19 fn zip(self, rhs: T) -> Self::Output;
20}
21
22pub trait AsRefExt {
23 type Output;
24 #[allow(clippy::wrong_self_convention)]
25 fn as_ref(self) -> Self::Output;
26}
27
28macro_rules! impl_zip_for_tuple {
29 (($($a:ident),*), ($($b:ident),*)) => {
30 #[allow(non_camel_case_types)]
31 #[allow(unused_variables)]
32 #[allow(clippy::unused_unit)]
33 impl<$($a,)* $($b),*> ZipExt<($($b,)*)> for ($($a,)*) {
34 type Output = ($(($a, $b),)*);
35 fn zip(self, ($($b,)*): ($($b,)*)) -> Self::Output {
36 let ($($a,)*) = self;
37 ($(($a, $b),)*)
38 }
39 }
40 };
41}
42
43impl_zip_for_tuple!((), ());
44impl_zip_for_tuple!((a0), (b0));
45impl_zip_for_tuple!((a0, a1), (b0, b1));
46impl_zip_for_tuple!((a0, a1, a2), (b0, b1, b2));
47impl_zip_for_tuple!((a0, a1, a2, a3), (b0, b1, b2, b3));
48impl_zip_for_tuple!((a0, a1, a2, a3, a4), (b0, b1, b2, b3, b4));
49impl_zip_for_tuple!((a0, a1, a2, a3, a4, a5), (b0, b1, b2, b3, b4, b5));
50impl_zip_for_tuple!((a0, a1, a2, a3, a4, a5, a6), (b0, b1, b2, b3, b4, b5, b6));
51impl_zip_for_tuple!(
52 (a0, a1, a2, a3, a4, a5, a6, a7),
53 (b0, b1, b2, b3, b4, b5, b6, b7)
54);
55impl_zip_for_tuple!(
56 (a0, a1, a2, a3, a4, a5, a6, a7, a8),
57 (b0, b1, b2, b3, b4, b5, b6, b7, b8)
58);
59impl_zip_for_tuple!(
60 (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9),
61 (b0, b1, b2, b3, b4, b5, b6, b7, b8, b9)
62);
63
64macro_rules! impl_asref_for_tuple {
65 ($($a:ident),*) => {
66 #[allow(non_camel_case_types)]
67 #[allow(unused_variables)]
68 #[allow(clippy::unused_unit)]
69 impl<'a, $($a),*> AsRefExt for &'a ($($a,)*) {
70 type Output = ($(&'a $a,)*);
71 fn as_ref(self) -> Self::Output {
72 let ($($a,)*) = self;
73 ($($a,)*)
74 }
75 }
76 };
77}
78
79impl_tuples!(impl_asref_for_tuple);
80
81pub(crate) use impl_tuples;