taplo/util/
iter.rs

1pub(crate) struct ExactIter<I>
2where
3    I: Iterator,
4{
5    len: usize,
6    iter: I,
7}
8
9impl<I> ExactIter<I>
10where
11    I: Iterator,
12{
13    pub(crate) fn new(len: usize, iter: I) -> Self {
14        Self { len, iter }
15    }
16}
17
18impl<I> Iterator for ExactIter<I>
19where
20    I: Iterator,
21{
22    type Item = I::Item;
23
24    fn next(&mut self) -> Option<Self::Item> {
25        if self.len != 0 {
26            let v = self.iter.next().expect("exact iterator ended too early");
27            self.len -= 1;
28            Some(v)
29        } else {
30            None
31        }
32    }
33
34    fn size_hint(&self) -> (usize, Option<usize>) {
35        (self.len, Some(self.len))
36    }
37}
38
39impl<I> ExactSizeIterator for ExactIter<I> where I: Iterator {}
40
41pub(crate) trait ExactIterExt: Iterator + Sized {
42    fn exactly(self, count: usize) -> ExactIter<Self>;
43}
44
45impl<I: Iterator + Sized> ExactIterExt for I {
46    fn exactly(self, count: usize) -> ExactIter<Self> {
47        ExactIter::new(count, self)
48    }
49}