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 authored and jswrenn committed Sep 4, 2020
1 parent c48da7b commit 594c27a
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
@@ -1,6 +1,7 @@
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 @@ -40,6 +41,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 @@ -61,3 +76,4 @@ fn zip_eq_panic2()
zip_eq(&a, &b).count();
}


0 comments on commit 594c27a

Please sign in to comment.