use nexus_rt::{Handler, IntoHandler, Local, ResMut, WorldBuilder, new_resource};
new_resource!(RunningTotal(i64));
new_resource!(Output(Vec<u32>));
fn counting_handler(mut count: Local<u64>, event: &'static str) {
*count += 1;
println!("[counter] call #{}: event = {}", *count, event);
}
fn accumulator(mut sum: Local<i64>, mut total: ResMut<RunningTotal>, value: i64) {
*sum += value;
**total += value;
println!("[accumulator] local_sum={}, world_total={}", *sum, total.0);
}
fn batch_writer(mut buf: Local<Vec<u32>>, mut output: ResMut<Output>, value: u32) {
buf.push(value);
if buf.len() >= 3 {
println!("[batch] flushing {} events to output", buf.len());
output.extend(buf.drain(..));
}
}
fn main() {
println!("=== Example 1: Simple counter ===\n");
{
let mut world = WorldBuilder::new().build();
let mut sys = counting_handler.into_handler(world.registry());
sys.run(&mut world, "alpha");
sys.run(&mut world, "beta");
sys.run(&mut world, "gamma");
}
println!("\n=== Example 2: Independent instances ===\n");
{
let mut builder = WorldBuilder::new();
builder.register(RunningTotal(0));
let mut world = builder.build();
let mut sys_a = accumulator.into_handler(world.registry());
let mut sys_b = accumulator.into_handler(world.registry());
println!("sys_a gets 10:");
sys_a.run(&mut world, 10i64);
println!("sys_b gets 20:");
sys_b.run(&mut world, 20i64);
println!("sys_a gets 5:");
sys_a.run(&mut world, 5i64);
println!("\nWorld total: {}", world.resource::<RunningTotal>().0);
assert_eq!(world.resource::<RunningTotal>().0, 35);
}
println!("\n=== Example 3: Batch buffer ===\n");
{
let mut builder = WorldBuilder::new();
builder.register(Output(Vec::new()));
let mut world = builder.build();
let mut sys = batch_writer.into_handler(world.registry());
sys.run(&mut world, 1u32);
println!(" output len: {}", world.resource::<Output>().len());
sys.run(&mut world, 2u32);
println!(" output len: {}", world.resource::<Output>().len());
sys.run(&mut world, 3u32);
println!(" output len: {}", world.resource::<Output>().len());
sys.run(&mut world, 4u32);
println!(" output len: {}", world.resource::<Output>().len());
let output = world.resource::<Output>();
println!("\nFinal output: {:?}", &**output);
assert_eq!(&**output, &[1, 2, 3]);
}
println!("\nDone.");
}