1
- /// Unzips an iterator over tuples into a tuple of containers.
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`].
2
7
///
3
8
/// ```
4
9
/// use itertools::multiunzip;
9
14
///
10
15
/// assert_eq!((a, b, c), (vec![1, 4, 7], vec![2, 5, 8], vec![3, 6, 9]));
11
16
/// ```
17
+ ///
18
+ /// [`multizip`]: crate::multizip
12
19
pub fn multiunzip < FromI , I > ( i : I ) -> FromI
13
20
where
14
21
I : IntoIterator ,
@@ -27,13 +34,15 @@ pub trait MultiUnzip<FromI>: Iterator {
27
34
28
35
macro_rules! impl_unzip_iter {
29
36
( $( $T: ident => $FromT: ident) ,* ) => (
30
- impl_unzip_iter!( @rec $( $T => $FromT, ) * ) ;
31
- ) ;
32
- ( @rec) => ( ) ;
33
- ( @rec $__: ident => $___: ident, $( $T: ident => $FromT: ident, ) * ) => (
34
37
#[ allow( non_snake_case) ]
35
38
impl <IT : Iterator <Item = ( $( $T, ) * ) >, $( $T, $FromT: Default + Extend <$T>) ,* > MultiUnzip <( $( $FromT, ) * ) > for IT {
36
39
fn multiunzip( self ) -> ( $( $FromT, ) * ) {
40
+ // This implementation mirrors the logic of Iterator::unzip as close as possible.
41
+ // Unfortunately a lot of the used api there is still unstable represented by
42
+ // the commented out parts that follow.
43
+ //
44
+ // https://doc.rust-lang.org/src/core/iter/traits/iterator.rs.html#2816-2844
45
+
37
46
let mut res = ( $( $FromT:: default ( ) , ) * ) ;
38
47
let ( $( $FromT, ) * ) = & mut res;
39
48
@@ -51,8 +60,19 @@ macro_rules! impl_unzip_iter {
51
60
res
52
61
}
53
62
}
54
- impl_unzip_iter!( @rec $( $T => $FromT, ) * ) ;
55
63
) ;
56
64
}
57
65
58
- impl_unzip_iter ! ( L => FromL , K => FromK , J => FromJ , I => FromI , H => FromH , G => FromG , F => FromF , E => FromE , D => FromD , C => FromC , B => FromB , A => FromA ) ;
66
+ impl_unzip_iter ! ( ) ;
67
+ impl_unzip_iter ! ( A => FromA ) ;
68
+ impl_unzip_iter ! ( A => FromA , B => FromB ) ;
69
+ impl_unzip_iter ! ( A => FromA , B => FromB , C => FromC ) ;
70
+ impl_unzip_iter ! ( A => FromA , B => FromB , C => FromC , D => FromD ) ;
71
+ impl_unzip_iter ! ( A => FromA , B => FromB , C => FromC , D => FromD , E => FromE ) ;
72
+ impl_unzip_iter ! ( A => FromA , B => FromB , C => FromC , D => FromD , E => FromE , F => FromF ) ;
73
+ impl_unzip_iter ! ( A => FromA , B => FromB , C => FromC , D => FromD , E => FromE , F => FromF , G => FromG ) ;
74
+ impl_unzip_iter ! ( A => FromA , B => FromB , C => FromC , D => FromD , E => FromE , F => FromF , G => FromG , H => FromH ) ;
75
+ impl_unzip_iter ! ( A => FromA , B => FromB , C => FromC , D => FromD , E => FromE , F => FromF , G => FromG , H => FromH , I => FromI ) ;
76
+ impl_unzip_iter ! ( A => FromA , B => FromB , C => FromC , D => FromD , E => FromE , F => FromF , G => FromG , H => FromH , I => FromI , J => FromJ ) ;
77
+ 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 ) ;
78
+ 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 ) ;
0 commit comments