use core::ops::AddAssign;
use core::ops::SubAssign;
use core::time::Duration;
pub trait Instant: Clone + Copy + SubAssign<Duration> + AddAssign<Duration> {
fn now() -> Self;
fn elapsed(&self) -> core::time::Duration;
}
pub trait Sleeper {
fn sleep(&mut self, duration: core::time::Duration);
}
pub trait AsyncSleeper {
#[allow(async_fn_in_trait)]
async fn sleep(&mut self, duration: core::time::Duration);
}
#[cfg(feature = "std")]
impl Instant for std::time::Instant {
fn now() -> Self {
std::time::Instant::now()
}
fn elapsed(&self) -> core::time::Duration {
self.elapsed()
}
}
#[cfg(feature = "std")]
#[derive(Default)]
pub struct StdSleeper;
#[cfg(feature = "std")]
impl Sleeper for StdSleeper {
fn sleep(&mut self, duration: core::time::Duration) {
std::thread::sleep(duration)
}
}
#[cfg(feature = "spin_sleep")]
#[derive(Default)]
pub struct SpinSleeper;
#[cfg(feature = "spin_sleep")]
impl Sleeper for SpinSleeper {
fn sleep(&mut self, duration: core::time::Duration) {
spin_sleep::sleep(duration)
}
}