1use crate::prelude::*;
4use crate::util::msg;
5
6#[derive(Clone, Debug)]
10#[must_use = msg::iter_must_use!()]
11pub struct IMap<I, F> {
12 iter: I,
14 f: F,
16}
17
18impl<I, F> IMap<I, F> {
19 pub(crate) fn new(iter: I, f: F) -> Self {
21 Self { iter, f }
22 }
23}
24
25impl<B, I, F> Iterator for IMap<I, F>
26where
27 I: RefIterator,
28 F: FnMut(&I::Item) -> B,
29{
30 type Item = B;
31
32 fn next(&mut self) -> Option<Self::Item> {
33 Some((self.f)(self.iter.next()?))
34 }
35
36 fn size_hint(&self) -> (usize, Option<usize>) {
37 self.iter.size_hint()
38 }
39}
40
41impl<I, F> ExactSizeIterator for IMap<I, F>
42where
43 Self: Iterator,
44 I: ExactSizeIterator,
45{
46 }