use std::future::Future;
use std::time::{Duration, Instant};
pub trait Clock {
type Sleep: Future<Output = ()>;
fn now(&self) -> Instant;
fn sleep(&self, dur: Duration) -> Self::Sleep;
}
impl<C: Clock + ?Sized> Clock for &C {
type Sleep = C::Sleep;
fn now(&self) -> Instant {
(**self).now()
}
fn sleep(&self, dur: Duration) -> Self::Sleep {
(**self).sleep(dur)
}
}
impl<C: Clock + ?Sized> Clock for std::sync::Arc<C> {
type Sleep = C::Sleep;
fn now(&self) -> Instant {
(**self).now()
}
fn sleep(&self, dur: Duration) -> Self::Sleep {
(**self).sleep(dur)
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct TokioClock;
impl Clock for TokioClock {
type Sleep = tokio::time::Sleep;
fn now(&self) -> Instant {
tokio::time::Instant::now().into_std()
}
fn sleep(&self, dur: Duration) -> tokio::time::Sleep {
tokio::time::sleep(dur)
}
}