#![feature(coroutines, coroutine_trait)]
use rand::{rngs::SmallRng as Rng, RngCore as RngT, SeedableRng};
use desim::resources::SimpleResource;
use desim::{Effect, EndCondition, Simulation};
fn main() {
let mut s = Simulation::new();
let cpu = s.create_resource(Box::new(SimpleResource::new(1)));
let p1 = s.create_process(Box::new(move |_| {
for _ in 0..10 {
yield Effect::Request(cpu);
yield Effect::TimeOut(5.0);
yield Effect::Release(cpu);
}
}));
let p2 = s.create_process(Box::new(move |_| {
let mut rng = Rng::from_entropy();
loop {
yield Effect::Request(cpu);
yield Effect::TimeOut((rng.next_u32() % 10) as f64);
yield Effect::Release(cpu);
}
}));
s.schedule_event(0.0, p1, Effect::TimeOut(0.));
s.schedule_event(17.0, p2, Effect::TimeOut(0.));
s = s.run(EndCondition::Time(100.0));
for e in s.processed_events().iter().map(|e| format!("{:?}", e)) {
println!("{}", e);
}
}