use core::future::Future;
use core::pin::Pin;
use core::task::{Context, Poll};
use core::time::Duration;
use crate::Timeout;
pub fn with_deadline<F, T, E>(
_deadline: Duration,
future: F,
) -> DeadlineFuture<F>
where
F: Future<Output = Result<T, E>>,
E: From<Timeout>,
{
DeadlineFuture {
inner: future,
_deadline,
}
}
pub struct DeadlineFuture<F> {
inner: F,
_deadline: Duration,
}
impl<F> DeadlineFuture<F> {
pub fn deadline(&self) -> Duration {
self._deadline
}
}
impl<F, T, E> Future for DeadlineFuture<F>
where
F: Future<Output = Result<T, E>>,
E: From<Timeout>,
{
type Output = Result<T, E>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let inner = unsafe { self.map_unchecked_mut(|s| &mut s.inner) };
inner.poll(cx)
}
}