A futures-aware read-write lock for Rust which supports transaction-specific versioning
Example: ```rust use futures::executor::blockon; use txnlock::*;
let lock = TxnLock::new(0, "zero"); { let mut guard = lock.try_write(&1).expect("write lock"); *guard = "one"; }
block_on(lock.commit(&1));
asserteq!(*lock.tryread(&0).expect("old value"), "zero"); asserteq!(*lock.tryread(&1).expect("current value"), "one"); asserteq!(*lock.tryread_exclusive(&2).expect("new value"), "one");
lock.rollback(&2);
{ let mut guard = lock.try_write(&3).expect("write lock"); *guard = "three"; }
lock.finalize(&2);
asserteq!(lock.tryread(&0).unwraperr(), Error::Outdated); asserteq!(lock.try_read(&2).expect("old value"), "one"); assert_eq!(lock.tryread(&3).expect("current value"), "three"); asserteq!(lock.tryread(&4).unwraperr(), Error::WouldBlock); ```