pub(crate) struct PrecountedMetricsIterator<I> {
inner: I,
num_files: u64,
bytes_read: u64,
emitted: bool,
emit_fn: fn(u64, u64),
}
impl<I> PrecountedMetricsIterator<I> {
pub(crate) fn new(inner: I, num_files: u64, bytes_read: u64, emit_fn: fn(u64, u64)) -> Self {
Self {
inner,
num_files,
bytes_read,
emitted: false,
emit_fn,
}
}
fn emit_once(&mut self) {
if !self.emitted {
self.emitted = true;
(self.emit_fn)(self.num_files, self.bytes_read);
}
}
}
impl<I: Iterator> Iterator for PrecountedMetricsIterator<I> {
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
let item = self.inner.next();
if item.is_none() {
self.emit_once();
}
item
}
}
impl<I> Drop for PrecountedMetricsIterator<I> {
fn drop(&mut self) {
self.emit_once();
}
}