use interweave::{Observer, Step, StepCx, World, explore};
#[derive(Default)]
pub struct Counts {
pub traces: usize,
pub states: usize,
}
impl Observer for Counts {
fn step(&mut self, step: Step<'_>, cx: StepCx<'_, '_>) {
if let Step::Visit = step {
self.states += 1;
if cx.state().is_terminal() {
self.traces += 1;
}
}
}
}
pub fn size(default: usize) -> usize {
std::env::args()
.nth(1)
.and_then(|s| s.parse().ok())
.unwrap_or(default)
}
pub fn explore_counts<F: Fn(&mut World)>(program: F) -> Counts {
let mut counts = Counts::default();
if let Err(failed) = explore(&program, &mut counts) {
eprintln!("unexpected failure: {failed}");
}
counts
}