txmap 2.1.0

A concurrent transactional hash map for Rust with fine-grained locking, internal mutability and composable transactions
Documentation
use crate::{
    prelude::*,
    tests::{
        creators::*,
        data::*,
        types::{Increment, IncrementKeys, IncrementParams},
    },
};

#[test]
fn empty_values_in_guard() {
    let map = empty_map();
    let tx = map
        .prepared_tx(&Increment::SCHEMA)
        .require("Alice exists", Increment::k, |_k, v, _p, _s| v.is_some())
        .modify(Increment::k, |_k, _v, _p, _s| {})
        .into_transaction();
    assert!(matches!(
        tx.execute(IncrementKeys { k: ALICE.into() }, IncrementParams {}),
        TxResult::RequirementNotMet(0, _, _)
    ));
}

#[test]
fn one_failed_requirement_can_veto_transaction() {
    let map = map_alice(1);
    let result = map
        .prepared_tx(&Increment::SCHEMA)
        .require("Exists", Increment::k, |_k, v, _p, _s| v.is_some())
        .require("> 0", Increment::k, |_k, v, _p, _s| {
            v.is_some_and(|x| *x > 0)
        })
        .require("== 1", Increment::k, |_k, v, _p, _s| {
            v.is_some_and(|x| *x == 1)
        })
        .require("> 99", Increment::k, |_k, v, _p, _s| {
            v.is_some_and(|x| *x > 99)
        })
        .modify(Increment::k, |_, v, _, _| *v = 100)
        .into_transaction()
        .execute(IncrementKeys { k: ALICE.into() }, IncrementParams {});
    assert!(matches!(result, TxResult::RequirementNotMet(3, _, _)));
    assert_eq!(map.get_copied(&ALICE.into()), Some(1));
}