use tokio::time::Instant;
use crate::core::time::{Clock, MonoNs, Timer};
#[derive(Clone, Copy, Debug)]
pub struct TokioClock {
origin: Instant,
}
impl TokioClock {
#[must_use]
pub fn new() -> Self {
Self {
origin: Instant::now(),
}
}
}
impl Default for TokioClock {
fn default() -> Self {
Self::new()
}
}
impl Clock for TokioClock {
fn monotonic_ns(&self) -> MonoNs {
MonoNs(u64::try_from(self.origin.elapsed().as_nanos()).unwrap_or(u64::MAX))
}
}
impl Timer for TokioClock {
async fn sleep_until(&self, at: MonoNs) {
tokio::time::sleep_until(self.origin + core::time::Duration::from_nanos(at.0)).await;
}
}