///| A reproducible two-replica example. It creates a write at alpha, sends the
///|
/// write while beta is offline, then shows delivery after beta recovers.
fn main {
let simulator = @causal.Simulator::new(["alpha", "beta"], 1_000).unwrap()
ignore(simulator.local_event("alpha", "create note").unwrap())
ignore(simulator.set_online("beta", false).unwrap())
ignore(simulator.send("alpha", "beta", "note:v1", 20).unwrap())
ignore(simulator.advance_to(1_020).unwrap())
println(
"while beta is offline, queued=" + simulator.pending().length().to_string(),
)
ignore(simulator.set_online("beta", true).unwrap())
let delivered = simulator.advance_to(1_020).unwrap()
println("after recovery, delivered=" + delivered.length().to_string())
let analysis = @causal.TraceAnalysis::new(simulator.trace()).unwrap()
println("direct causal edges=" + analysis.direct_edges().length().to_string())
println(
"concurrent event pairs=" + analysis.concurrent_pairs().length().to_string(),
)
for event in simulator.trace() {
println(
event.sequence.to_string() +
" " +
event.replica +
" " +
event.stamp.to_string(),
)
}
}