#![feature(coroutines, coroutine_trait)]
use desim::resources::SimpleStore;
use desim::{Effect, EndCondition, SimState, Simulation, StoreId};
#[derive(Default, Clone, Debug)]
enum MyState {
#[default]
Continue,
Push(StoreId, u32),
Pull(StoreId),
Wait(f64),
}
impl SimState for MyState {
fn get_effect(&self) -> Effect {
match self {
MyState::Continue => Effect::TimeOut(0.),
MyState::Push(id, _) => Effect::Push(*id),
MyState::Pull(id) => Effect::Pull(*id),
MyState::Wait(time) => Effect::TimeOut(*time),
}
}
fn set_effect(&mut self, effect: Effect) {
*self = match effect {
Effect::Push(id) => MyState::Push(id, 0),
Effect::Pull(id) => MyState::Pull(id),
_ => unimplemented!(),
};
}
fn should_log(&self) -> bool {
true
}
}
fn main() {
let mut s = Simulation::new();
let queue = s.create_store(Box::new(SimpleStore::new(1)));
let p1 = s.create_process(Box::new(move |_| {
for i in 0..10 {
yield MyState::Push(queue, i);
yield MyState::Wait(10.0);
}
}));
let p2 = s.create_process(Box::new(move |_| {
for _ in 0..10 {
let ret = yield MyState::Pull(queue);
println!("ret: {:?}", ret);
}
}));
s.schedule_event(0.0, p1, MyState::default());
s.schedule_event(17.0, p2, MyState::default());
s = s.run(EndCondition::NoEvents);
for e in s.processed_events().iter().map(|e| format!("{:?}", e)) {
println!("{}", e);
}
}