use namada_core::collections::HashMap;
use crate::{DB, DBIter, PrefixIter};
#[derive(Debug)]
pub struct PrefixIterators<'iter, D>
where
D: DB + DBIter<'iter>,
{
index: PrefixIteratorId,
iterators: HashMap<PrefixIteratorId, PrefixIter<'iter, D>>,
}
impl<'iter, D> PrefixIterators<'iter, D>
where
D: DB + DBIter<'iter>,
{
pub fn insert(
&mut self,
iter: PrefixIter<'iter, D>,
) -> Option<PrefixIteratorId> {
let id = self.index;
self.iterators.insert(id, iter);
self.index = id.next_id()?;
Some(id)
}
pub fn next(
&mut self,
id: PrefixIteratorId,
) -> Option<<PrefixIter<'iter, D> as Iterator>::Item> {
self.iterators.get_mut(&id).and_then(|i| i.next())
}
pub fn get_mut(
&mut self,
id: PrefixIteratorId,
) -> Option<&mut PrefixIter<'iter, D>> {
self.iterators.get_mut(&id)
}
}
impl<'iter, D> Default for PrefixIterators<'iter, D>
where
D: DB + DBIter<'iter>,
{
fn default() -> Self {
Self {
index: PrefixIteratorId::default(),
iterators: HashMap::default(),
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Default)]
pub struct PrefixIteratorId(u64);
impl PrefixIteratorId {
pub fn new(id: u64) -> Self {
PrefixIteratorId(id)
}
pub fn id(&self) -> u64 {
self.0
}
fn next_id(&self) -> Option<PrefixIteratorId> {
Some(PrefixIteratorId(self.0.checked_add(1)?))
}
}