pub mod delay;
pub(super) mod driver;
pub mod interval;
pub mod limiter;
pub(super) mod registration;
pub mod timeout;
pub mod wheel;
pub use delay::Delay;
pub use interval::Interval;
pub use limiter::{RateLimiter, RatePermit};
pub use timeout::{Timeout, TimeoutError};
pub use wheel::{TimerCommand, TimerWheel};
use std::future::Future;
use std::time::{Duration, Instant};
pub(crate) fn clamped_deadline(base: Instant, duration: Duration) -> Instant {
const MAX_TIMER: Duration = Duration::from_secs(100 * 365 * 24 * 60 * 60);
base.checked_add(duration.min(MAX_TIMER)).unwrap_or(base)
}
pub fn sleep(duration: Duration) -> Delay {
Delay::new(duration)
}
pub fn timeout<F>(duration: Duration, future: F) -> Timeout<F>
where
F: Future,
{
Timeout::new(future, duration)
}
pub fn interval(period: Duration) -> Interval {
Interval::new(period)
}
pub fn interval_at(start: Instant, period: Duration) -> Interval {
Interval::new_at(start, period)
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Instant;
#[test]
fn test_delay_basic() {
let delay = Delay::new(Duration::from_millis(10));
assert!(delay.deadline() > Instant::now());
}
#[test]
fn test_sleep_function() {
let timer = sleep(Duration::from_millis(10));
assert!(timer.deadline() > Instant::now());
}
fn one_year_from_now() -> Instant {
Instant::now() + Duration::from_secs(365 * 24 * 60 * 60)
}
#[test]
fn delay_extreme_duration_does_not_panic() {
let delay = Delay::new(Duration::MAX);
assert!(delay.deadline() > one_year_from_now());
}
#[test]
fn delay_reset_extreme_duration_does_not_panic() {
let mut delay = Delay::new(Duration::from_millis(1));
delay.reset(Duration::MAX);
assert!(delay.deadline() > one_year_from_now());
}
#[test]
fn interval_extreme_period_does_not_panic() {
let timer = interval(Duration::MAX);
assert!(timer.next_tick() > one_year_from_now());
let mut timer = interval(Duration::from_millis(1));
timer.set_period(Duration::MAX);
assert!(timer.next_tick() > one_year_from_now());
}
}