alopt 0.1.0

a Rust crate providing efficient synchronization primitives that integrate Option into their design.
Documentation
use std::sync::Arc;
use std::thread;

use alopt::alo::thread::{Wom, Worl};

#[test]
fn test_worl_sync() {
    let worl = Worl::<i8>::new(0);

    assert_eq!(*worl.read().unwrap(), 0);

    *worl.write().unwrap() += 3;
    assert_eq!(*worl.read().unwrap(), 3);

    worl.clear().unwrap();
    assert!(worl.read().is_err());

    worl.set(67).unwrap();
    assert_eq!(*worl.read().unwrap(), 67);

    {
        let worl_guard = worl.read().unwrap();
        assert!(worl.write().is_err());
        assert_eq!(*worl_guard, 67);
    }

    {
        let mut worl_guard = worl.write().unwrap();
        assert!(worl.write().is_err());
        *worl_guard = 54;
    }
    assert_eq!(*worl.read().unwrap(), 54);
}

#[test]
fn test_worl_threaded() {
    use std::time::Duration;

    let worl = Arc::new(Worl::<i8>::new(0));

    let mut reader_handles = Vec::new();
    for _ in 0..5000 {
        let worl_reader = worl.clone();
        reader_handles.push(thread::spawn(move || {
            thread::sleep(Duration::from_millis(500));
            match worl_reader.read() {
                Ok(guard) => *guard,
                Err(_) => -1,
            }
        }));
    }

    let worl_writer = worl.clone();
    let writer_handle = thread::spawn(move || {
        thread::sleep(Duration::from_millis(30));
        let mut guard = worl_writer.write().unwrap();
        *guard += 10;
    });
    writer_handle.join().unwrap();

    for handle in reader_handles {
        let value = handle.join().unwrap();
        assert!(value == 0 || value == 10);
    }

    let worl_clear = worl.clone();
    let clear_handle = thread::spawn(move || {
        worl_clear.clear().unwrap();
    });
    clear_handle.join().unwrap();

    assert!(worl.read().is_err());

    let worl_set = worl.clone();
    let set_handle = thread::spawn(move || {
        worl_set.set(42).unwrap();
    });
    set_handle.join().unwrap();

    let value = *worl.read().unwrap();
    assert_eq!(value, 42);
}

#[test]
fn test_wom_sync() {
    let wom = Wom::new(10);

    {
        let v = wom.get_mut().unwrap();
        assert_eq!(*v, 10);
    }

    {
        let mut guard = wom.lock().unwrap();
        *guard += 5;
    }
    assert_eq!(*wom.get_mut().unwrap(), 15);

    let empty_wom = Wom::<i32>::empty();
    assert!(empty_wom.get_mut().is_err());
    assert!(empty_wom.lock().is_err());
}

#[test]
fn test_wom_threaded() {
    let wom = Arc::new(Wom::new(0));
    const THREAD_COUNT: usize = 10;
    let mut handles = Vec::with_capacity(THREAD_COUNT);

    for _ in 0..THREAD_COUNT {
        let wom_clone = Arc::clone(&wom);
        let handle = thread::spawn(move || {
            let mut guard = wom_clone.lock().unwrap();
            *guard += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    assert_eq!(*wom.get_mut().unwrap(), THREAD_COUNT as i32);
}