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}