async-once-watch 0.1.1

Asynchronous and shareable container which value is set once.
Documentation
use async_once_watch::OnceWatch;
use async_std::task::{sleep, spawn};
use futures::future;
use once_cell::sync::Lazy;
use rand::prelude::*;
use std::time::Duration;

#[async_std::test]
async fn pubsub_test() {
    static STATE: Lazy<OnceWatch<u8>> = Lazy::new(OnceWatch::new);

    let secret: u8 = rand::thread_rng().gen();

    let producer = spawn(async move {
        sleep(Duration::from_millis(200)).await;

        assert!(STATE.set(secret).is_ok());
        assert_eq!(STATE.set(secret), Err(secret));
    });

    let fast_consumers = (0..16).map(|_| {
        spawn(async move {
            assert!(STATE.try_get().is_none());

            let received = *STATE.get().await;
            assert_eq!(received, secret);
        })
    });

    let slow_consumers = (0..16).map(|_| {
        spawn(async move {
            sleep(Duration::from_millis(500)).await;

            let received = *STATE.get().await;
            assert_eq!(received, secret);
        })
    });

    futures::join!(
        producer,
        future::join_all(fast_consumers),
        future::join_all(slow_consumers)
    );
}