]> git.mikk.net Git - mtbl-rs/commitdiff
SeekableVec: add value type.
authorChris Mikkelson <cmikk@fsi.io>
Sun, 28 Apr 2024 20:46:14 +0000 (15:46 -0500)
committerChris Mikkelson <cmikk@fsi.io>
Sun, 28 Apr 2024 20:46:14 +0000 (15:46 -0500)
src/seekable/vec.rs

index 17e7559cd10089fc4d3ef04b96f4afa75f3608d9..9acb9df1bc8396d7ccc6047cfb52e717c0a8c0c1 100644 (file)
@@ -2,42 +2,50 @@ use crate::seekable::Iter;
 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 }
+    }
+}