differential_dogs3/
altneu.rs1use serde::{Deserialize, Serialize};
15
16#[derive(Debug, Hash, Default, Clone, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
18pub struct AltNeu<T> {
19 pub time: T,
20 pub neu: bool, }
22
23impl<T> AltNeu<T> {
24 pub fn alt(time: T) -> Self { AltNeu { time, neu: false } }
25 pub fn neu(time: T) -> Self { AltNeu { time, neu: true } }
26}
27
28use timely::order::PartialOrder;
30impl<T: PartialOrder> PartialOrder for AltNeu<T> {
31 fn less_equal(&self, other: &Self) -> bool {
32 if self.time.eq(&other.time) {
33 self.neu <= other.neu
34 }
35 else {
36 self.time.less_equal(&other.time)
37 }
38 }
39}
40
41use timely::progress::PathSummary;
44impl<T: Timestamp> PathSummary<AltNeu<T>> for () {
45 fn results_in(&self, timestamp: &AltNeu<T>) -> Option<AltNeu<T>> {
46 Some(timestamp.clone())
47 }
48 fn followed_by(&self, other: &Self) -> Option<Self> {
49 Some(other.clone())
50 }
51}
52
53use timely::progress::Timestamp;
55impl<T: Timestamp> Timestamp for AltNeu<T> {
56 type Summary = ();
57 fn minimum() -> Self { AltNeu::alt(T::minimum()) }
58}
59
60use timely::progress::timestamp::Refines;
61
62impl<T: Timestamp> Refines<T> for AltNeu<T> {
63 fn to_inner(other: T) -> Self {
64 AltNeu::alt(other)
65 }
66 fn to_outer(self: AltNeu<T>) -> T {
67 self.time
68 }
69 fn summarize(_path: ()) -> <T as Timestamp>::Summary {
70 Default::default()
71 }
72}
73
74use differential_dataflow::lattice::Lattice;
77impl<T: Lattice> Lattice for AltNeu<T> {
78 fn join(&self, other: &Self) -> Self {
79 let time = self.time.join(&other.time);
80 let mut neu = false;
81 if time == self.time {
82 neu = neu || self.neu;
83 }
84 if time == other.time {
85 neu = neu || other.neu;
86 }
87 AltNeu { time, neu }
88 }
89 fn meet(&self, other: &Self) -> Self {
90 let time = self.time.meet(&other.time);
91 let mut neu = true;
92 if time == self.time {
93 neu = neu && self.neu;
94 }
95 if time == other.time {
96 neu = neu && other.neu;
97 }
98 AltNeu { time, neu }
99 }
100}