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}