use std::sync::Arc;
use crate::ManualMonotonicClock;
use crate::MonotonicClock;
use crate::MonotonicInstant;
use crate::TimeError;
use crate::Timer;
use crate::TimerFuture;
use crate::timer::internal::manual_timer_future::ManualTimerFuture;
#[derive(Debug)]
pub struct ManualTimer {
clock: Arc<ManualMonotonicClock>,
}
impl ManualTimer {
#[must_use]
#[inline]
pub fn from_clock(clock: &ManualMonotonicClock) -> Self {
Self {
clock: Arc::new(clock.same_domain_handle()),
}
}
}
impl Timer for ManualTimer {
#[inline(always)]
fn clock(&self) -> &dyn MonotonicClock {
self.clock.as_ref()
}
#[inline]
fn at(&self, deadline: MonotonicInstant) -> Result<TimerFuture, TimeError> {
let future = ManualTimerFuture::register(Arc::clone(&self.clock), deadline)?;
Ok(Box::pin(future))
}
}