ref_iter/sub/
imap.rs

1//! Provider of [`IMap`].
2
3use crate::prelude::*;
4use crate::util::msg;
5
6/// An iterator that maps dyanmic borrowing iterator items.
7///
8/// This struct is created by [`RefIterator::imap`].
9#[derive(Clone, Debug)]
10#[must_use = msg::iter_must_use!()]
11pub struct IMap<I, F> {
12    /// Base iterator.
13    iter: I,
14    /// Closure for each item mapping.
15    f: F,
16}
17
18impl<I, F> IMap<I, F> {
19    /// Creates a new value.
20    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    // nop.
47}