use crate::prelude::*;
use core::cmp::*;
use core::iter::*;
pub struct OverlayingIterator<U, O>
where
U: Iterator,
O: Iterator,
{
underlying: Peekable<U>,
overlaying: Peekable<O>,
}
impl<K, V, U, O> OverlayingIterator<U, O>
where
K: Ord,
U: Iterator<Item = (K, V)>,
O: Iterator<Item = (K, Option<V>)>,
{
#[allow(clippy::new_ret_no_self)]
pub fn new(underlying: U, overlaying: O) -> impl Iterator<Item = (K, V)> {
Self {
underlying: underlying.peekable(),
overlaying: overlaying.peekable(),
}
}
}
impl<K, V, U, O> Iterator for OverlayingIterator<U, O>
where
K: Ord,
U: Iterator<Item = (K, V)>,
O: Iterator<Item = (K, Option<V>)>,
{
type Item = (K, V);
fn next(&mut self) -> Option<Self::Item> {
loop {
if let Some(overlaying_key) = self.overlaying.peek_key() {
if let Some(underlying_key) = self.underlying.peek_key() {
match underlying_key.cmp(overlaying_key) {
Ordering::Less => {
return self.underlying.next(); }
Ordering::Equal => {
self.underlying.next(); }
Ordering::Greater => {
}
};
}
let (overlaying_key, overlaying_change) = self.overlaying.next().unwrap();
match overlaying_change {
Some(value) => return Some((overlaying_key, value)),
None => continue, }
} else {
return self.underlying.next();
}
}
}
}