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