use std::future::Future;
use std::task::Poll;
pub fn join<A: Future, B: Future>(a: A, b: B) -> impl Future<Output = (A::Output, B::Output)> {
let mut a = Box::pin(a);
let mut b = Box::pin(b);
let mut output_a = None;
let mut output_b = None;
std::future::poll_fn(move |context| {
if output_a.is_none() {
if let Poll::Ready(value) = a.as_mut().poll(context) {
output_a = Some(value);
}
}
if output_b.is_none() {
if let Poll::Ready(value) = b.as_mut().poll(context) {
output_b = Some(value);
}
}
match (output_a.take(), output_b.take()) {
(Some(x), Some(y)) => Poll::Ready((x, y)),
(x, y) => {
output_a = x;
output_b = y;
Poll::Pending
}
}
})
}
#[cfg(test)]
#[path = "join.test.rs"]
mod tests;