#[macro_export]
macro_rules! try_join {
($($fut:ident),* $(,)?) => { {
async {
use $crate::utils::future::Future;
use $crate::utils::pin::Pin;
use $crate::utils::poll_fn;
use $crate::utils::result::Result;
use $crate::utils::task::Poll;
$(
let mut $fut = $crate::MaybeDone::new($fut);
)*
let res: Result<_, _> = poll_fn(move |cx| {
let mut all_done = true;
$(
let fut = unsafe { Pin::new_unchecked(&mut $fut) };
if Future::poll(fut, cx).is_pending() {
all_done = false;
} else if unsafe { Pin::new_unchecked(&mut $fut) }.output_mut().unwrap().is_err() {
return Poll::Ready(
Result::Err(unsafe { Pin::new_unchecked(&mut $fut) }
.take()
.unwrap()
.err()
.unwrap()
));
}
)*
if all_done {
let res = ($(
unsafe { Pin::new_unchecked(&mut $fut) }
.take()
.unwrap()
.ok()
.unwrap(),
)*);
Poll::Ready(Result::Ok(res))
} else {
Poll::Pending
}
}).await;
res
}
} }
}