From 6a2428388b99200ee6e73566f2c3a1f0b1eaf0dd Mon Sep 17 00:00:00 2001 From: Petros Angelatos Date: Tue, 2 Sep 2025 11:12:40 +0300 Subject: [PATCH] zip_eq: add `DoubleEndedIterator` implementation Signed-off-by: Petros Angelatos --- src/zip_eq_impl.rs | 16 ++++++++++++++++ tests/quick.rs | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/src/zip_eq_impl.rs b/src/zip_eq_impl.rs index 3240a40eb..519a7d348 100644 --- a/src/zip_eq_impl.rs +++ b/src/zip_eq_impl.rs @@ -63,3 +63,19 @@ where J: ExactSizeIterator, { } + +impl DoubleEndedIterator for ZipEq +where + I: DoubleEndedIterator, + J: DoubleEndedIterator, +{ + fn next_back(&mut self) -> Option { + match (self.a.next_back(), self.b.next_back()) { + (None, None) => None, + (Some(a), Some(b)) => Some((a, b)), + (None, Some(_)) | (Some(_), None) => { + panic!("itertools: .zip_eq() reached end of one iterator before the other") + } + } + } +} diff --git a/tests/quick.rs b/tests/quick.rs index 674848512..4f1fa4b66 100644 --- a/tests/quick.rs +++ b/tests/quick.rs @@ -587,6 +587,13 @@ quickcheck! { TestResult::passed() // won't come here } + fn zip_eq_rev(a: Vec, b: Vec) -> bool { + let len = std::cmp::min(a.len(), b.len()); + let a = &a[..len]; + let b = &b[..len]; + itertools::equal(zip_eq(a, b).rev(), zip(a, b).rev()) + } + fn equal_positions(a: Vec) -> bool { let with_pos = a.iter().positions(|v| v % 2 == 0); let without = a.iter().enumerate().filter(|(_, v)| *v % 2 == 0).map(|(i, _)| i);