Seesaw
A deterministic event/handler runtime with TypeId-based multi-event dispatch.
Guarantees
- Multi-event dispatch: Support for multiple event types via TypeId routing.
- Handler system: Register handlers that react to events and can emit new events and access shared dependencies.
Example
use seesaw::{Engine, on};
// Define event types (struct-per-event pattern)
#[derive(Clone)]
struct UserCreated { name: String }
#[derive(Clone)]
struct UserWelcomed { name: String }
// Create engine with handlers
let engine = Engine::in_memory(deps)
.with_handler(on::<UserCreated>().then(|event, _ctx| async move {
println!("User created: {}", event.name);
Ok(UserWelcomed { name: event.name.clone() })
}));
// Emit + settle the full causal tree.
engine.emit(UserCreated { name: "Alice".into() }).settled().await?;