#value #thread-safe #container #consumption #once #one-time #store

take-once

A thread-safe container for one-time storage and one-time consumption of a value

3 releases

new 0.1.2 Dec 14, 2024
0.1.1 Dec 14, 2024
0.1.0 Dec 14, 2024

#602 in Concurrency

Download history 315/week @ 2024-12-12

315 downloads per month
Used in async-oneshot-channel

MIT license

16KB
230 lines

take-once

License Cargo Documentation

A thread-safe container for one-time storage and one-time consumption of a value.

Usage

use take_once::TakeOnce;

let cell = TakeOnce::new();

// Initial store succeeds
assert_eq!(cell.store(42), None);

// Subsequent stores return the provided value
assert_eq!(cell.store(24), Some(24));

// Take the value
assert_eq!(cell.take(), Some(42));

// Can't take twice
assert_eq!(cell.take(), None);

// Can be used across threads via `Arc`
use std::sync::Arc;
use std::thread;

let cell = Arc::new(TakeOnce::new());

let cell_clone = cell.clone();
let handle = thread::spawn(move || {
    assert_eq!(cell_clone.take(), Some(42));
});
handle.join().unwrap();

assert_eq!(cell.take(), Some(42));

See the documentation for more details.

Testing

This crate uses shuttle for (more) exhaustive testing. To run the shuttle tests, run:

cargo test --features _shuttle

License

MIT

Dependencies

~0–23MB
~324K SLoC