#![cfg_attr(not(test), no_std)]
#[cfg(test)]
mod tests;
pub trait SimpleClock {
fn now_us(&self) -> u64;
}
pub struct ElapsedTimer<'a, T> {
clock: &'a T,
now: u64,
}
impl<'a, T: SimpleClock> ElapsedTimer<'a, T> {
pub fn new(clock: &'a T) -> Self {
Self {
clock,
now: clock.now_us(),
}
}
pub fn restart(&mut self) -> u64 {
let elapsed = self.elapsed();
self.now = self.clock.now_us();
elapsed
}
pub fn elapsed(&self) -> u64 {
self.clock.now_us().saturating_sub(self.now)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DeadlineReached(());
#[derive(Debug)]
pub struct Deadline<'a, C: SimpleClock> {
clock: &'a C,
deadline: u64,
}
impl<'a, C: SimpleClock> Deadline<'a, C> {
pub fn new(clock: &'a C, timeout: u64) -> Self {
Self {
clock,
deadline: clock.now_us() + timeout,
}
}
pub fn reached(&self) -> Result<(), DeadlineReached> {
if self.clock.now_us() > self.deadline {
Err(DeadlineReached(()))
} else {
Ok(())
}
}
}