]> git.lizzy.rs Git - rust.git/blob - library/alloc/src/collections/btree/dedup_sorted_iter.rs
Rollup merge of #95011 - michaelwoerister:awaitee_field, r=tmandry
[rust.git] / library / alloc / src / collections / btree / dedup_sorted_iter.rs
1 use core::iter::Peekable;
2
3 /// A iterator for deduping the key of a sorted iterator.
4 /// When encountering the duplicated key, only the last key-value pair is yielded.
5 ///
6 /// Used by [`BTreeMap::bulk_build_from_sorted_iter`].
7 pub struct DedupSortedIter<K, V, I>
8 where
9     I: Iterator<Item = (K, V)>,
10 {
11     iter: Peekable<I>,
12 }
13
14 impl<K, V, I> DedupSortedIter<K, V, I>
15 where
16     I: Iterator<Item = (K, V)>,
17 {
18     pub fn new(iter: I) -> Self {
19         Self { iter: iter.peekable() }
20     }
21 }
22
23 impl<K, V, I> Iterator for DedupSortedIter<K, V, I>
24 where
25     K: Eq,
26     I: Iterator<Item = (K, V)>,
27 {
28     type Item = (K, V);
29
30     fn next(&mut self) -> Option<(K, V)> {
31         loop {
32             let next = match self.iter.next() {
33                 Some(next) => next,
34                 None => return None,
35             };
36
37             let peeked = match self.iter.peek() {
38                 Some(peeked) => peeked,
39                 None => return Some(next),
40             };
41
42             if next.0 != peeked.0 {
43                 return Some(next);
44             }
45         }
46     }
47 }