3 unstable releases

0.2.1 Jul 25, 2024
0.2.0 Jul 18, 2024
0.1.0 Jul 17, 2024

#457 in No standard library

Download history 1489/week @ 2024-10-13 1184/week @ 2024-10-20 409/week @ 2024-10-27 88/week @ 2024-11-03 340/week @ 2024-11-10 720/week @ 2024-11-17 538/week @ 2024-11-24 531/week @ 2024-12-01 494/week @ 2024-12-08 600/week @ 2024-12-15 713/week @ 2024-12-22 865/week @ 2024-12-29 550/week @ 2025-01-05 254/week @ 2025-01-12 162/week @ 2025-01-19 52/week @ 2025-01-26

1,024 downloads per month

GPL-3.0-or-later OR Apache-2…

8KB
132 lines

lazyinit

Crates.io Docs.rs CI

Initialize a static value lazily.

Unlike lazy_static, which hardcodes the initialization routine in a macro, you can initialize the value in any way.

Examples

use lazyinit::LazyInit;

static VALUE: LazyInit<u32> = LazyInit::new();
assert!(!VALUE.is_inited());
// println!("{}", *VALUE); // panic: use uninitialized value
assert_eq!(VALUE.get(), None);

VALUE.init_once(233);
// VALUE.init_once(666); // panic: already initialized
assert!(VALUE.is_inited());
assert_eq!(*VALUE, 233);
assert_eq!(VALUE.get(), Some(&233));

Only one of the multiple initializations can succeed:

use lazyinit::LazyInit;
use std::time::Duration;

const N: usize = 16;
static VALUE: LazyInit<usize> = LazyInit::new();

let threads = (0..N)
    .map(|i| {
        std::thread::spawn(move || {
            std::thread::sleep(Duration::from_millis(10));
            VALUE.call_once(|| i)
        })
    })
    .collect::<Vec<_>>();

let mut ok = 0;
for (i, thread) in threads.into_iter().enumerate() {
    if thread.join().unwrap().is_some() {
        ok += 1;
        assert_eq!(*VALUE, i);
    }
}

assert_eq!(ok, 1);

No runtime deps