use shigunaru::{create_computed, create_effect, Signal};
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
let initial_value = if args.len() > 1 {
args[1].parse::<i32>().unwrap_or(1)
} else {
1
};
print_header();
run_demo(initial_value);
}
fn print_header() {
println!("Shigunaru - Reactive Signals Library Demo");
println!("=========================================");
println!("A lightweight reactive signals library in Rust");
println!("");
}
fn run_demo(initial_value: i32) {
println!("Starting demo with initial value: {}", initial_value);
println!("");
let counter = Signal::new(initial_value);
let counter_for_computed = counter.clone();
let doubled = create_computed(move || {
let counter_value = *counter_for_computed.get().borrow();
counter_value * 2
});
println!("Setting up effects...");
let doubled_signal = doubled.signal().clone();
create_effect(
move || {
println!(
" [Effect] Computed value (doubled): {}",
*doubled_signal.get().borrow()
);
},
doubled.signal(),
);
let counter_effect = counter.clone();
create_effect(
move || {
println!(
" [Effect] Counter value: {}",
*counter_effect.get().borrow()
);
},
&counter,
);
println!("\n--- Initial state ---");
counter.notify();
for value in [5, 10, 42, 100].iter() {
println!("\n--- Setting counter to {} ---", value);
counter.set(*value);
}
println!("\nDemo complete. Thanks for trying Shigunaru!");
println!("For more examples, run: cargo run --example counter");
}