1use super::size_hint;
2
3#[derive(Clone, Debug)]
8#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
9pub struct ZipEq<I, J> {
10    a: I,
11    b: J,
12}
13
14pub fn zip_eq<I, J>(i: I, j: J) -> ZipEq<I::IntoIter, J::IntoIter>
27where
28    I: IntoIterator,
29    J: IntoIterator,
30{
31    ZipEq {
32        a: i.into_iter(),
33        b: j.into_iter(),
34    }
35}
36
37impl<I, J> Iterator for ZipEq<I, J>
38where
39    I: Iterator,
40    J: Iterator,
41{
42    type Item = (I::Item, J::Item);
43
44    fn next(&mut self) -> Option<Self::Item> {
45        match (self.a.next(), self.b.next()) {
46            (None, None) => None,
47            (Some(a), Some(b)) => Some((a, b)),
48            (None, Some(_)) | (Some(_), None) => {
49                panic!("itertools: .zip_eq() reached end of one iterator before the other")
50            }
51        }
52    }
53
54    fn size_hint(&self) -> (usize, Option<usize>) {
55        size_hint::min(self.a.size_hint(), self.b.size_hint())
56    }
57}
58
59impl<I, J> ExactSizeIterator for ZipEq<I, J>
60where
61    I: ExactSizeIterator,
62    J: ExactSizeIterator,
63{
64}