prolly-map 0.3.0

Content-addressed versioned map storage primitives.
Documentation
use prolly::{resolver, Config, MemStore, Prolly, Resolution, Resolver};

fn main() -> Result<(), prolly::Error> {
    let prolly = Prolly::new(MemStore::new(), Config::default());

    let base = prolly.create();
    let base = prolly.put(&base, b"setting:theme".to_vec(), b"system".to_vec())?;

    let left = prolly.delete(&base, b"setting:theme")?;
    let right = prolly.put(&base, b"setting:theme".to_vec(), b"dark".to_vec())?;

    let update_wins = prolly.merge(&base, &left, &right, Some(Box::new(resolver::update_wins)))?;
    assert_eq!(
        prolly.get(&update_wins, b"setting:theme")?,
        Some(b"dark".to_vec())
    );

    let delete_wins = prolly.merge(&base, &left, &right, Some(Box::new(resolver::delete_wins)))?;
    assert_eq!(prolly.get(&delete_wins, b"setting:theme")?, None);

    let leave_unresolved: Resolver = Box::new(|conflict| {
        if conflict.key.starts_with(b"setting:") {
            Resolution::unresolved()
        } else {
            resolver::prefer_right(conflict)
        }
    });

    assert!(prolly
        .merge(&base, &left, &right, Some(leave_unresolved))
        .is_err());

    println!("delete/update conflict can resolve to value, delete, or error");
    Ok(())
}