1use core::future::Future;
2use core::future::Ready;
3use core::time::Duration;
4
5pub trait Sleeper: 'static {
7 type Sleep: Future;
9
10 fn sleep(&self, dur: Duration) -> Self::Sleep;
12}
13
14#[doc(hidden)]
17pub trait MaybeSleeper: 'static {
18 type Sleep: Future;
19}
20
21impl<T: Sleeper + ?Sized> MaybeSleeper for T {
23 type Sleep = <T as Sleeper>::Sleep;
24}
25
26impl<F: Fn(Duration) -> Fut + 'static, Fut: Future> Sleeper for F {
28 type Sleep = Fut;
29
30 fn sleep(&self, dur: Duration) -> Self::Sleep {
31 self(dur)
32 }
33}
34
35#[cfg(all(not(feature = "tokio-sleep"), not(feature = "gloo-timers-sleep"),))]
39pub type DefaultSleeper = PleaseEnableAFeatureOrProvideACustomSleeper;
40#[cfg(all(not(target_arch = "wasm32"), feature = "tokio-sleep"))]
44pub type DefaultSleeper = TokioSleeper;
45#[cfg(all(target_arch = "wasm32", feature = "gloo-timers-sleep"))]
49pub type DefaultSleeper = GlooTimersSleep;
50
51#[doc(hidden)]
55#[allow(dead_code)]
56#[derive(Clone, Copy, Debug, Default)]
57pub struct PleaseEnableAFeatureOrProvideACustomSleeper;
58
59impl MaybeSleeper for PleaseEnableAFeatureOrProvideACustomSleeper {
61 type Sleep = Ready<()>;
62}
63
64#[cfg(all(not(target_arch = "wasm32"), feature = "tokio-sleep"))]
69#[derive(Clone, Copy, Debug, Default)]
70pub struct TokioSleeper;
71
72#[cfg(all(not(target_arch = "wasm32"), feature = "tokio-sleep"))]
73impl Sleeper for TokioSleeper {
74 type Sleep = tokio::time::Sleep;
75
76 fn sleep(&self, dur: Duration) -> Self::Sleep {
77 tokio::time::sleep(dur)
78 }
79}
80
81#[cfg(feature = "futures-timer-sleep")]
87#[derive(Clone, Copy, Debug, Default)]
88pub struct FuturesTimerSleeper;
89
90#[cfg(feature = "futures-timer-sleep")]
91impl Sleeper for FuturesTimerSleeper {
92 type Sleep = futures_timer::Delay;
93
94 fn sleep(&self, dur: Duration) -> Self::Sleep {
95 futures_timer::Delay::new(dur)
96 }
97}
98
99#[cfg(all(target_arch = "wasm32", feature = "gloo-timers-sleep"))]
101#[derive(Clone, Copy, Debug, Default)]
102pub struct GlooTimersSleep;
103
104#[cfg(all(target_arch = "wasm32", feature = "gloo-timers-sleep"))]
105impl Sleeper for GlooTimersSleep {
106 type Sleep = gloo_timers::future::TimeoutFuture;
107
108 fn sleep(&self, dur: Duration) -> Self::Sleep {
109 gloo_timers::future::sleep(dur)
110 }
111}