}
}
-struct MergeIter<'a, S: Source> {
- sources: &'a [S],
+struct MergeIter<'a> {
heap: BinaryHeap<MergeEntry<'a>>,
+ finished: Vec<Box<dyn Iter + 'a>>,
last_key: Vec<u8>,
}
-impl<'a, S: Source> Iterator for MergeIter<'a, S> {
+impl<'a> Iterator for MergeIter<'a> {
type Item = Entry;
fn next(&mut self) -> Option<Self::Item> {
}
}
-impl<'a, S: Source> Iter for MergeIter<'a, S> {
+impl<'a> Iter for MergeIter<'a> {
fn seek(&mut self, key: &[u8]) {
if key > self.last_key.as_slice() {
loop {
self.heap.pop();
}
}
- self.heap = BinaryHeap::from_iter(self.sources.iter().filter_map(|s| {
- let mut it = s.iter();
+
+ // backwards seek; reset heap
+ let mut finished: Vec<Box<dyn Iter + 'a>> = Vec::new();
+ let mut heap_entries: Vec<MergeEntry<'a>> = Vec::new();
+ for mut it in self
+ .heap
+ .drain()
+ .map(|me| me.it)
+ .chain(self.finished.drain(..))
+ {
it.seek(key);
- Some(MergeEntry {
- e: it.next()?,
- it: Box::new(it),
- })
- }));
+ match it.next() {
+ Some(e) => heap_entries.push(MergeEntry { e, it }),
+ None => finished.push(it),
+ }
+ }
+ self.heap = BinaryHeap::from_iter(heap_entries);
+ self.finished = finished;
self.last_key.clear();
self.last_key.extend_from_slice(key);
}
impl<'a, S: Source> Source for Merger<'a, S> {
fn iter(&self) -> impl Iter {
+ let mut v: Vec<Box<dyn Iter>> = Vec::new();
+ let h = BinaryHeap::from_iter(self.sources.iter().filter_map(|s| {
+ let mut it = s.iter();
+ match it.next() {
+ Some(e) => Some(MergeEntry {
+ e,
+ it: Box::new(it),
+ }),
+ None => {
+ v.push(Box::new(it));
+ None
+ }
+ }
+ }));
MergeIter {
+ finished: v,
+ heap: h,
last_key: Vec::new(),
- sources: self.sources.as_slice(),
- heap: BinaryHeap::from_iter(self.sources.as_slice().iter().filter_map(|s| {
- let mut it = s.iter();
- Some(MergeEntry {
- e: it.next()?,
- it: Box::new(it),
- })
- })),
}
}
}