minerva 0.2.0

Causal ordering for distributed systems
//! Seal-consignment fixtures and consumers.

mod cases;
mod properties;

use super::*;
use crate::metis::Vouched;

/// Drives a boundary and its declared window through adoption and sealing.
fn seal_mill(declarer: u32, boundary: &Cut, window: &[(u32, u64)]) -> (Adopted, SealedEpoch) {
    let mut stability = Stability::new([1, 2]);
    stability.report_cut(1, boundary).unwrap();
    stability.report_cut(2, boundary).unwrap();
    let mut epochs = Epochs::new([1, 2], NonZeroUsize::new(1).unwrap());
    let dot = d(declarer, boundary.as_vector().get(declarer) + 1);
    let declaration = epochs
        .declare(dot, rank(dot.counter()), &stability, &Cut::bottom())
        .unwrap();
    let mut delivered = boundary.as_vector().clone();
    delivered.observe(dot.station(), dot.counter());
    for &(station, index) in window {
        delivered.observe(station, index);
    }
    let delivered = Cut::from_witnessed(delivered);
    stability.report_cut(1, &delivered).unwrap();
    stability.report_cut(2, &delivered).unwrap();
    epochs
        .confirm(declaration.address(), &Vouched::trust(1, delivered.clone()))
        .unwrap();
    epochs
        .confirm(declaration.address(), &Vouched::trust(2, delivered.clone()))
        .unwrap();
    let adopted = epochs
        .adopt(1, delivered.as_vector().get(1), &stability)
        .unwrap();
    epochs
        .adopt_report(
            declaration.address(),
            &Vouched::trust(2, delivered.as_vector().get(2)),
        )
        .unwrap();
    let sealed = epochs
        .try_seal(&stability)
        .expect("a complete window seals")
        .clone();
    (adopted, sealed)
}