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
use std::iter::Peekable;
use ::Data;
use lattice::{close_under_join, Lattice};
use collection::compact::Compact;
use iterators::merge::{Merge, MergeIterator};
use iterators::coalesce::{Coalesce, CoalesceIterator};
pub trait Trace where for<'a> &'a Self: TraceRef<'a, Self::Key, Self::Index, Self::Value> {
type Key: Data;
type Index: Lattice;
type Value: Data;
fn set_difference(&mut self, time: Self::Index, accumulation: Compact<Self::Key, Self::Value>);
fn trace<'a>(&'a self, key: &Self::Key) -> <&'a Self as TraceRef<'a,Self::Key,Self::Index,Self::Value>>::TIterator {
TraceRef::<'a,Self::Key,Self::Index,Self::Value>::trace(self, key)
}
fn get_difference<'a>(&'a self, key: &Self::Key, time: &Self::Index)
-> Option<<&'a Self as TraceRef<'a,Self::Key,Self::Index,Self::Value>>::VIterator> {
self.trace(key)
.filter(|x| x.0 == time)
.map(|x| x.1)
.next()
}
fn get_collection<'a>(&'a mut self, key: &Self::Key, time: &Self::Index)
-> CollectionIterator<<&'a Self as TraceRef<'a,Self::Key,Self::Index,Self::Value>>::VIterator> {
self.trace(key)
.into_iter()
.filter(|x| x.0 <= time)
.map(|x| x.1)
.merge()
.coalesce()
.peekable()
}
fn interesting_times<'a>(&'a self, key: &Self::Key, time: &Self::Index, stash: &mut Vec<Self::Index>) {
for iter in self.trace(key) {
if !iter.0.le(time) {
let lub = iter.0.join(time);
if !stash.contains(&lub) {
stash.push(lub);
}
}
}
close_under_join(stash);
}
}
pub trait TraceRef<'a,K,T:'a,V:'a> {
type VIterator: Iterator<Item=(&'a V, i32)>+Clone+'a;
type TIterator: Iterator<Item=(&'a T, Self::VIterator)>+Clone+'a;
fn trace(self, key: &K) -> Self::TIterator;
}
pub type CollectionIterator<VIterator> = Peekable<CoalesceIterator<MergeIterator<VIterator>>>;