# Halo elm inspired state manager in rust # Run Example ```bash git clone github.com/AlexanderChen1989/halo cd halo cargo run --example counter ``` --- # Understand Example ## define Model ```rust #[derive(Debug, Clone, PartialEq)] pub struct Model { num: i64, others: Vec, } impl Model { pub fn new(num: i64) -> Model { Model { num: num, others: vec![], } } } ``` ## define Msg and update to handle Msg ```rust #[derive(Debug)] pub enum Msg { Incr(i64), Decr(i64), Add(i64), Nothing, } pub fn update(msg: Msg, model: Model) -> Model { let mut model = model; match msg { Msg::Incr(v) => { model.num += v; model } Msg::Decr(v) => { model.num -= v; model } Msg::Add(v) => { model.others.push(v); model } Msg::Nothing => model, } } ``` ## define store hierachy ```rust pub struct Stores { pub a: Store, pub b: Store, } impl Stores { pub fn new() -> Stores { Stores { a: Store::new(Model::new(10), update), b: Store::new(Model::new(20), update), } } } ``` ## use stores ```rust extern crate halo; mod stores; mod counter; use stores::Stores; use counter::{Model, Msg}; fn main() { let mut stores = Stores::new(); // subsribe function to listen store's model change stores.a.subscribe(sub); stores.b.subscribe(sub); // dispatch action(Msg) to store stores.a.dispatch(Msg::Incr(10)); stores.a.dispatch(Msg::Nothing); stores.b.dispatch(Msg::Decr(20)); stores.b.dispatch(Msg::Add(100)); fn sub(model: &Model) { println!("Sub {:?}", model); } } ``` ```bash cargo run --example counter ... Sub Model { num: 20, others: [] } Sub Model { num: 0, others: [] } Sub Model { num: 0, others: [100] } ```