minerva 0.2.0

Causal ordering for distributed systems
extern crate alloc;

use crate::metis::{DotMap, DotSet, Dotted};
use alloc::vec::Vec;
use proptest::prelude::*;

mod convergence;
mod coverage;
mod equivalence;

type Doc = DotMap<u8, DotSet>;

#[derive(Clone, Debug)]
enum Op {
    Add { composer: usize, key: u8 },
    Remove { composer: usize, key: u8 },
    Gossip { from: usize, to: usize },
}

const SCRIBES: usize = 3;

fn arb_ops() -> impl Strategy<Value = Vec<Op>> {
    let op = prop_oneof![
        (0..SCRIBES, 0u8..3).prop_map(|(composer, key)| Op::Add { composer, key }),
        (0..SCRIBES, 0u8..3).prop_map(|(composer, key)| Op::Remove { composer, key }),
        (0..SCRIBES, 0..SCRIBES).prop_map(|(from, to)| Op::Gossip { from, to }),
    ];
    prop::collection::vec(op, 0..24)
}

fn observed(state: &Dotted<Doc>, key: u8) -> DotSet {
    state.store().get(&key).cloned().unwrap_or_default()
}