Coverage Report

Created: 2025-02-25 06:39

/rust/registry/src/index.crates.io-6f17d22bba15001f/itertools-0.10.5/src/unziptuple.rs
Line
Count
Source (jump to first uncovered line)
1
/// Converts an iterator of tuples into a tuple of containers.
2
///
3
/// `unzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each
4
/// column.
5
///
6
/// This function is, in some sense, the opposite of [`multizip`].
7
///
8
/// ```
9
/// use itertools::multiunzip;
10
///
11
/// let inputs = vec![(1, 2, 3), (4, 5, 6), (7, 8, 9)];
12
///
13
/// let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = multiunzip(inputs);
14
///
15
/// assert_eq!(a, vec![1, 4, 7]);
16
/// assert_eq!(b, vec![2, 5, 8]);
17
/// assert_eq!(c, vec![3, 6, 9]);
18
/// ```
19
///
20
/// [`multizip`]: crate::multizip
21
0
pub fn multiunzip<FromI, I>(i: I) -> FromI
22
0
where
23
0
    I: IntoIterator,
24
0
    I::IntoIter: MultiUnzip<FromI>,
25
0
{
26
0
    i.into_iter().multiunzip()
27
0
}
28
29
/// An iterator that can be unzipped into multiple collections.
30
///
31
/// See [`.multiunzip()`](crate::Itertools::multiunzip) for more information.
32
pub trait MultiUnzip<FromI>: Iterator {
33
    /// Unzip this iterator into multiple collections.
34
    fn multiunzip(self) -> FromI;
35
}
36
37
macro_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
0
            fn multiunzip(self) -> ($($FromT,)*) {
42
0
                // This implementation mirrors the logic of Iterator::unzip resp. Extend for (A, B) as close as possible.
43
0
                // Unfortunately a lot of the used api there is still unstable (https://github.com/rust-lang/rust/issues/72631).
44
0
                //
45
0
                // Iterator::unzip: https://doc.rust-lang.org/src/core/iter/traits/iterator.rs.html#2825-2865
46
0
                // Extend for (A, B): https://doc.rust-lang.org/src/core/iter/traits/collect.rs.html#370-411
47
0
48
0
                let mut res = ($($FromT::default(),)*);
49
0
                let ($($FromT,)*) = &mut res;
50
0
51
0
                // Still unstable #72631
52
0
                // let (lower_bound, _) = self.size_hint();
53
0
                // if lower_bound > 0 {
54
0
                //     $($FromT.extend_reserve(lower_bound);)*
55
0
                // }
56
0
57
0
                self.fold((), |(), ($($T,)*)| {
58
0
                    // Still unstable #72631
59
0
                    // $( $FromT.extend_one($T); )*
60
0
                    $( $FromT.extend(std::iter::once($T)); )*
61
0
                });
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<()>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_,)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _, _, _, _)>>::multiunzip::{closure#0}
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _, _, _, _, _)>>::multiunzip::{closure#0}
62
0
                res
63
0
            }
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<()>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_,)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _, _, _, _)>>::multiunzip
Unexecuted instantiation: <_ as itertools::unziptuple::MultiUnzip<(_, _, _, _, _, _, _, _, _, _, _, _)>>::multiunzip
64
        }
65
    );
66
}
67
68
impl_unzip_iter!();
69
impl_unzip_iter!(A => FromA);
70
impl_unzip_iter!(A => FromA, B => FromB);
71
impl_unzip_iter!(A => FromA, B => FromB, C => FromC);
72
impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD);
73
impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE);
74
impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF);
75
impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG);
76
impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH);
77
impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI);
78
impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI, J => FromJ);
79
impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI, J => FromJ, K => FromK);
80
impl_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);