#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MonoNs(pub u64);
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct DurNs(pub u64);
impl MonoNs {
#[must_use]
pub const fn since(self, earlier: MonoNs) -> DurNs {
DurNs(self.0.saturating_sub(earlier.0))
}
#[must_use]
pub const fn after(self, d: DurNs) -> MonoNs {
MonoNs(self.0.saturating_add(d.0))
}
}
pub trait Clock {
fn monotonic_ns(&self) -> MonoNs;
}
#[expect(
async_fn_in_trait,
reason = "the waiter is single-threaded by design; no Send bound is wanted"
)]
pub trait Timer {
async fn sleep_until(&self, at: MonoNs);
}
impl<C: Clock + ?Sized> Clock for &C {
fn monotonic_ns(&self) -> MonoNs {
(**self).monotonic_ns()
}
}