use crate::{
views::{Iter, RawAccess, View},
BinaryKey, BinaryValue,
};
#[derive(Debug)]
pub struct Entries<'a, K: ?Sized, V> {
base_iter: Iter<'a, K, V>,
}
impl<'a, K, V> Entries<'a, K, V>
where
K: BinaryKey + ?Sized,
V: BinaryValue,
{
pub(crate) fn new<T: RawAccess>(view: &'a View<T>, from: Option<&K>) -> Self {
Self::with_prefix(view, &(), from)
}
pub(crate) fn with_prefix<T, P>(view: &'a View<T>, prefix: &P, from: Option<&K>) -> Self
where
T: RawAccess,
P: BinaryKey,
{
let base_iter = from.map_or_else(|| view.iter(prefix), |from| view.iter_from(prefix, from));
Self { base_iter }
}
pub fn skip_values(self) -> Keys<'a, K> {
Keys {
base_iter: self.base_iter.drop_value_type(),
}
}
pub fn skip_keys(self) -> Values<'a, V> {
Values {
base_iter: self.base_iter.drop_key_type(),
}
}
}
impl<K, V> Iterator for Entries<'_, K, V>
where
K: BinaryKey + ?Sized,
V: BinaryValue,
{
type Item = (K::Owned, V);
fn next(&mut self) -> Option<Self::Item> {
self.base_iter.next()
}
}
#[derive(Debug)]
pub struct Keys<'a, K: ?Sized> {
base_iter: Iter<'a, K, ()>,
}
impl<K> Iterator for Keys<'_, K>
where
K: BinaryKey + ?Sized,
{
type Item = K::Owned;
fn next(&mut self) -> Option<Self::Item> {
self.base_iter.next().map(|(key, _)| key)
}
}
#[derive(Debug)]
pub struct Values<'a, V> {
base_iter: Iter<'a, (), V>,
}
impl<V> Iterator for Values<'_, V>
where
V: BinaryValue,
{
type Item = V;
fn next(&mut self) -> Option<Self::Item> {
self.base_iter.next().map(|(_, value)| value)
}
}
pub trait IndexIterator {
type Key: BinaryKey + ?Sized;
type Value: BinaryValue;
fn index_iter(&self, from: Option<&Self::Key>) -> Entries<'_, Self::Key, Self::Value>;
}