ref_iter/traits/
ref_kv_iterator.rs

1//! Provider of [`RefKvIterator`].
2
3use crate::prelude::*;
4use crate::KvIMap;
5use core::ops::DerefMut;
6
7#[cfg(feature = "alloc")]
8use alloc::boxed::Box;
9
10/// Immutable dynamic borrowing key-value iterator.
11pub trait RefKvIterator: RefIteratorBase {
12    /// The key type of the elements being iterated over.
13    type K: ?Sized;
14
15    /// The value type of the elements being iterated over.
16    type V: ?Sized;
17
18    /// Advances the iterator and returns the next key-value.
19    ///
20    /// # Examples
21    ///
22    /// ```
23    /// # use ref_iter::prelude::*;
24    /// # use std::cell::RefCell;
25    /// # use std::collections::BTreeMap;
26    /// #
27    /// let samples = BTreeMap::from([(1, 1), (2, 2)]);
28    /// let src = RefCell::new(samples.clone());
29    /// let mut iter = RefIter::new(src.borrow(), |x| x.iter());
30    /// assert_eq!(iter.next(), Some((&1, &1)));
31    /// assert_eq!(iter.next(), Some((&2, &2)));
32    /// assert_eq!(iter.next(), None);
33    /// ```
34    fn next(&mut self) -> Option<(&Self::K, &Self::V)>;
35
36    /// Creates an iterator that maps dynamic borrowing elements.
37    ///
38    /// # Examples
39    ///
40    /// ```
41    /// # use ref_iter::prelude::*;
42    /// # use std::cell::RefCell;
43    /// # use std::collections::HashMap;
44    /// #
45    /// let samples = HashMap::from([(1, 10), (2, 20)]);
46    /// let src = RefCell::new(samples.clone());
47    /// let iter = RefIter::new(src.borrow(), |x| x.iter());
48    /// let iter = iter.imap(|k, v| k + v);
49    /// assert!(iter.eq(samples.iter().map(|x| x.0 + x.1)));
50    /// ```
51    fn imap<B, F>(self, f: F) -> KvIMap<Self, F>
52    where
53        Self: Sized,
54        F: FnMut(&Self::K, &Self::V) -> B,
55    {
56        KvIMap::new(self, f)
57    }
58}
59
60impl<I> RefKvIterator for Box<I>
61where
62    I: RefKvIterator + ?Sized,
63{
64    type K = I::K;
65    type V = I::V;
66
67    fn next(&mut self) -> Option<(&Self::K, &Self::V)> {
68        self.deref_mut().next()
69    }
70}