copse/liballoc/collections/btree/
dedup_sorted_iter.rs1use core::iter::Peekable;
2
3use crate::{SortableBy, TotalOrder};
4
5pub struct DedupSortedIter<'a, K, V, O, I>
12where
13 I: Iterator<Item = (K, V)>,
14{
15 iter: Peekable<I>,
16 order: &'a O,
17}
18
19impl<'a, K, V, O, I> DedupSortedIter<'a, K, V, O, I>
20where
21 I: Iterator<Item = (K, V)>,
22{
23 pub fn new(iter: I, order: &'a O) -> Self {
24 Self { iter: iter.peekable(), order }
25 }
26}
27
28impl<K, V, O, I> Iterator for DedupSortedIter<'_, K, V, O, I>
29where
30 K: SortableBy<O>,
31 O: TotalOrder,
32 I: Iterator<Item = (K, V)>,
33{
34 type Item = (K, V);
35
36 fn next(&mut self) -> Option<(K, V)> {
37 loop {
38 let next = match self.iter.next() {
39 Some(next) => next,
40 None => return None,
41 };
42
43 let peeked = match self.iter.peek() {
44 Some(peeked) => peeked,
45 None => return Some(next),
46 };
47
48 if self.order.ne(&next.0, &peeked.0) {
49 return Some(next);
50 }
51 }
52 }
53}