convergent 0.1.0

Lightweight, composable CRDTs for decentralized systems
Documentation
use convergent::{GCounter, LWWRegister, Merge, ORSet, PNCounter};

fn main() {
    // --- G-Counter ---
    println!("=== G-Counter ===");
    let mut sensor_a = GCounter::new("north");
    let mut sensor_b = GCounter::new("south");

    sensor_a.increment(12);
    sensor_b.increment(8);

    println!(
        "Before merge: A={}, B={}",
        sensor_a.value(),
        sensor_b.value()
    );
    sensor_a.merge(&sensor_b);
    println!("After merge:  A={}", sensor_a.value());

    // --- PN-Counter ---
    println!("\n=== PN-Counter ===");
    let mut likes_a = PNCounter::new("server-1");
    let mut likes_b = PNCounter::new("server-2");

    likes_a.increment(10);
    likes_b.decrement(3);

    likes_a.merge(&likes_b);
    println!("Total likes: {}", likes_a.value());

    // --- LWW-Register ---
    println!("\n=== LWW-Register ===");
    let mut reg_a = LWWRegister::new(1);
    let mut reg_b = LWWRegister::new(2);

    reg_a.set("draft");
    std::thread::sleep(std::time::Duration::from_millis(2));
    reg_b.set("published");

    reg_a.merge(&reg_b);
    println!("Status: {:?}", reg_a.get());

    // --- OR-Set ---
    println!("\n=== OR-Set ===");
    let mut cart_a = ORSet::new(1);
    let mut cart_b = ORSet::new(2);

    cart_a.insert("bread");
    cart_b.insert("milk");
    cart_b.insert("eggs");

    cart_a.merge(&cart_b);
    println!("Cart: {:?}", cart_a.values());
}