transaction-stm 0.2.0

transaction abstraction of stm
Documentation
extern crate stm;
extern crate transaction;
extern crate transaction_stm;

use transaction::prelude::*;
use transaction_stm::{run, with_tx};

fn main() {
    let x = stm::TVar::new(0);
    let y = stm::TVar::new(0);

    let inc_xy = with_tx(|ctx| {
        let xv = ctx.read(&x)?;
        ctx.write(&x, xv + 1)?;
        Ok(xv)
    }).and_then(|_| {
        with_tx(|ctx| {
            let yv = ctx.read(&y)?;
            ctx.write(&y, yv + 1)?;
            Ok(yv)
        })
    })
        .and_then(|_| with_tx(|ctx| Ok(ctx.read(&x)? + ctx.read(&y)?)));
    let ret = run(&inc_xy);
    assert_eq!(ret, 2);

}