macro_rules! all_some {
($fut0:expr $(,)?) => { ... };
($fut0:expr, $fut1:expr $(,)?) => { ... };
($fut0:expr, $fut1:expr, $fut2:expr $(,)?) => { ... };
($fut0:expr, $fut1:expr, $fut2:expr, $fut3:expr $(,)?) => { ... };
($fut0:expr, $fut1:expr, $fut2:expr, $fut3:expr, $fut4:expr $(,)?) => { ... };
($fut0:expr, $fut1:expr, $fut2:expr, $fut3:expr, $fut4:expr, $fut5:expr $(,)?) => { ... };
($fut0:expr, $fut1:expr, $fut2:expr, $fut3:expr, $fut4:expr, $fut5:expr, $fut6:expr $(,)?) => { ... };
($fut0:expr, $fut1:expr, $fut2:expr, $fut3:expr, $fut4:expr, $fut5:expr, $fut6:expr, $fut7:expr $(,)?) => { ... };
($($fut:expr),+ $(,)?) => { ... };
}
Expand description
A future that is ready when all futures are ready with Some(T)
or when any
is future ready with None
.
The macro input is comma separated list of future expressions, the futures must
all have the Option<T>
output type, but each can have a different T
. The macro output is a future that when “.awaited”
produces Some<(T0, T1, ..)>
if all futures where Some(T)
or None
if any of the futures where None
.
At least one input future is required and any number of futures is accepted. For more than eight futures a proc-macro is used which may cause code auto-complete to stop working in some IDEs.
After one future is ready and None
the other futures are not polled again and are dropped. After a future
is ready it is also not polled again and dropped.
Each input must implement IntoFuture
with the same Output
type. Note that each input must be
known at compile time, use the all_some
async function to await on all futures in a dynamic list of futures.
§Examples
Await for the first of three futures to complete with Some
:
use zng_task as task;
let r = task::all_some!(
task::run(async { Some('a') }),
task::wait(|| Some('b')),
async { Some('c') }
).await;
assert_eq!(Some(('a', 'b', 'c')), r);
Completes with None
if any future completes with None
:
let r = task::all_some!(
task::run(async { Some('a') }),
task::wait(|| None::<char>),
async { Some('b') }
).await;
assert_eq!(None, r);