use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
use crate::env::EnvHandle;
#[derive(Debug)]
pub struct Timeout {
deadline: f64,
scheduled: bool,
env: EnvHandle,
}
impl Timeout {
pub(crate) fn new(deadline: f64, env: EnvHandle) -> Self {
Timeout {
deadline,
scheduled: false,
env,
}
}
}
impl Future for Timeout {
type Output = ();
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
if self.scheduled && self.env.now() >= self.deadline {
return Poll::Ready(());
}
if !self.scheduled {
self.env.schedule_wakeup(self.deadline, cx.waker().clone());
self.scheduled = true;
}
Poll::Pending
}
}