tincan 0.3.0

A lightweight reactive state management library for Rust.
Documentation
//! Temperature converter example
//!
//! Demonstrates signal combinators (map, zip) and bidirectional relationships.
//!
//! Run with: cargo run --example temperature

use tincan::Scope;

fn main() {
    println!("=== Temperature Converter ===\n");

    let cx = Scope::new();

    // Primary temperature source in Celsius
    let celsius = cx.signal(0);

    // Derived Fahrenheit signal
    let fahrenheit = celsius.map(|c| c * 9 / 5 + 32);

    // Derived Kelvin signal
    let kelvin = celsius.map(|c| c + 273);

    // Effect to display all temperatures
    let celsius_clone = celsius.clone();
    let fahrenheit_clone = fahrenheit.clone();
    let kelvin_clone = kelvin.clone();
    let _display = cx.effect(move || {
        println!(
            "🌡️  {}°C = {}°F = {}K",
            celsius_clone.get(),
            fahrenheit_clone.get(),
            kelvin_clone.get()
        );
    });

    // Test various temperatures
    println!("Water freezing point:");
    celsius.set(0);
    
    println!("\nRoom temperature:");
    celsius.set(20);
    
    println!("\nWater boiling point:");
    celsius.set(100);
    
    println!("\nVery cold:");
    celsius.set(-40); // The temperature where Celsius and Fahrenheit are equal!

    // Using zip to combine signals
    println!("\n=== Combining Multiple Sensors ===\n");
    
    let cx2 = Scope::new();
    let sensor1 = cx2.signal(20);
    let sensor2 = cx2.signal(22);
    
    let average = sensor1.clone()
        .zip(sensor2.clone())
        .map(|(t1, t2)| (t1 + t2) / 2);
    
    let sensor1_clone = sensor1.clone();
    let sensor2_clone = sensor2.clone();
    let average_clone = average.clone();
    let _sensor_display = cx2.effect(move || {
        println!(
            "Sensor 1: {}°C, Sensor 2: {}°C, Average: {}°C",
            sensor1_clone.get(),
            sensor2_clone.get(),
            average_clone.get()
        );
    });
    
    println!("Initial readings:");
    println!();
    
    println!("Sensor 1 increases:");
    sensor1.set(25);
    
    println!("\nSensor 2 increases:");
    sensor2.set(27);
    
    println!("\nBoth change:");
    sensor1.set(30);
    sensor2.set(30);
}