use crate::{
db::direction::Direction,
db::index::{
IndexEntryValue, envelope_is_empty,
key::RawIndexStoreKey,
store::{IndexStore, IndexStoreBackend},
},
error::InternalError,
};
use std::ops::Bound;
impl IndexStore {
pub(in crate::db) fn visit_raw_entries_in_range<F>(
&self,
bounds: (&Bound<RawIndexStoreKey>, &Bound<RawIndexStoreKey>),
direction: Direction,
mut visit: F,
) -> Result<(), InternalError>
where
F: FnMut(&RawIndexStoreKey, &IndexEntryValue) -> Result<bool, InternalError>,
{
if envelope_is_empty(bounds.0, bounds.1) {
return Ok(());
}
match direction {
Direction::Asc => match &self.backend {
IndexStoreBackend::Stable(map) => {
for entry in map.range((bounds.0.clone(), bounds.1.clone())) {
if visit(entry.key(), &entry.value())? {
return Ok(());
}
}
}
IndexStoreBackend::Heap(map) => {
for (key, value) in map.range((bounds.0.clone(), bounds.1.clone())) {
if visit(key, value)? {
return Ok(());
}
}
}
},
Direction::Desc => match &self.backend {
IndexStoreBackend::Stable(map) => {
for entry in map.range((bounds.0.clone(), bounds.1.clone())).rev() {
if visit(entry.key(), &entry.value())? {
return Ok(());
}
}
}
IndexStoreBackend::Heap(map) => {
for (key, value) in map.range((bounds.0.clone(), bounds.1.clone())).rev() {
if visit(key, value)? {
return Ok(());
}
}
}
},
}
Ok(())
}
}