extern crate alloc;
use super::super::support::dot;
use crate::metis::{Dot, DotMap, DotSet, Dotted};
mod boundary;
mod dot_map;
mod flow;
type Doc = Dotted<DotMap<u8, DotSet>>;
fn dots(pairs: &[(u32, u64)]) -> DotSet {
let mut set = DotSet::new();
for &(station, counter) in pairs {
assert!(set.insert(dot(station, counter)));
}
set
}
fn add(doc: &mut Doc, station: u32, key: u8) -> (Doc, Dot) {
let fresh = doc.next_dot(station);
let delta = Dotted::from_store(DotMap::singleton(
key,
dots(&[(fresh.station(), fresh.counter())]),
));
*doc = doc.merge(&delta);
(delta, fresh)
}
fn remove_observed(doc: &mut Doc, key: u8) -> Doc {
let observed = doc.store().get(&key).cloned().unwrap_or_default();
let delta = Dotted::from_context(observed);
*doc = doc.merge(&delta);
delta
}