1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
//! Traits and types for navigating order sequences of update tuples.
//!
//! The `Cursor` trait contains several methods for efficiently navigating ordered collections
//! of tuples of the form `(key, val, time, diff)`. The cursor is different from an iterator
//! both because it allows navigation on multiple levels (key and val), but also because it
//! supports efficient seeking (via the `seek_key` and `seek_val` methods).
use timely::progress::Timestamp;
use crate::difference::Semigroup;
use crate::lattice::Lattice;
pub mod cursor_list;
pub use self::cursor_list::CursorList;
pub use timely::container::flatcontainer::IntoOwned;
/// A cursor for navigating ordered `(key, val, time, diff)` updates.
pub trait Cursor {
/// Key by which updates are indexed.
type Key<'a>: Copy + Clone + Ord;
/// Values associated with keys.
type Val<'a>: Copy + Clone + Ord;
/// Timestamps associated with updates
type Time: Timestamp + Lattice + Ord + Clone;
/// Borrowed form of timestamp.
type TimeGat<'a>: Copy + IntoOwned<'a, Owned = Self::Time>;
/// Owned form of update difference.
type Diff: Semigroup + 'static;
/// Borrowed form of update difference.
type DiffGat<'a> : Copy + IntoOwned<'a, Owned = Self::Diff>;
/// Storage required by the cursor.
type Storage;
/// Indicates if the current key is valid.
///
/// A value of `false` indicates that the cursor has exhausted all keys.
fn key_valid(&self, storage: &Self::Storage) -> bool;
/// Indicates if the current value is valid.
///
/// A value of `false` indicates that the cursor has exhausted all values for this key.
fn val_valid(&self, storage: &Self::Storage) -> bool;
/// A reference to the current key. Asserts if invalid.
fn key<'a>(&self, storage: &'a Self::Storage) -> Self::Key<'a>;
/// A reference to the current value. Asserts if invalid.
fn val<'a>(&self, storage: &'a Self::Storage) -> Self::Val<'a>;
/// Returns a reference to the current key, if valid.
fn get_key<'a>(&self, storage: &'a Self::Storage) -> Option<Self::Key<'a>> {
if self.key_valid(storage) { Some(self.key(storage)) } else { None }
}
/// Returns a reference to the current value, if valid.
fn get_val<'a>(&self, storage: &'a Self::Storage) -> Option<Self::Val<'a>> {
if self.val_valid(storage) { Some(self.val(storage)) } else { None }
}
/// Applies `logic` to each pair of time and difference. Intended for mutation of the
/// closure's scope.
fn map_times<L: FnMut(Self::TimeGat<'_>, Self::DiffGat<'_>)>(&mut self, storage: &Self::Storage, logic: L);
/// Advances the cursor to the next key.
fn step_key(&mut self, storage: &Self::Storage);
/// Advances the cursor to the specified key.
fn seek_key(&mut self, storage: &Self::Storage, key: Self::Key<'_>);
/// Advances the cursor to the next value.
fn step_val(&mut self, storage: &Self::Storage);
/// Advances the cursor to the specified value.
fn seek_val(&mut self, storage: &Self::Storage, val: Self::Val<'_>);
/// Rewinds the cursor to the first key.
fn rewind_keys(&mut self, storage: &Self::Storage);
/// Rewinds the cursor to the first value for current key.
fn rewind_vals(&mut self, storage: &Self::Storage);
/// Rewinds the cursor and outputs its contents to a Vec
fn to_vec<K, V>(&mut self, storage: &Self::Storage) -> Vec<((K, V), Vec<(Self::Time, Self::Diff)>)>
where
for<'a> Self::Key<'a> : IntoOwned<'a, Owned = K>,
for<'a> Self::Val<'a> : IntoOwned<'a, Owned = V>,
{
let mut out = Vec::new();
self.rewind_keys(storage);
while self.key_valid(storage) {
self.rewind_vals(storage);
while self.val_valid(storage) {
let mut kv_out = Vec::new();
self.map_times(storage, |ts, r| {
kv_out.push((ts.into_owned(), r.into_owned()));
});
out.push(((self.key(storage).into_owned(), self.val(storage).into_owned()), kv_out));
self.step_val(storage);
}
self.step_key(storage);
}
out
}
}