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()
}