minerva 0.2.0

Causal ordering for distributed systems
use super::super::support::dot;
use crate::metis::{DotMap, DotSet, Dotted, Received};

mod common;
mod owed;
mod rows;

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 seen(peer: u32, pairs: &[(u32, u64)]) -> Received {
    Received::trust(peer, dots(pairs))
}

fn write(doc: &mut Doc, station: u32, key: u8) {
    let fresh = doc.next_dot(station);
    let mut held = DotSet::new();
    assert!(held.insert(fresh));
    let delta = Dotted::from_store(DotMap::singleton(key, held));
    *doc = doc.merge(&delta);
}