use super::*;
pub struct Iter<'a, K, V> {
db_iter: rocksdb::DBRawIterator<'a>,
prefix: Vec<u8>,
_phantom: PhantomData<(K, V)>,
}
impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iter<'a, K, V> {
pub(super) fn new(db_iter: rocksdb::DBRawIterator<'a>, prefix: Vec<u8>) -> Self {
Self {
db_iter,
prefix,
_phantom: PhantomData,
}
}
}
impl<'a, K: DeserializeOwned, V: DeserializeOwned> Iterator for Iter<'a, K, V> {
type Item = (K, V);
fn next(&mut self) -> Option<Self::Item> {
if self.db_iter.valid() {
let key = match self
.db_iter
.key()
.and_then(|k| if k.starts_with(&self.prefix) { Some(k) } else { None })
.map(|k| bincode::deserialize(&k[self.prefix.len()..]).ok())
{
Some(key) => key,
None => None,
};
let value = match self.db_iter.value().map(|v| bincode::deserialize(v).ok()) {
Some(value) => value,
None => None,
};
self.db_iter.next();
key.and_then(|k| value.map(|v| (k, v)))
} else {
None
}
}
}