use wdev::Device;
use whlog::{HybridLog, ScanIterator};
use wrecord::RecordRef;
use crate::error::Result;
pub(super) struct ScanCursor<'a, D: Device> {
iter: ScanIterator<'a, D>,
buf: Vec<u8>,
}
impl<'a, D: Device> ScanCursor<'a, D> {
pub(super) fn new(hlog: &'a HybridLog<D>, from: u64, until: u64) -> Self {
Self {
iter: hlog.scan_iter(from, until),
buf: Vec::with_capacity(hlog.config.page_size),
}
}
pub(super) async fn pull(&mut self) -> Result<Option<(u64, RecordRef<'_>)>> {
match self.iter.next_into(&mut self.buf).await? {
Some((addr, raw)) => Ok(Some((addr, RecordRef::from_slice(raw)?))),
None => Ok(None),
}
}
pub(super) const fn cursor(&self) -> u64 {
self.iter.current_address()
}
}