Skip to content

Commit

Permalink
Add implementation for DoubleEndedIterator for Zip with test
Browse files Browse the repository at this point in the history
  • Loading branch information
Sven Knobloch committed May 28, 2019
1 parent 70988ff commit 053f26d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/ziptuple.rs
Expand Up @@ -98,6 +98,30 @@ macro_rules! impl_zip_iter {
$B: ExactSizeIterator,
)*
{ }

#[allow(non_snake_case)]
impl<$($B),*> DoubleEndedIterator for Zip<($($B,)*)> where
$(
$B: DoubleEndedIterator + ExactSizeIterator,
)*
{
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
let ($(ref mut $B,)*) = self.t;
let size = *[$( $B.len(), )*].into_iter().min().unwrap();

$(
if $B.len() != size {
for _ in 0..$B.len() - size { $B.next_back(); }
}
)*

match ($($B.next_back(),)*) {
($(Some($B),)*) => Some(($($B,)*)),
_ => None,
}
}
}
);
}

Expand Down
16 changes: 16 additions & 0 deletions tests/zip.rs
Expand Up @@ -3,6 +3,7 @@ extern crate itertools;
use itertools::Itertools;
use itertools::EitherOrBoth::{Both, Left, Right};
use itertools::free::zip_eq;
use itertools::multizip;

#[test]
fn zip_longest_fused() {
Expand Down Expand Up @@ -42,6 +43,20 @@ fn test_double_ended_zip_longest() {
assert_eq!(it.next(), None);
}

#[test]
fn test_double_ended_zip() {
let xs = [1, 2, 3, 4, 5, 6];
let ys = [1, 2, 3, 7];
let a = xs.iter().map(|&x| x);
let b = ys.iter().map(|&x| x);
let mut it = multizip((a, b));
assert_eq!(it.next_back(), Some((4, 7)));
assert_eq!(it.next_back(), Some((3, 3)));
assert_eq!(it.next_back(), Some((2, 2)));
assert_eq!(it.next_back(), Some((1, 1)));
assert_eq!(it.next_back(), None);
}


#[should_panic]
#[test]
Expand All @@ -63,3 +78,4 @@ fn zip_eq_panic2()
zip_eq(&a, &b).count();
}


0 comments on commit 053f26d

Please sign in to comment.