#[cfg(test)]
use std::fmt::Debug;
pub trait JoinSemilattice: Sized {
fn join(self, other: Self) -> Self;
}
#[cfg(test)]
pub fn assert_join_semilattice_laws<T>(values: &[T])
where T: JoinSemilattice + Clone + Eq + Debug {
for a in values {
assert_eq!(a.clone().join(a.clone()), *a);
for b in values {
assert_eq!(a.clone().join(b.clone()), b.clone().join(a.clone()));
for c in values {
let lhs = a.clone().join(b.clone()).join(c.clone());
let rhs = a.clone().join(b.clone().join(c.clone()));
assert_eq!(lhs, rhs);
}
}
}
}
#[cfg(test)]
pub fn assert_strong_eventual_consistency<T>(base: T, deltas: &[T])
where T: JoinSemilattice + Clone + Eq + Debug {
let forward = deltas
.iter()
.cloned()
.fold(base.clone(), JoinSemilattice::join);
let reverse = deltas
.iter()
.rev()
.cloned()
.fold(base.clone(), JoinSemilattice::join);
let duplicated = deltas
.iter()
.cloned()
.chain(deltas.iter().cloned())
.fold(base, JoinSemilattice::join);
assert_eq!(forward, reverse);
assert_eq!(forward, duplicated);
}