tincan 0.3.0

A lightweight reactive state management library for Rust.
Documentation
//! Counter example with effects
//!
//! Demonstrates how effects automatically track dependencies and re-run when signals change.
//!
//! Run with: cargo run --example counter

use std::cell::Cell;
use std::rc::Rc;
use tincan::Scope;

fn main() {
    println!("=== Counter with Effects ===\n");

    let cx = Scope::new();

    // Create a counter signal
    let count = cx.signal(0);

    // Track how many times the effect runs
    let effect_runs = Rc::new(Cell::new(0));

    // Create an effect that logs the count
    let count_clone = count.clone();
    let effect_runs_clone = Rc::clone(&effect_runs);
    let _effect = cx.effect(move || {
        effect_runs_clone.set(effect_runs_clone.get() + 1);
        println!(
            "Effect run #{}: Count is {}",
            effect_runs_clone.get(),
            count_clone.get()
        );
    });

    println!("\nIncrementing counter...");
    count.set(1);
    count.set(2);
    count.set(3);

    println!("\nUsing update to increment:");
    for _ in 0..3 {
        count.update(|n| *n += 1);
    }

    println!("\nFinal count: {}", count.get());
    println!("Total effect runs: {}", effect_runs.get());

    // Multiple effects on same signal
    println!("\n=== Multiple Effects ===\n");
    let cx2 = Scope::new();
    let value = cx2.signal(10);

    let value_clone1 = value.clone();
    let _effect1 = cx2.effect(move || {
        println!("Effect 1: Value = {}", value_clone1.get());
    });

    let value_clone2 = value.clone();
    let _effect2 = cx2.effect(move || {
        println!(
            "Effect 2: Value squared = {}",
            value_clone2.get() * value_clone2.get()
        );
    });

    value.set(5);
    value.set(3);
}