diff options
Diffstat (limited to '')
-rw-r--r-- | library/alloc/src/collections/btree/dedup_sorted_iter.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/library/alloc/src/collections/btree/dedup_sorted_iter.rs b/library/alloc/src/collections/btree/dedup_sorted_iter.rs new file mode 100644 index 000000000..60bf83b83 --- /dev/null +++ b/library/alloc/src/collections/btree/dedup_sorted_iter.rs @@ -0,0 +1,47 @@ +use core::iter::Peekable; + +/// A iterator for deduping the key of a sorted iterator. +/// When encountering the duplicated key, only the last key-value pair is yielded. +/// +/// Used by [`BTreeMap::bulk_build_from_sorted_iter`]. +pub struct DedupSortedIter<K, V, I> +where + I: Iterator<Item = (K, V)>, +{ + iter: Peekable<I>, +} + +impl<K, V, I> DedupSortedIter<K, V, I> +where + I: Iterator<Item = (K, V)>, +{ + pub fn new(iter: I) -> Self { + Self { iter: iter.peekable() } + } +} + +impl<K, V, I> Iterator for DedupSortedIter<K, V, I> +where + K: Eq, + I: Iterator<Item = (K, V)>, +{ + type Item = (K, V); + + fn next(&mut self) -> Option<(K, V)> { + loop { + let next = match self.iter.next() { + Some(next) => next, + None => return None, + }; + + let peeked = match self.iter.peek() { + Some(peeked) => peeked, + None => return Some(next), + }; + + if next.0 != peeked.0 { + return Some(next); + } + } + } +} |