use futures::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
pub struct AttachFuture<F, T>
where
F: Future + Unpin,
{
original_future: F,
value: Option<T>,
}
impl<F, T> Unpin for AttachFuture<F, T> where F: Future + Unpin {}
impl<F, T> Future for AttachFuture<F, T>
where
F: Future + Unpin,
{
type Output = F::Output;
fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output> {
let result = Pin::new(&mut self.original_future).poll(cx);
if result.is_ready() {
self.value.take();
}
result
}
}
pub trait Attach: Future
where
Self: Unpin,
{
fn attach<T>(self, value: T) -> AttachFuture<Self, T>
where
Self: Sized,
{
AttachFuture {
original_future: self,
value: Some(value),
}
}
}
impl<F> Attach for F where F: Future + Unpin {}