1pub fn multiunzip<FromI, I>(i: I) -> FromI
22where
23    I: IntoIterator,
24    I::IntoIter: MultiUnzip<FromI>,
25{
26    i.into_iter().multiunzip()
27}
28
29pub trait MultiUnzip<FromI>: Iterator {
33    fn multiunzip(self) -> FromI;
35}
36
37macro_rules! impl_unzip_iter {
38    ($($T:ident => $FromT:ident),*) => (
39        #[allow(non_snake_case)]
40        impl<IT: Iterator<Item = ($($T,)*)>, $($T, $FromT: Default + Extend<$T>),* > MultiUnzip<($($FromT,)*)> for IT {
41            fn multiunzip(self) -> ($($FromT,)*) {
42                let mut res = ($($FromT::default(),)*);
49                let ($($FromT,)*) = &mut res;
50
51                self.fold((), |(), ($($T,)*)| {
58                    $( $FromT.extend(std::iter::once($T)); )*
61                });
62                res
63            }
64        }
65    );
66}
67
68impl_unzip_iter!();
69impl_unzip_iter!(A => FromA);
70impl_unzip_iter!(A => FromA, B => FromB);
71impl_unzip_iter!(A => FromA, B => FromB, C => FromC);
72impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD);
73impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE);
74impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF);
75impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG);
76impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH);
77impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI);
78impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI, J => FromJ);
79impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI, J => FromJ, K => FromK);
80impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI, J => FromJ, K => FromK, L => FromL);