tokio_delayed_queue 0.2.0

Asynchronous delayed queue for Tokio runtime.
Documentation
use std::num::NonZeroUsize;
use std::time::Duration;
use tokio_delayed_queue::DelayedQueue;

////////////////////////////////////////////////////////////////////////////////

#[tokio::test]
async fn test_func_bound() {
    let queue = DelayedQueue::new_bound(NonZeroUsize::new(16).unwrap());
    test_code(queue).await;
}

////////////////////////////////////////////////////////////////////////////////

#[tokio::test]
async fn test_func_unbound() {
    let queue = DelayedQueue::new_unbound();
    test_code(queue).await;
}

////////////////////////////////////////////////////////////////////////////////

async fn test_code(queue: DelayedQueue<i32>) {
    queue.push(1, Duration::from_secs(1)).await;
    queue.push(1, Duration::from_secs(2)).await;

    let v = queue.pop().await;
    assert_eq!(v, 1);

    let j1 = tokio::spawn({
        let queue = queue.clone();
        async move {
            let dropped_future = queue.pop();
            drop(dropped_future);

            let dropped_future = queue.pop();
            drop(dropped_future);

            let v = queue.pop().await;
            assert_eq!(v, 1);

            let v = queue.pop().await;
            assert_eq!(v, 1);
        }
    });

    let j2 = tokio::spawn({
        let queue = queue.clone();
        async move {
            let dropped_future = queue.pop();
            drop(dropped_future);

            let v = queue.pop().await;
            assert_eq!(v, 1);
        }
    });

    let j3 = tokio::spawn({
        let queue = queue.clone();
        async move {
            let v = queue.pop().await;
            assert_eq!(v, 1);
        }
    });

    queue.push(1, Duration::from_secs(3)).await;
    queue.push(1, Duration::from_secs(4)).await;
    queue.push(1, Duration::from_secs(4)).await;
    queue.push(1, Duration::from_secs(5)).await;

    j1.await.unwrap();
    j2.await.unwrap();
    j3.await.unwrap();

    let v = queue.pop().await;
    assert_eq!(v, 1);
}