pub(crate) fn zip<I1, I2>(left: I1, right: I2) -> ZippedIterator<I1, I2> {
ZippedIterator { left, right, has_size_mismatch: false, consumed_elements: 0 }
}
pub(crate) struct ZippedIterator<I1, I2> {
left: I1,
right: I2,
has_size_mismatch: bool,
consumed_elements: usize,
}
impl<I1: Iterator, I2> ZippedIterator<I1, I2> {
pub(crate) fn has_size_mismatch(&self) -> bool {
self.has_size_mismatch
}
pub(crate) fn left_size(mut self) -> usize {
self.consumed_elements + self.left.by_ref().count()
}
}
impl<I1: Iterator, I2: Iterator> Iterator for ZippedIterator<I1, I2> {
type Item = (I1::Item, I2::Item);
fn next(&mut self) -> Option<(I1::Item, I2::Item)> {
match (self.left.next(), self.right.next()) {
(Some(v1), Some(v2)) => {
self.consumed_elements += 1;
Some((v1, v2))
}
(Some(_), None) => {
self.consumed_elements += 1;
self.has_size_mismatch = true;
None
}
(None, Some(_)) => {
self.has_size_mismatch = true;
None
}
(None, None) => None,
}
}
}