use std::time::{Duration, Instant};
pub trait Clock {
fn now(&self) -> Instant;
fn sleep(&self, dur: Duration);
}
impl<C: Clock + ?Sized> Clock for &C {
fn now(&self) -> Instant {
(**self).now()
}
fn sleep(&self, dur: Duration) {
(**self).sleep(dur);
}
}
impl<C: Clock + ?Sized> Clock for std::sync::Arc<C> {
fn now(&self) -> Instant {
(**self).now()
}
fn sleep(&self, dur: Duration) {
(**self).sleep(dur);
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct StdClock;
impl Clock for StdClock {
fn now(&self) -> Instant {
Instant::now()
}
fn sleep(&self, dur: Duration) {
std::thread::sleep(dur);
}
}