leaky-bucket 1.1.2

A token-based rate limiter based on the leaky bucket algorithm.
Documentation
use std::future::Future;
use std::pin::pin;
use std::sync::Arc;
use std::task::Context;
use std::thread;

use leaky_bucket::RateLimiter;

struct Waker;

impl std::task::Wake for Waker {
    fn wake(self: Arc<Self>) {}
}

#[test]
fn test_fast_paths() {
    let limiter = Arc::new(
        RateLimiter::builder()
            .max(10000)
            .initial(10000)
            .fair(false)
            .build(),
    );

    let mut threads = Vec::new();

    for _ in 0..100 {
        let limiter = limiter.clone();

        threads.push(thread::spawn(move || {
            let waker = Arc::new(Waker).into();
            let mut cx = Context::from_waker(&waker);

            for _ in 0..100 {
                let acquire = pin!(limiter.acquire(1));
                assert!(acquire.poll(&mut cx).is_ready());
            }
        }));
    }

    for thread in threads {
        thread.join().unwrap();
    }
}