1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use std::{
    future::Future,
    pin::Pin,
    time::{Duration, Instant},
};

/// Represents tokio timer utilities
#[cfg(feature = "tokio-comp")]
mod tokio_timer;

/// Represents async-std timer utilities
#[cfg(feature = "async-std-comp")]
mod async_std_timer;

/// Runtime agnostic sleep and timer utils
pub mod timer {
    #[cfg(feature = "async-std-comp")]
    pub use crate::utils::async_std_timer::AsyncStdTimer;
    #[cfg(feature = "tokio-comp")]
    pub use crate::utils::tokio_timer::TokioTimer;
}

/// A timer which provides timer-like functions.
pub trait Timer {
    /// Return a future that resolves in `duration` time.
    fn sleep(&self, duration: Duration) -> Pin<Box<dyn Sleep>>;

    /// Return a future that resolves at `deadline`.
    fn sleep_until(&self, deadline: Instant) -> Pin<Box<dyn Sleep>>;

    /// Reset a future to resolve at `new_deadline` instead.
    fn reset(&self, sleep: &mut Pin<Box<dyn Sleep>>, new_deadline: Instant) {
        *sleep = self.sleep_until(new_deadline);
    }
}

/// A future returned by a `Timer`.
pub trait Sleep: Send + Sync + Future<Output = ()> {}