use antichain::{Frontier, Lattice, MapLattice, WithBottom};
type WorkerId = u64;
type ShardId = u64;
type SeqNo = u64;
fn worker_advance(seq: SeqNo) -> SeqNo {
seq
}
fn shard_join(
a: &MapLattice<WorkerId, SeqNo>,
b: &MapLattice<WorkerId, SeqNo>,
) -> MapLattice<WorkerId, SeqNo> {
a.join(b)
}
fn shard_frontier(shard: &MapLattice<WorkerId, SeqNo>) -> Frontier<SeqNo> {
Frontier::from_elements(shard.values().copied())
}
fn cluster_frontier(shards: &MapLattice<ShardId, SeqNo>) -> Frontier<SeqNo> {
Frontier::from_elements(shards.values().copied())
}
fn main() {
let mut shard0: MapLattice<WorkerId, SeqNo> = MapLattice::new();
shard0.insert(0, worker_advance(100));
shard0.insert(1, worker_advance(80));
let mut shard1: MapLattice<WorkerId, SeqNo> = MapLattice::new();
shard1.insert(2, worker_advance(95));
shard1.insert(3, worker_advance(110));
let sf0 = shard_frontier(&shard0); let sf1 = shard_frontier(&shard1);
assert_eq!(sf0.elements(), &[80u64], "shard 0 frontier");
assert_eq!(sf1.elements(), &[95u64], "shard 1 frontier");
println!("Shard 0 frontier: {:?}", sf0.elements());
println!("Shard 1 frontier: {:?}", sf1.elements());
let cluster_map = shard_join(&shard0, &shard1);
let cf = cluster_frontier(&cluster_map); assert_eq!(cf.elements(), &[80u64], "cluster frontier");
println!("Cluster frontier: {:?}", cf.elements());
let cf_via_meet = sf0.meet(&sf1);
assert_eq!(cf_via_meet, cf, "cluster via meet == cluster via map");
shard0.insert(4, worker_advance(70)); let sf0_updated = shard_frontier(&shard0); assert_eq!(sf0_updated.elements(), &[70u64], "shard 0 after new worker");
println!("Shard 0 after worker 4 joins: {:?}", sf0_updated.elements());
let updates = [100u64, 80, 95, 110, 70];
let observer_a = updates.iter().fold(Frontier::bottom(), |acc, &u| {
acc.meet(&Frontier::from_elem(u))
});
let observer_b = updates.iter().rev().fold(Frontier::bottom(), |acc, &u| {
acc.meet(&Frontier::from_elem(u))
});
assert_eq!(observer_a, observer_b, "convergence: order independent");
println!(
"Convergence verified: both observers → {:?}",
observer_a.elements()
);
let not_started: Frontier<WithBottom<SeqNo>> = Frontier::from_elem(WithBottom::Bottom);
let started: Frontier<WithBottom<SeqNo>> = Frontier::from_elem(WithBottom::Value(50));
let merged = not_started.meet(&started);
assert_eq!(
merged.elements(),
&[WithBottom::Bottom],
"not-started absorbs meet"
);
println!("WithBottom sentinel: not_started.meet(started) = Bottom ✓");
let mut view_a: MapLattice<ShardId, SeqNo> = MapLattice::new();
view_a.insert(0, 80); let mut view_b: MapLattice<ShardId, SeqNo> = MapLattice::new();
view_b.insert(1, 95);
let unified = view_a.join(&view_b);
let global = cluster_frontier(&unified); assert_eq!(global.elements(), &[80u64], "unified cluster");
println!(
"Unified cluster (partial views merged): {:?}",
global.elements()
);
println!();
println!("Phase 8.2 adapter sufficiency check: PASSED");
println!("API exercised:");
println!(" Frontier<u64> — Phases 1, 2");
println!(" MapLattice<K, u64> — Phase 7.1");
println!(" Frontier<WithBottom> — Phase 7.3");
println!(" Frontier::meet/join — Phase 1");
println!("No missing primitives found. SumOrder and IntervalSetLattice not needed.");
}