--- /dev/null
+use crate::Entry;
+use std::iter::Iterator;
+
+pub trait Iter: Iterator<Item = Entry> {
+ fn seek(&mut self, key: &[u8]);
+}
+
+pub type BoxedIter<'a> = Box<dyn Iter + 'a>;
+
+impl<'a> Iter for BoxedIter<'a> {
+ fn seek(&mut self, key: &[u8]) {
+ self.as_mut().seek(key);
+ }
+}
+
+pub struct PrefixIter<I: Iter> {
+ iter: I,
+ prefix: Vec<u8>,
+}
+
+impl<I: Iter> PrefixIter<I> {
+ pub fn new(mut iter: I, prefix: &[u8]) -> Self {
+ iter.seek(prefix);
+ Self {
+ iter,
+ prefix: Vec::from(prefix),
+ }
+ }
+}
+
+impl<I: Iter> Iterator for PrefixIter<I> {
+ type Item = Entry;
+ fn next(&mut self) -> Option<Self::Item> {
+ let item = self.iter.next()?;
+ if item.key.starts_with(self.prefix.as_slice()) {
+ Some(item)
+ } else {
+ None
+ }
+ }
+}
+
+impl<I: Iter> Iter for PrefixIter<I> {
+ fn seek(&mut self, key: &[u8]) {
+ self.iter.seek(key);
+ }
+}
+
+pub struct RangeIter<I: Iter> {
+ iter: I,
+ start: Vec<u8>,
+ end: Vec<u8>,
+}
+
+impl<I: Iter> RangeIter<I> {
+ pub fn new(mut iter: I, start: &[u8], end: &[u8]) -> Self {
+ iter.seek(start);
+ Self {
+ iter,
+ start: Vec::from(start),
+ end: Vec::from(end),
+ }
+ }
+}
+
+impl<I: Iter> Iterator for RangeIter<I> {
+ type Item = Entry;
+ fn next(&mut self) -> Option<Self::Item> {
+ let item = self.iter.next()?;
+ if item.key.as_slice() <= self.end.as_slice() {
+ Some(item)
+ } else {
+ None
+ }
+ }
+}
+
+impl<I: Iter> Iter for RangeIter<I> {
+ fn seek(&mut self, key: &[u8]) {
+ if key <= self.start.as_slice() {
+ self.iter.seek(self.start.as_slice());
+ } else if key > self.end.as_slice() {
+ self.iter.seek(self.end.as_slice());
+ self.iter.next();
+ } else {
+ self.iter.seek(key);
+ }
+ }
+}
-use crate::Entry;
-use std::iter::Iterator;
+use crate::iter::{BoxedIter, PrefixIter, RangeIter};
+use crate::Iter;
use std::marker::PhantomData;
-pub trait Iter: Iterator<Item = Entry> {
- fn seek(&mut self, key: &[u8]);
-}
-
-type BoxedIter<'a> = Box<dyn Iter + 'a>;
-
-impl<'a> Iter for BoxedIter<'a> {
- fn seek(&mut self, key: &[u8]) {
- self.as_mut().seek(key);
- }
-}
-
pub trait IterSource {
type It: Iter;
fn iter(&self) -> Self::It;
type Range = RangeIter<S::It>;
fn get(&self, key: &[u8]) -> Self::Get {
- let mut res = RangeIter {
- iter: self.iter(),
- start: Vec::from(key),
- end: Vec::from(key),
- };
- res.seek(key);
- res
+ RangeIter::new(self.iter(), key, key)
}
fn get_prefix(&self, prefix: &[u8]) -> Self::Prefix {
- let mut res = PrefixIter {
- iter: self.iter(),
- prefix: Vec::from(prefix),
- };
- res.seek(prefix);
- res
+ PrefixIter::new(self.iter(), prefix)
}
fn get_range(&self, start: &[u8], end: &[u8]) -> Self::Range {
- let mut res = RangeIter {
- iter: self.iter(),
- start: Vec::from(start),
- end: Vec::from(end),
- };
- res.seek(start);
- res
- }
-}
-
-pub struct PrefixIter<I: Iter> {
- iter: I,
- prefix: Vec<u8>,
-}
-
-impl<I: Iter> Iterator for PrefixIter<I> {
- type Item = Entry;
- fn next(&mut self) -> Option<Self::Item> {
- let item = self.iter.next()?;
- if item.key.starts_with(self.prefix.as_slice()) {
- Some(item)
- } else {
- None
- }
- }
-}
-
-impl<I: Iter> Iter for PrefixIter<I> {
- fn seek(&mut self, key: &[u8]) {
- self.iter.seek(key);
- }
-}
-
-pub struct RangeIter<I: Iter> {
- iter: I,
- start: Vec<u8>,
- end: Vec<u8>,
-}
-
-impl<I: Iter> Iterator for RangeIter<I> {
- type Item = Entry;
- fn next(&mut self) -> Option<Self::Item> {
- let item = self.iter.next()?;
- if item.key.as_slice() <= self.end.as_slice() {
- Some(item)
- } else {
- None
- }
- }
-}
-
-impl<I: Iter> Iter for RangeIter<I> {
- fn seek(&mut self, key: &[u8]) {
- if key <= self.start.as_slice() {
- self.iter.seek(self.start.as_slice());
- } else if key > self.end.as_slice() {
- self.iter.seek(self.end.as_slice());
- self.iter.next();
- } else {
- self.iter.seek(key);
- }
+ RangeIter::new(self.iter(), start, end)
}
}
#[cfg(test)]
pub mod test {
- use super::{BoxedSource, DefaultSource, Entry, Iter, IterSource, Source};
+ use super::{BoxedSource, DefaultSource, IterSource};
+ use crate::Entry;
+ use crate::Iter;
+ use crate::Source;
pub struct TestSource(pub Vec<Entry>);