use crate::req::compactor::Compactor;
pub struct ReqSketchIterator<'a, T> {
compactors: &'a [Compactor<T>],
current_level: usize,
current_level_iter: Option<std::slice::Iter<'a, T>>,
current_weight: u64,
}
impl<'a, T: Clone + Ord> ReqSketchIterator<'a, T> {
pub(super) fn new(compactors: &'a [Compactor<T>]) -> Self {
let mut iter = Self {
compactors,
current_level: 0,
current_level_iter: None,
current_weight: 0,
};
iter.advance_to_next_level();
iter
}
fn advance_to_next_level(&mut self) {
while self.current_level < self.compactors.len() {
let compactor = &self.compactors[self.current_level];
let items_slice = compactor.items_slice();
if !items_slice.is_empty() {
self.current_level_iter = Some(items_slice.iter());
self.current_weight = compactor.weight();
return;
}
self.current_level += 1;
}
self.current_level_iter = None;
}
}
impl<'a, T: Clone + Ord> Iterator for ReqSketchIterator<'a, T> {
type Item = (&'a T, u64);
fn next(&mut self) -> Option<Self::Item> {
loop {
if let Some(ref mut level_iter) = self.current_level_iter {
if let Some(item) = level_iter.next() {
return Some((item, self.current_weight));
}
}
self.current_level += 1;
self.advance_to_next_level();
self.current_level_iter.as_ref()?;
}
}
}