txmap 3.3.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::*},
};

#[test]
fn get_or_insert_creates_entry() {
    let map = empty_map();
    let result = map
        .immediate_tx::<GetOneState>()
        .get_or_insert(ALICE.into(), 42, |_k, v, s| s.result = Some(*v))
        .execute();
    assert_eq!(
        result,
        TxResult::Completed {
            state: GetOneState { result: Some(42) }
        }
    );
    assert_eq!(map.get_copied(&ALICE.into()), Some(42));
}

#[test]
fn get_or_insert_does_not_overwrite_existing() {
    let map = map_alice(1);
    let result = map
        .immediate_tx::<GetOneState>()
        .get_or_insert(ALICE.into(), 42, |_k, v, s| s.result = Some(*v))
        .execute();
    assert_eq!(
        result,
        TxResult::Completed {
            state: GetOneState { result: Some(1) }
        }
    );
    assert_eq!(map.get_copied(&ALICE.into()), Some(1));
}

#[test]
fn get_or_insert_with_creates_entry() {
    let map = empty_map();
    let result = map
        .immediate_tx::<GetOneState>()
        .get_or_insert_with(
            ALICE.into(),
            |k, _s| k.len() as u64,
            |_k, v, s| s.result = Some(*v),
        )
        .execute();
    assert_eq!(
        result,
        TxResult::Completed {
            state: GetOneState {
                result: Some(ALICE.len() as u64)
            }
        }
    );
}

#[test]
fn get_or_insert_with_does_not_call_generator_when_present() {
    let map = map_alice(1);
    let mut generator_calls = 0;
    let result = map
        .immediate_tx::<GetOneState>()
        .get_or_insert_with(
            ALICE.into(),
            |_k, _s| {
                generator_calls += 1;
                42
            },
            |_k, v, s| s.result = Some(*v),
        )
        .execute();
    assert_eq!(generator_calls, 0);
    assert_eq!(
        result,
        TxResult::Completed {
            state: GetOneState { result: Some(1) }
        }
    );
}