differential_dataflow/trace/cursor/
mod.rs1use timely::progress::Timestamp;
9
10use crate::difference::Semigroup;
11pub use crate::IntoOwned;
13use crate::lattice::Lattice;
14
15pub mod cursor_list;
16
17pub use self::cursor_list::CursorList;
18
19pub trait Cursor {
21
22 type Key<'a>: Copy + Clone + Ord;
24 type Val<'a>: Copy + Clone + Ord;
26 type Time: Timestamp + Lattice + Ord + Clone;
28 type TimeGat<'a>: Copy + IntoOwned<'a, Owned = Self::Time>;
30 type Diff: Semigroup + 'static;
32 type DiffGat<'a> : Copy + IntoOwned<'a, Owned = Self::Diff>;
34
35 type Storage;
37
38 fn key_valid(&self, storage: &Self::Storage) -> bool;
42 fn val_valid(&self, storage: &Self::Storage) -> bool;
46
47 fn key<'a>(&self, storage: &'a Self::Storage) -> Self::Key<'a>;
49 fn val<'a>(&self, storage: &'a Self::Storage) -> Self::Val<'a>;
51
52 fn get_key<'a>(&self, storage: &'a Self::Storage) -> Option<Self::Key<'a>> {
54 if self.key_valid(storage) { Some(self.key(storage)) } else { None }
55 }
56 fn get_val<'a>(&self, storage: &'a Self::Storage) -> Option<Self::Val<'a>> {
58 if self.val_valid(storage) { Some(self.val(storage)) } else { None }
59 }
60
61 fn map_times<L: FnMut(Self::TimeGat<'_>, Self::DiffGat<'_>)>(&mut self, storage: &Self::Storage, logic: L);
64
65 fn step_key(&mut self, storage: &Self::Storage);
67 fn seek_key(&mut self, storage: &Self::Storage, key: Self::Key<'_>);
69
70 fn step_val(&mut self, storage: &Self::Storage);
72 fn seek_val(&mut self, storage: &Self::Storage, val: Self::Val<'_>);
74
75 fn rewind_keys(&mut self, storage: &Self::Storage);
77 fn rewind_vals(&mut self, storage: &Self::Storage);
79
80 fn to_vec<K, V>(&mut self, storage: &Self::Storage) -> Vec<((K, V), Vec<(Self::Time, Self::Diff)>)>
82 where
83 for<'a> Self::Key<'a> : IntoOwned<'a, Owned = K>,
84 for<'a> Self::Val<'a> : IntoOwned<'a, Owned = V>,
85 {
86 let mut out = Vec::new();
87 self.rewind_keys(storage);
88 while self.key_valid(storage) {
89 self.rewind_vals(storage);
90 while self.val_valid(storage) {
91 let mut kv_out = Vec::new();
92 self.map_times(storage, |ts, r| {
93 kv_out.push((ts.into_owned(), r.into_owned()));
94 });
95 out.push(((self.key(storage).into_owned(), self.val(storage).into_owned()), kv_out));
96 self.step_val(storage);
97 }
98 self.step_key(storage);
99 }
100 out
101 }
102}