use std::future::Future;
use std::time::{Duration, Instant};
use async_io::Timer;
use futures_lite::future::or;
pub trait FutureTimeout<T>: Future<Output = T> + Sized {
fn timeout(self, duration: Duration) -> impl Future<Output = Option<T>> {
let this = async { Some(self.await) };
let timeout = async move {
sleep(duration).await;
None
};
or(this, timeout)
}
}
impl<T, F: Future<Output = T>> FutureTimeout<T> for F {}
pub async fn sleep(duration: Duration) {
Timer::after(duration).await;
}
pub async fn sleep_until(instant: Instant) {
Timer::at(instant).await;
}