atomic-try-update 0.0.2

Primitives that make it easy to implement correct lock-free algorithms
Documentation
use std::error::Error;

use atomic_try_update::once::{OnceLockFree, OnceLockFreeError};

#[test]
fn smoke_test() -> Result<(), Box<dyn Error>> {
    let a = OnceLockFree::default();
    a.set(1u64)?;
    assert_eq!(a.get()?, &1u64);
    assert_eq!(a.set(1u64), Err(OnceLockFreeError::AlreadySet));
    assert_eq!(a.get()?, &1u64);

    let a = OnceLockFree::default();
    assert_eq!(
        a.set_prepared(1u64),
        Err(OnceLockFreeError::UnpreparedForSet)
    );

    let a = OnceLockFree::default();
    let x = a.get_or_prepare_to_set()?;
    assert_eq!(x, None);
    a.set_prepared(0u8)?;
    assert_eq!(a.get_or_prepare_to_set()?, Some(&0u8));

    let a = OnceLockFree::default();
    let x = a.get_poll();
    assert_eq!(x, None);
    a.set(1234u16)?;
    let x = a.get_poll();
    assert_eq!(x, Some(&1234_u16));

    let a = OnceLockFree::default();
    let x = a.get_or_seal()?;
    assert_eq!(x, None);
    let x = a.get_or_seal()?;
    assert_eq!(x, None);
    assert_eq!(a.set(1u8), Err(OnceLockFreeError::AlreadySet));

    let a = OnceLockFree::default();
    a.set(1u8)?;
    let x = a.get_or_seal()?;
    assert_eq!(x, Some(&1u8));
    let x = a.get_or_seal()?;
    assert_eq!(x, Some(&1u8));
    assert_eq!(a.set(1u8), Err(OnceLockFreeError::AlreadySet));

    Ok(())
}