use crate::Seekable;
#[derive(Debug)]
-pub struct SeekableVec<T: Ord + Copy> {
+pub struct SeekableVec<K: Ord + Copy, V: Ord + Copy> {
off: usize,
- v: Vec<T>,
+ v: Vec<(K, V)>,
}
-impl<T: Ord + Copy> IntoIterator for SeekableVec<T> {
- type Item = (T, ());
+impl<K: Ord + Copy, V: Ord + Copy> IntoIterator for SeekableVec<K, V> {
+ type Item = (K, V);
type IntoIter = Iter<Self>;
fn into_iter(self) -> Iter<Self> {
Iter(self)
}
}
-impl<T: Ord + Copy> Seekable for SeekableVec<T> {
- type Key = T;
- type Value = ();
- fn next(&mut self) -> Option<(T, ())> {
+impl<K: Ord + Copy, V: Ord + Copy> Seekable for SeekableVec<K, V> {
+ type Key = K;
+ type Value = V;
+ fn next(&mut self) -> Option<(K, V)> {
if self.off >= self.v.len() {
return None;
}
let v = self.v[self.off];
self.off += 1;
- Some((v, ()))
+ Some(v)
}
- fn seek(&mut self, key: &T) {
+ fn seek(&mut self, key: &K) {
self.off = 0;
while self.off < self.v.len() {
- if self.v[self.off] >= *key {
+ if self.v[self.off].0 >= *key {
break;
}
self.off += 1;
}
}
}
-impl<T: Ord + Copy> From<Vec<T>> for SeekableVec<T> {
- fn from(vec: Vec<T>) -> SeekableVec<T> {
+impl<K: Ord + Copy, V: Ord + Copy> From<Vec<(K, V)>> for SeekableVec<K, V> {
+ fn from(vec: Vec<(K, V)>) -> SeekableVec<K, V> {
let mut sv = SeekableVec { off: 0, v: vec };
sv.v.sort();
sv
}
}
+
+impl<K: Ord + Copy> From<Vec<K>> for SeekableVec<K, ()> {
+ fn from(vec: Vec<K>) -> SeekableVec<K, ()> {
+ let mut pv = vec.into_iter().map(|k| (k, ())).collect::<Vec<(K, ())>>();
+ pv.sort();
+ SeekableVec { off: 0, v: pv }
+ }
+}