use crate::compat::Duration;
use core::future::Future;
pub trait Sleeper {
type Sleep: Future<Output = ()>;
fn sleep(&self, dur: Duration) -> Self::Sleep;
}
impl<F, Fut> Sleeper for F
where
F: Fn(Duration) -> Fut,
Fut: Future<Output = ()>,
{
type Sleep = Fut;
fn sleep(&self, dur: Duration) -> Self::Sleep {
(self)(dur)
}
}
#[cfg(feature = "tokio-sleep")]
#[must_use]
pub fn tokio() -> fn(Duration) -> tokio::time::Sleep {
tokio::time::sleep
}
#[cfg(all(feature = "gloo-timers-sleep", target_arch = "wasm32"))]
#[must_use]
pub fn gloo() -> fn(Duration) -> gloo_timers::future::TimeoutFuture {
gloo_timers::future::sleep
}
#[cfg(feature = "futures-timer-sleep")]
#[must_use]
pub fn futures_timer() -> fn(Duration) -> futures_timer::Delay {
futures_timer::Delay::new
}
#[cfg(feature = "embassy-sleep")]
#[must_use]
pub fn embassy() -> fn(Duration) -> embassy_time::Timer {
embassy_sleep_fn
}
#[cfg(feature = "embassy-sleep")]
fn embassy_sleep_fn(dur: Duration) -> embassy_time::Timer {
embassy_time::Timer::after(to_embassy_duration(dur))
}
#[cfg(feature = "embassy-sleep")]
fn to_embassy_duration(dur: Duration) -> embassy_time::Duration {
const MAX_U64_AS_U128: u128 = u64::MAX as u128;
let micros_u128 = dur.as_micros();
let micros = if micros_u128 > MAX_U64_AS_U128 {
u64::MAX
} else {
micros_u128 as u64
};
embassy_time::Duration::from_micros(micros)
}