1use std::fmt::Debug;
2use std::hash::Hash;
3
4pub trait Count: Copy {
6 fn zero() -> Self;
8
9 fn add(&mut self, other: Self);
11}
12
13impl Count for u64 {
14 fn zero() -> Self {
16 0
17 }
18
19 fn add(&mut self, other: Self) {
21 *self += other;
22 }
23}
24
25impl Count for (u64, u64) {
26 fn zero() -> Self {
28 (0, 0)
29 }
30
31 fn add(&mut self, other: Self) {
33 self.0 += other.0;
34 self.1 += other.1;
35 }
36}
37
38pub trait Actor: Debug + Clone + Hash + Eq + Ord {}
40impl<A: Debug + Clone + Hash + Eq + Ord> Actor for A {}
41
42pub trait EventSet: Clone + Debug + Default {
44 type EventIter: Iterator<Item = u64>;
45
46 fn new() -> Self;
48
49 fn from_event(event: u64) -> Self {
51 let mut eset = Self::new();
52 eset.add_event(event);
53 eset
54 }
55
56 fn from_event_range(start: u64, end: u64) -> Self {
58 let mut eset = Self::new();
59 eset.add_event_range(start, end);
60 eset
61 }
62
63 fn from_events<I: IntoIterator<Item = u64>>(iter: I) -> Self {
65 let mut eset = Self::new();
66 for event in iter {
67 eset.add_event(event);
68 }
69 eset
70 }
71
72 fn next_event(&mut self) -> u64;
74
75 fn add_event(&mut self, event: u64) -> bool;
77
78 fn add_event_range(&mut self, start: u64, end: u64) -> bool {
80 let mut res = false;
81 (start..=end).for_each(|event| {
82 let added = self.add_event(event);
83 res = res || added;
84 });
85 res
86 }
87
88 fn is_event(&self, event: u64) -> bool;
90
91 fn events(&self) -> (u64, Vec<u64>);
110
111 fn frontier(&self) -> u64;
113
114 fn join(&mut self, other: &Self);
116
117 fn meet(&mut self, other: &Self);
119
120 fn subtracted(&self, other: &Self) -> Vec<u64>;
123
124 fn event_iter(self) -> Self::EventIter;
127}
128
129pub fn subtract_iter<E, S>(from: E, subtract: S) -> SubtractIter<E, S>
130where
131 E: EventSet,
132 S: EventSet,
133{
134 SubtractIter {
135 event_iter: from.event_iter(),
136 subtract,
137 }
138}
139
140pub struct SubtractIter<E: EventSet, S> {
141 event_iter: E::EventIter,
142 subtract: S,
143}
144
145impl<E, S> Iterator for SubtractIter<E, S>
146where
147 E: EventSet,
148 S: EventSet,
149{
150 type Item = u64;
151
152 fn next(&mut self) -> Option<Self::Item> {
153 match self.event_iter.next() {
154 Some(event) => {
155 if self.subtract.is_event(event) {
156 self.next()
157 } else {
158 Some(event)
159 }
160 }
161 None => None,
162 }
163 }
164}