xref: /aosp_15_r20/external/crosvm/cros_async/src/lib.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker //! An Executor and future combinators based on operations that block on file descriptors.
6*bb4ee6a4SAndroid Build Coastguard Worker //!
7*bb4ee6a4SAndroid Build Coastguard Worker //! This crate is meant to be used with the `futures-rs` crate that provides further combinators
8*bb4ee6a4SAndroid Build Coastguard Worker //! and utility functions to combine and manage futures. All futures will run until they block on a
9*bb4ee6a4SAndroid Build Coastguard Worker //! file descriptor becoming readable or writable. Facilities are provided to register future
10*bb4ee6a4SAndroid Build Coastguard Worker //! wakers based on such events.
11*bb4ee6a4SAndroid Build Coastguard Worker //!
12*bb4ee6a4SAndroid Build Coastguard Worker //! # Running top-level futures.
13*bb4ee6a4SAndroid Build Coastguard Worker //!
14*bb4ee6a4SAndroid Build Coastguard Worker //! Use helper functions based the desired behavior of your application.
15*bb4ee6a4SAndroid Build Coastguard Worker //!
16*bb4ee6a4SAndroid Build Coastguard Worker //! ## Completing one of several futures.
17*bb4ee6a4SAndroid Build Coastguard Worker //!
18*bb4ee6a4SAndroid Build Coastguard Worker //! If there are several top level tasks that should run until any one completes, use the "select"
19*bb4ee6a4SAndroid Build Coastguard Worker //! family of executor constructors. These return an [`Executor`](trait.Executor.html) whose `run`
20*bb4ee6a4SAndroid Build Coastguard Worker //! function will return when the first future completes. The uncompleted futures will also be
21*bb4ee6a4SAndroid Build Coastguard Worker //! returned so they can be run further or otherwise cleaned up. These functions are inspired by
22*bb4ee6a4SAndroid Build Coastguard Worker //! the `select_all` function from futures-rs, but built to be run inside an FD based executor and
23*bb4ee6a4SAndroid Build Coastguard Worker //! to poll only when necessary. See the docs for [`select2`](fn.select2.html),
24*bb4ee6a4SAndroid Build Coastguard Worker //! [`select3`](fn.select3.html), [`select4`](fn.select4.html), and [`select5`](fn.select5.html).
25*bb4ee6a4SAndroid Build Coastguard Worker //!
26*bb4ee6a4SAndroid Build Coastguard Worker //! ## Completing all of several futures.
27*bb4ee6a4SAndroid Build Coastguard Worker //!
28*bb4ee6a4SAndroid Build Coastguard Worker //! If there are several top level tasks that all need to be completed, use the "complete" family
29*bb4ee6a4SAndroid Build Coastguard Worker //! of executor constructors. These return an [`Executor`](trait.Executor.html) whose `run`
30*bb4ee6a4SAndroid Build Coastguard Worker //! function will return only once all the futures passed to it have completed. These functions are
31*bb4ee6a4SAndroid Build Coastguard Worker //! inspired by the `join_all` function from futures-rs, but built to be run inside an FD based
32*bb4ee6a4SAndroid Build Coastguard Worker //! executor and to poll only when necessary. See the docs for [`complete2`](fn.complete2.html),
33*bb4ee6a4SAndroid Build Coastguard Worker //! [`complete3`](fn.complete3.html), [`complete4`](fn.complete4.html), and
34*bb4ee6a4SAndroid Build Coastguard Worker //! [`complete5`](fn.complete5.html).
35*bb4ee6a4SAndroid Build Coastguard Worker //!
36*bb4ee6a4SAndroid Build Coastguard Worker //! # Implementing new FD-based futures.
37*bb4ee6a4SAndroid Build Coastguard Worker //!
38*bb4ee6a4SAndroid Build Coastguard Worker //! For URing implementations should provide an implementation of the `IoSource` trait.
39*bb4ee6a4SAndroid Build Coastguard Worker //! For the FD executor, new futures can use the existing ability to poll a source to build async
40*bb4ee6a4SAndroid Build Coastguard Worker //! functionality on top of.
41*bb4ee6a4SAndroid Build Coastguard Worker //!
42*bb4ee6a4SAndroid Build Coastguard Worker //! # Implementations
43*bb4ee6a4SAndroid Build Coastguard Worker //!
44*bb4ee6a4SAndroid Build Coastguard Worker //! Currently there are two paths for using the asynchronous IO. One uses a WaitContext and drives
45*bb4ee6a4SAndroid Build Coastguard Worker //! futures based on the FDs signaling they are ready for the opteration. This method will exist so
46*bb4ee6a4SAndroid Build Coastguard Worker //! long as kernels < 5.4 are supported.
47*bb4ee6a4SAndroid Build Coastguard Worker //! The other method submits operations to io_uring and is signaled when they complete. This is more
48*bb4ee6a4SAndroid Build Coastguard Worker //! efficient, but only supported on kernel 5.4+.
49*bb4ee6a4SAndroid Build Coastguard Worker //! If `IoSource::new` is used to interface with async IO, then the correct backend will be chosen
50*bb4ee6a4SAndroid Build Coastguard Worker //! automatically.
51*bb4ee6a4SAndroid Build Coastguard Worker //!
52*bb4ee6a4SAndroid Build Coastguard Worker //! # Examples
53*bb4ee6a4SAndroid Build Coastguard Worker //!
54*bb4ee6a4SAndroid Build Coastguard Worker //! See the docs for `IoSource` if support for kernels <5.4 is required. Focus on `UringSource` if
55*bb4ee6a4SAndroid Build Coastguard Worker //! all systems have support for io_uring.
56*bb4ee6a4SAndroid Build Coastguard Worker 
57*bb4ee6a4SAndroid Build Coastguard Worker mod async_types;
58*bb4ee6a4SAndroid Build Coastguard Worker pub mod audio_streams_async;
59*bb4ee6a4SAndroid Build Coastguard Worker mod blocking;
60*bb4ee6a4SAndroid Build Coastguard Worker mod common_executor;
61*bb4ee6a4SAndroid Build Coastguard Worker mod complete;
62*bb4ee6a4SAndroid Build Coastguard Worker mod event;
63*bb4ee6a4SAndroid Build Coastguard Worker mod executor;
64*bb4ee6a4SAndroid Build Coastguard Worker mod io_ext;
65*bb4ee6a4SAndroid Build Coastguard Worker mod io_source;
66*bb4ee6a4SAndroid Build Coastguard Worker pub mod mem;
67*bb4ee6a4SAndroid Build Coastguard Worker mod queue;
68*bb4ee6a4SAndroid Build Coastguard Worker mod select;
69*bb4ee6a4SAndroid Build Coastguard Worker pub mod sync;
70*bb4ee6a4SAndroid Build Coastguard Worker pub mod sys;
71*bb4ee6a4SAndroid Build Coastguard Worker mod timer;
72*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "tokio")]
73*bb4ee6a4SAndroid Build Coastguard Worker mod tokio_executor;
74*bb4ee6a4SAndroid Build Coastguard Worker mod waker;
75*bb4ee6a4SAndroid Build Coastguard Worker 
76*bb4ee6a4SAndroid Build Coastguard Worker use std::future::Future;
77*bb4ee6a4SAndroid Build Coastguard Worker use std::pin::Pin;
78*bb4ee6a4SAndroid Build Coastguard Worker use std::task::Poll;
79*bb4ee6a4SAndroid Build Coastguard Worker 
80*bb4ee6a4SAndroid Build Coastguard Worker pub use async_types::*;
81*bb4ee6a4SAndroid Build Coastguard Worker pub use base::Event;
82*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
83*bb4ee6a4SAndroid Build Coastguard Worker pub use blocking::sys::linux::block_on::block_on;
84*bb4ee6a4SAndroid Build Coastguard Worker pub use blocking::unblock;
85*bb4ee6a4SAndroid Build Coastguard Worker pub use blocking::unblock_disarm;
86*bb4ee6a4SAndroid Build Coastguard Worker pub use blocking::BlockingPool;
87*bb4ee6a4SAndroid Build Coastguard Worker pub use blocking::CancellableBlockingPool;
88*bb4ee6a4SAndroid Build Coastguard Worker pub use blocking::TimeoutAction;
89*bb4ee6a4SAndroid Build Coastguard Worker pub use event::EventAsync;
90*bb4ee6a4SAndroid Build Coastguard Worker pub use executor::Executor;
91*bb4ee6a4SAndroid Build Coastguard Worker pub use executor::ExecutorKind;
92*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) use executor::ExecutorTrait;
93*bb4ee6a4SAndroid Build Coastguard Worker pub use executor::TaskHandle;
94*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(windows)]
95*bb4ee6a4SAndroid Build Coastguard Worker pub use futures::executor::block_on;
96*bb4ee6a4SAndroid Build Coastguard Worker use futures::stream::FuturesUnordered;
97*bb4ee6a4SAndroid Build Coastguard Worker pub use io_ext::AsyncError;
98*bb4ee6a4SAndroid Build Coastguard Worker pub use io_ext::AsyncResult;
99*bb4ee6a4SAndroid Build Coastguard Worker pub use io_ext::AsyncWrapper;
100*bb4ee6a4SAndroid Build Coastguard Worker pub use io_ext::IntoAsync;
101*bb4ee6a4SAndroid Build Coastguard Worker pub use io_source::IoSource;
102*bb4ee6a4SAndroid Build Coastguard Worker pub use mem::BackingMemory;
103*bb4ee6a4SAndroid Build Coastguard Worker pub use mem::MemRegion;
104*bb4ee6a4SAndroid Build Coastguard Worker pub use mem::MemRegionIter;
105*bb4ee6a4SAndroid Build Coastguard Worker pub use mem::VecIoWrapper;
106*bb4ee6a4SAndroid Build Coastguard Worker use remain::sorted;
107*bb4ee6a4SAndroid Build Coastguard Worker pub use select::SelectResult;
108*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
109*bb4ee6a4SAndroid Build Coastguard Worker pub use sys::linux::uring_executor::is_uring_stable;
110*bb4ee6a4SAndroid Build Coastguard Worker use thiserror::Error as ThisError;
111*bb4ee6a4SAndroid Build Coastguard Worker pub use timer::TimerAsync;
112*bb4ee6a4SAndroid Build Coastguard Worker 
113*bb4ee6a4SAndroid Build Coastguard Worker #[sorted]
114*bb4ee6a4SAndroid Build Coastguard Worker #[derive(ThisError, Debug)]
115*bb4ee6a4SAndroid Build Coastguard Worker pub enum Error {
116*bb4ee6a4SAndroid Build Coastguard Worker     /// Error from EventAsync
117*bb4ee6a4SAndroid Build Coastguard Worker     #[error("Failure in EventAsync: {0}")]
118*bb4ee6a4SAndroid Build Coastguard Worker     EventAsync(base::Error),
119*bb4ee6a4SAndroid Build Coastguard Worker     /// Error from the handle executor.
120*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(windows)]
121*bb4ee6a4SAndroid Build Coastguard Worker     #[error("Failure in the handle executor: {0}")]
122*bb4ee6a4SAndroid Build Coastguard Worker     HandleExecutor(sys::windows::handle_executor::Error),
123*bb4ee6a4SAndroid Build Coastguard Worker     #[error("IO error: {0}")]
124*bb4ee6a4SAndroid Build Coastguard Worker     Io(std::io::Error),
125*bb4ee6a4SAndroid Build Coastguard Worker     /// Error from the polled(FD) source, which includes error from the FD executor.
126*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
127*bb4ee6a4SAndroid Build Coastguard Worker     #[error("An error with a poll source: {0}")]
128*bb4ee6a4SAndroid Build Coastguard Worker     PollSource(sys::linux::poll_source::Error),
129*bb4ee6a4SAndroid Build Coastguard Worker     /// Error from Timer.
130*bb4ee6a4SAndroid Build Coastguard Worker     #[error("Failure in Timer: {0}")]
131*bb4ee6a4SAndroid Build Coastguard Worker     Timer(base::Error),
132*bb4ee6a4SAndroid Build Coastguard Worker     /// Error from TimerFd.
133*bb4ee6a4SAndroid Build Coastguard Worker     #[error("Failure in TimerAsync: {0}")]
134*bb4ee6a4SAndroid Build Coastguard Worker     TimerAsync(AsyncError),
135*bb4ee6a4SAndroid Build Coastguard Worker     /// Error from the uring executor.
136*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
137*bb4ee6a4SAndroid Build Coastguard Worker     #[error("Failure in the uring executor: {0}")]
138*bb4ee6a4SAndroid Build Coastguard Worker     URingExecutor(sys::linux::uring_executor::Error),
139*bb4ee6a4SAndroid Build Coastguard Worker }
140*bb4ee6a4SAndroid Build Coastguard Worker pub type Result<T> = std::result::Result<T, Error>;
141*bb4ee6a4SAndroid Build Coastguard Worker 
142*bb4ee6a4SAndroid Build Coastguard Worker /// Heterogeneous collection of `async_task:Task` that are running in a "detached" state.
143*bb4ee6a4SAndroid Build Coastguard Worker ///
144*bb4ee6a4SAndroid Build Coastguard Worker /// We keep them around to ensure they are dropped before the executor they are running on.
145*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) struct DetachedTasks(FuturesUnordered<Pin<Box<dyn Future<Output = ()> + Send>>>);
146*bb4ee6a4SAndroid Build Coastguard Worker 
147*bb4ee6a4SAndroid Build Coastguard Worker impl DetachedTasks {
new() -> Self148*bb4ee6a4SAndroid Build Coastguard Worker     pub(crate) fn new() -> Self {
149*bb4ee6a4SAndroid Build Coastguard Worker         DetachedTasks(FuturesUnordered::new())
150*bb4ee6a4SAndroid Build Coastguard Worker     }
151*bb4ee6a4SAndroid Build Coastguard Worker 
push<R: Send + 'static>(&self, task: async_task::Task<R>)152*bb4ee6a4SAndroid Build Coastguard Worker     pub(crate) fn push<R: Send + 'static>(&self, task: async_task::Task<R>) {
153*bb4ee6a4SAndroid Build Coastguard Worker         // Convert to fallible, otherwise poll could panic if the `Runnable` is dropped early.
154*bb4ee6a4SAndroid Build Coastguard Worker         let task = task.fallible();
155*bb4ee6a4SAndroid Build Coastguard Worker         self.0.push(Box::pin(async {
156*bb4ee6a4SAndroid Build Coastguard Worker             let _ = task.await;
157*bb4ee6a4SAndroid Build Coastguard Worker         }));
158*bb4ee6a4SAndroid Build Coastguard Worker     }
159*bb4ee6a4SAndroid Build Coastguard Worker 
160*bb4ee6a4SAndroid Build Coastguard Worker     /// Polls all the tasks, dropping any that complete.
poll(&mut self, cx: &mut std::task::Context)161*bb4ee6a4SAndroid Build Coastguard Worker     pub(crate) fn poll(&mut self, cx: &mut std::task::Context) {
162*bb4ee6a4SAndroid Build Coastguard Worker         use futures::Stream;
163*bb4ee6a4SAndroid Build Coastguard Worker         while let Poll::Ready(Some(_)) = Pin::new(&mut self.0).poll_next(cx) {}
164*bb4ee6a4SAndroid Build Coastguard Worker     }
165*bb4ee6a4SAndroid Build Coastguard Worker }
166*bb4ee6a4SAndroid Build Coastguard Worker 
167*bb4ee6a4SAndroid Build Coastguard Worker // Select helpers to run until any future completes.
168*bb4ee6a4SAndroid Build Coastguard Worker 
169*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the two given futures until one completes, returning a tuple
170*bb4ee6a4SAndroid Build Coastguard Worker /// containing the result of the finished future and the still pending future.
171*bb4ee6a4SAndroid Build Coastguard Worker ///
172*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
173*bb4ee6a4SAndroid Build Coastguard Worker ///
174*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
175*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{SelectResult, select2, block_on};
176*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::future::pending;
177*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::pin_mut;
178*bb4ee6a4SAndroid Build Coastguard Worker ///
179*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {5};
180*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {let () = pending().await;};
181*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(first);
182*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(second);
183*bb4ee6a4SAndroid Build Coastguard Worker ///    match block_on(select2(first, second)) {
184*bb4ee6a4SAndroid Build Coastguard Worker ///        (SelectResult::Finished(5), SelectResult::Pending(_second)) => (),
185*bb4ee6a4SAndroid Build Coastguard Worker ///        _ => panic!("Select didn't return the first future"),
186*bb4ee6a4SAndroid Build Coastguard Worker ///    };
187*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
select2<F1: Future + Unpin, F2: Future + Unpin>( f1: F1, f2: F2, ) -> (SelectResult<F1>, SelectResult<F2>)188*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select2<F1: Future + Unpin, F2: Future + Unpin>(
189*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
190*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
191*bb4ee6a4SAndroid Build Coastguard Worker ) -> (SelectResult<F1>, SelectResult<F2>) {
192*bb4ee6a4SAndroid Build Coastguard Worker     select::Select2::new(f1, f2).await
193*bb4ee6a4SAndroid Build Coastguard Worker }
194*bb4ee6a4SAndroid Build Coastguard Worker 
195*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the three given futures until one or more completes, returning a
196*bb4ee6a4SAndroid Build Coastguard Worker /// tuple containing the result of the finished future(s) and the still pending future(s).
197*bb4ee6a4SAndroid Build Coastguard Worker ///
198*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
199*bb4ee6a4SAndroid Build Coastguard Worker ///
200*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
201*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{SelectResult, select3, block_on};
202*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::future::pending;
203*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::pin_mut;
204*bb4ee6a4SAndroid Build Coastguard Worker ///
205*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {4};
206*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {let () = pending().await;};
207*bb4ee6a4SAndroid Build Coastguard Worker ///    let third = async {5};
208*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(first);
209*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(second);
210*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(third);
211*bb4ee6a4SAndroid Build Coastguard Worker ///    match block_on(select3(first, second, third)) {
212*bb4ee6a4SAndroid Build Coastguard Worker ///        (SelectResult::Finished(4),
213*bb4ee6a4SAndroid Build Coastguard Worker ///         SelectResult::Pending(_second),
214*bb4ee6a4SAndroid Build Coastguard Worker ///         SelectResult::Finished(5)) => (),
215*bb4ee6a4SAndroid Build Coastguard Worker ///        _ => panic!("Select didn't return the futures"),
216*bb4ee6a4SAndroid Build Coastguard Worker ///    };
217*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
select3<F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin>( f1: F1, f2: F2, f3: F3, ) -> (SelectResult<F1>, SelectResult<F2>, SelectResult<F3>)218*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select3<F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin>(
219*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
220*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
221*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
222*bb4ee6a4SAndroid Build Coastguard Worker ) -> (SelectResult<F1>, SelectResult<F2>, SelectResult<F3>) {
223*bb4ee6a4SAndroid Build Coastguard Worker     select::Select3::new(f1, f2, f3).await
224*bb4ee6a4SAndroid Build Coastguard Worker }
225*bb4ee6a4SAndroid Build Coastguard Worker 
226*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the four given futures until one or more completes, returning a
227*bb4ee6a4SAndroid Build Coastguard Worker /// tuple containing the result of the finished future(s) and the still pending future(s).
228*bb4ee6a4SAndroid Build Coastguard Worker ///
229*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
230*bb4ee6a4SAndroid Build Coastguard Worker ///
231*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
232*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{SelectResult, select4, block_on};
233*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::future::pending;
234*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::pin_mut;
235*bb4ee6a4SAndroid Build Coastguard Worker ///
236*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {4};
237*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {let () = pending().await;};
238*bb4ee6a4SAndroid Build Coastguard Worker ///    let third = async {5};
239*bb4ee6a4SAndroid Build Coastguard Worker ///    let fourth = async {let () = pending().await;};
240*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(first);
241*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(second);
242*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(third);
243*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(fourth);
244*bb4ee6a4SAndroid Build Coastguard Worker ///    match block_on(select4(first, second, third, fourth)) {
245*bb4ee6a4SAndroid Build Coastguard Worker ///        (SelectResult::Finished(4), SelectResult::Pending(_second),
246*bb4ee6a4SAndroid Build Coastguard Worker ///         SelectResult::Finished(5), SelectResult::Pending(_fourth)) => (),
247*bb4ee6a4SAndroid Build Coastguard Worker ///        _ => panic!("Select didn't return the futures"),
248*bb4ee6a4SAndroid Build Coastguard Worker ///    };
249*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
select4< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, )250*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select4<
251*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
252*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
253*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
254*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
255*bb4ee6a4SAndroid Build Coastguard Worker >(
256*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
257*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
258*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
259*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
260*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
261*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
262*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
263*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
264*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
265*bb4ee6a4SAndroid Build Coastguard Worker ) {
266*bb4ee6a4SAndroid Build Coastguard Worker     select::Select4::new(f1, f2, f3, f4).await
267*bb4ee6a4SAndroid Build Coastguard Worker }
268*bb4ee6a4SAndroid Build Coastguard Worker 
269*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the five given futures until one or more completes, returning a
270*bb4ee6a4SAndroid Build Coastguard Worker /// tuple containing the result of the finished future(s) and the still pending future(s).
271*bb4ee6a4SAndroid Build Coastguard Worker ///
272*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
273*bb4ee6a4SAndroid Build Coastguard Worker ///
274*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
275*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{SelectResult, select5, block_on};
276*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::future::pending;
277*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::pin_mut;
278*bb4ee6a4SAndroid Build Coastguard Worker ///
279*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {4};
280*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {let () = pending().await;};
281*bb4ee6a4SAndroid Build Coastguard Worker ///    let third = async {5};
282*bb4ee6a4SAndroid Build Coastguard Worker ///    let fourth = async {let () = pending().await;};
283*bb4ee6a4SAndroid Build Coastguard Worker ///    let fifth = async {6};
284*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(first);
285*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(second);
286*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(third);
287*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(fourth);
288*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(fifth);
289*bb4ee6a4SAndroid Build Coastguard Worker ///    match block_on(select5(first, second, third, fourth, fifth)) {
290*bb4ee6a4SAndroid Build Coastguard Worker ///        (SelectResult::Finished(4), SelectResult::Pending(_second),
291*bb4ee6a4SAndroid Build Coastguard Worker ///         SelectResult::Finished(5), SelectResult::Pending(_fourth),
292*bb4ee6a4SAndroid Build Coastguard Worker ///         SelectResult::Finished(6)) => (),
293*bb4ee6a4SAndroid Build Coastguard Worker ///        _ => panic!("Select didn't return the futures"),
294*bb4ee6a4SAndroid Build Coastguard Worker ///    };
295*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
select5< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, F5: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, SelectResult<F5>, )296*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select5<
297*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
298*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
299*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
300*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
301*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future + Unpin,
302*bb4ee6a4SAndroid Build Coastguard Worker >(
303*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
304*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
305*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
306*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
307*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
308*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
309*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
310*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
311*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
312*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
313*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F5>,
314*bb4ee6a4SAndroid Build Coastguard Worker ) {
315*bb4ee6a4SAndroid Build Coastguard Worker     select::Select5::new(f1, f2, f3, f4, f5).await
316*bb4ee6a4SAndroid Build Coastguard Worker }
317*bb4ee6a4SAndroid Build Coastguard Worker 
318*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the six given futures until one or more completes, returning a
319*bb4ee6a4SAndroid Build Coastguard Worker /// tuple containing the result of the finished future(s) and the still pending future(s).
320*bb4ee6a4SAndroid Build Coastguard Worker ///
321*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
322*bb4ee6a4SAndroid Build Coastguard Worker ///
323*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
324*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{SelectResult, select6, block_on};
325*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::future::pending;
326*bb4ee6a4SAndroid Build Coastguard Worker ///    use futures::pin_mut;
327*bb4ee6a4SAndroid Build Coastguard Worker ///
328*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {1};
329*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {let () = pending().await;};
330*bb4ee6a4SAndroid Build Coastguard Worker ///    let third = async {3};
331*bb4ee6a4SAndroid Build Coastguard Worker ///    let fourth = async {let () = pending().await;};
332*bb4ee6a4SAndroid Build Coastguard Worker ///    let fifth = async {5};
333*bb4ee6a4SAndroid Build Coastguard Worker ///    let sixth = async {6};
334*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(first);
335*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(second);
336*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(third);
337*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(fourth);
338*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(fifth);
339*bb4ee6a4SAndroid Build Coastguard Worker ///    pin_mut!(sixth);
340*bb4ee6a4SAndroid Build Coastguard Worker ///    match block_on(select6(first, second, third, fourth, fifth, sixth)) {
341*bb4ee6a4SAndroid Build Coastguard Worker ///        (SelectResult::Finished(1), SelectResult::Pending(_second),
342*bb4ee6a4SAndroid Build Coastguard Worker ///         SelectResult::Finished(3), SelectResult::Pending(_fourth),
343*bb4ee6a4SAndroid Build Coastguard Worker ///         SelectResult::Finished(5), SelectResult::Finished(6)) => (),
344*bb4ee6a4SAndroid Build Coastguard Worker ///        _ => panic!("Select didn't return the futures"),
345*bb4ee6a4SAndroid Build Coastguard Worker ///    };
346*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
select6< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, F5: Future + Unpin, F6: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, f6: F6, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, SelectResult<F5>, SelectResult<F6>, )347*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select6<
348*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
349*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
350*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
351*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
352*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future + Unpin,
353*bb4ee6a4SAndroid Build Coastguard Worker     F6: Future + Unpin,
354*bb4ee6a4SAndroid Build Coastguard Worker >(
355*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
356*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
357*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
358*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
359*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
360*bb4ee6a4SAndroid Build Coastguard Worker     f6: F6,
361*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
362*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
363*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
364*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
365*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
366*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F5>,
367*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F6>,
368*bb4ee6a4SAndroid Build Coastguard Worker ) {
369*bb4ee6a4SAndroid Build Coastguard Worker     select::Select6::new(f1, f2, f3, f4, f5, f6).await
370*bb4ee6a4SAndroid Build Coastguard Worker }
371*bb4ee6a4SAndroid Build Coastguard Worker 
select7< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, F5: Future + Unpin, F6: Future + Unpin, F7: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, f6: F6, f7: F7, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, SelectResult<F5>, SelectResult<F6>, SelectResult<F7>, )372*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select7<
373*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
374*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
375*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
376*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
377*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future + Unpin,
378*bb4ee6a4SAndroid Build Coastguard Worker     F6: Future + Unpin,
379*bb4ee6a4SAndroid Build Coastguard Worker     F7: Future + Unpin,
380*bb4ee6a4SAndroid Build Coastguard Worker >(
381*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
382*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
383*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
384*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
385*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
386*bb4ee6a4SAndroid Build Coastguard Worker     f6: F6,
387*bb4ee6a4SAndroid Build Coastguard Worker     f7: F7,
388*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
389*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
390*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
391*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
392*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
393*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F5>,
394*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F6>,
395*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F7>,
396*bb4ee6a4SAndroid Build Coastguard Worker ) {
397*bb4ee6a4SAndroid Build Coastguard Worker     select::Select7::new(f1, f2, f3, f4, f5, f6, f7).await
398*bb4ee6a4SAndroid Build Coastguard Worker }
399*bb4ee6a4SAndroid Build Coastguard Worker 
select8< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, F5: Future + Unpin, F6: Future + Unpin, F7: Future + Unpin, F8: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, f6: F6, f7: F7, f8: F8, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, SelectResult<F5>, SelectResult<F6>, SelectResult<F7>, SelectResult<F8>, )400*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select8<
401*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
402*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
403*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
404*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
405*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future + Unpin,
406*bb4ee6a4SAndroid Build Coastguard Worker     F6: Future + Unpin,
407*bb4ee6a4SAndroid Build Coastguard Worker     F7: Future + Unpin,
408*bb4ee6a4SAndroid Build Coastguard Worker     F8: Future + Unpin,
409*bb4ee6a4SAndroid Build Coastguard Worker >(
410*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
411*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
412*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
413*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
414*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
415*bb4ee6a4SAndroid Build Coastguard Worker     f6: F6,
416*bb4ee6a4SAndroid Build Coastguard Worker     f7: F7,
417*bb4ee6a4SAndroid Build Coastguard Worker     f8: F8,
418*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
419*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
420*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
421*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
422*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
423*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F5>,
424*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F6>,
425*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F7>,
426*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F8>,
427*bb4ee6a4SAndroid Build Coastguard Worker ) {
428*bb4ee6a4SAndroid Build Coastguard Worker     select::Select8::new(f1, f2, f3, f4, f5, f6, f7, f8).await
429*bb4ee6a4SAndroid Build Coastguard Worker }
430*bb4ee6a4SAndroid Build Coastguard Worker 
select9< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, F5: Future + Unpin, F6: Future + Unpin, F7: Future + Unpin, F8: Future + Unpin, F9: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, f6: F6, f7: F7, f8: F8, f9: F9, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, SelectResult<F5>, SelectResult<F6>, SelectResult<F7>, SelectResult<F8>, SelectResult<F9>, )431*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select9<
432*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
433*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
434*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
435*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
436*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future + Unpin,
437*bb4ee6a4SAndroid Build Coastguard Worker     F6: Future + Unpin,
438*bb4ee6a4SAndroid Build Coastguard Worker     F7: Future + Unpin,
439*bb4ee6a4SAndroid Build Coastguard Worker     F8: Future + Unpin,
440*bb4ee6a4SAndroid Build Coastguard Worker     F9: Future + Unpin,
441*bb4ee6a4SAndroid Build Coastguard Worker >(
442*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
443*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
444*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
445*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
446*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
447*bb4ee6a4SAndroid Build Coastguard Worker     f6: F6,
448*bb4ee6a4SAndroid Build Coastguard Worker     f7: F7,
449*bb4ee6a4SAndroid Build Coastguard Worker     f8: F8,
450*bb4ee6a4SAndroid Build Coastguard Worker     f9: F9,
451*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
452*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
453*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
454*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
455*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
456*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F5>,
457*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F6>,
458*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F7>,
459*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F8>,
460*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F9>,
461*bb4ee6a4SAndroid Build Coastguard Worker ) {
462*bb4ee6a4SAndroid Build Coastguard Worker     select::Select9::new(f1, f2, f3, f4, f5, f6, f7, f8, f9).await
463*bb4ee6a4SAndroid Build Coastguard Worker }
464*bb4ee6a4SAndroid Build Coastguard Worker 
select10< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, F5: Future + Unpin, F6: Future + Unpin, F7: Future + Unpin, F8: Future + Unpin, F9: Future + Unpin, F10: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, f6: F6, f7: F7, f8: F8, f9: F9, f10: F10, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, SelectResult<F5>, SelectResult<F6>, SelectResult<F7>, SelectResult<F8>, SelectResult<F9>, SelectResult<F10>, )465*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select10<
466*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
467*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
468*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
469*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
470*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future + Unpin,
471*bb4ee6a4SAndroid Build Coastguard Worker     F6: Future + Unpin,
472*bb4ee6a4SAndroid Build Coastguard Worker     F7: Future + Unpin,
473*bb4ee6a4SAndroid Build Coastguard Worker     F8: Future + Unpin,
474*bb4ee6a4SAndroid Build Coastguard Worker     F9: Future + Unpin,
475*bb4ee6a4SAndroid Build Coastguard Worker     F10: Future + Unpin,
476*bb4ee6a4SAndroid Build Coastguard Worker >(
477*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
478*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
479*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
480*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
481*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
482*bb4ee6a4SAndroid Build Coastguard Worker     f6: F6,
483*bb4ee6a4SAndroid Build Coastguard Worker     f7: F7,
484*bb4ee6a4SAndroid Build Coastguard Worker     f8: F8,
485*bb4ee6a4SAndroid Build Coastguard Worker     f9: F9,
486*bb4ee6a4SAndroid Build Coastguard Worker     f10: F10,
487*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
488*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
489*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
490*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
491*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
492*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F5>,
493*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F6>,
494*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F7>,
495*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F8>,
496*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F9>,
497*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F10>,
498*bb4ee6a4SAndroid Build Coastguard Worker ) {
499*bb4ee6a4SAndroid Build Coastguard Worker     select::Select10::new(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10).await
500*bb4ee6a4SAndroid Build Coastguard Worker }
501*bb4ee6a4SAndroid Build Coastguard Worker 
select11< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, F5: Future + Unpin, F6: Future + Unpin, F7: Future + Unpin, F8: Future + Unpin, F9: Future + Unpin, F10: Future + Unpin, F11: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, f6: F6, f7: F7, f8: F8, f9: F9, f10: F10, f11: F11, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, SelectResult<F5>, SelectResult<F6>, SelectResult<F7>, SelectResult<F8>, SelectResult<F9>, SelectResult<F10>, SelectResult<F11>, )502*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select11<
503*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
504*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
505*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
506*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
507*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future + Unpin,
508*bb4ee6a4SAndroid Build Coastguard Worker     F6: Future + Unpin,
509*bb4ee6a4SAndroid Build Coastguard Worker     F7: Future + Unpin,
510*bb4ee6a4SAndroid Build Coastguard Worker     F8: Future + Unpin,
511*bb4ee6a4SAndroid Build Coastguard Worker     F9: Future + Unpin,
512*bb4ee6a4SAndroid Build Coastguard Worker     F10: Future + Unpin,
513*bb4ee6a4SAndroid Build Coastguard Worker     F11: Future + Unpin,
514*bb4ee6a4SAndroid Build Coastguard Worker >(
515*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
516*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
517*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
518*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
519*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
520*bb4ee6a4SAndroid Build Coastguard Worker     f6: F6,
521*bb4ee6a4SAndroid Build Coastguard Worker     f7: F7,
522*bb4ee6a4SAndroid Build Coastguard Worker     f8: F8,
523*bb4ee6a4SAndroid Build Coastguard Worker     f9: F9,
524*bb4ee6a4SAndroid Build Coastguard Worker     f10: F10,
525*bb4ee6a4SAndroid Build Coastguard Worker     f11: F11,
526*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
527*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
528*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
529*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
530*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
531*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F5>,
532*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F6>,
533*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F7>,
534*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F8>,
535*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F9>,
536*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F10>,
537*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F11>,
538*bb4ee6a4SAndroid Build Coastguard Worker ) {
539*bb4ee6a4SAndroid Build Coastguard Worker     select::Select11::new(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11).await
540*bb4ee6a4SAndroid Build Coastguard Worker }
541*bb4ee6a4SAndroid Build Coastguard Worker 
select12< F1: Future + Unpin, F2: Future + Unpin, F3: Future + Unpin, F4: Future + Unpin, F5: Future + Unpin, F6: Future + Unpin, F7: Future + Unpin, F8: Future + Unpin, F9: Future + Unpin, F10: Future + Unpin, F11: Future + Unpin, F12: Future + Unpin, >( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, f6: F6, f7: F7, f8: F8, f9: F9, f10: F10, f11: F11, f12: F12, ) -> ( SelectResult<F1>, SelectResult<F2>, SelectResult<F3>, SelectResult<F4>, SelectResult<F5>, SelectResult<F6>, SelectResult<F7>, SelectResult<F8>, SelectResult<F9>, SelectResult<F10>, SelectResult<F11>, SelectResult<F12>, )542*bb4ee6a4SAndroid Build Coastguard Worker pub async fn select12<
543*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future + Unpin,
544*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future + Unpin,
545*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future + Unpin,
546*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future + Unpin,
547*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future + Unpin,
548*bb4ee6a4SAndroid Build Coastguard Worker     F6: Future + Unpin,
549*bb4ee6a4SAndroid Build Coastguard Worker     F7: Future + Unpin,
550*bb4ee6a4SAndroid Build Coastguard Worker     F8: Future + Unpin,
551*bb4ee6a4SAndroid Build Coastguard Worker     F9: Future + Unpin,
552*bb4ee6a4SAndroid Build Coastguard Worker     F10: Future + Unpin,
553*bb4ee6a4SAndroid Build Coastguard Worker     F11: Future + Unpin,
554*bb4ee6a4SAndroid Build Coastguard Worker     F12: Future + Unpin,
555*bb4ee6a4SAndroid Build Coastguard Worker >(
556*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
557*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
558*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
559*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
560*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
561*bb4ee6a4SAndroid Build Coastguard Worker     f6: F6,
562*bb4ee6a4SAndroid Build Coastguard Worker     f7: F7,
563*bb4ee6a4SAndroid Build Coastguard Worker     f8: F8,
564*bb4ee6a4SAndroid Build Coastguard Worker     f9: F9,
565*bb4ee6a4SAndroid Build Coastguard Worker     f10: F10,
566*bb4ee6a4SAndroid Build Coastguard Worker     f11: F11,
567*bb4ee6a4SAndroid Build Coastguard Worker     f12: F12,
568*bb4ee6a4SAndroid Build Coastguard Worker ) -> (
569*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F1>,
570*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F2>,
571*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F3>,
572*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F4>,
573*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F5>,
574*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F6>,
575*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F7>,
576*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F8>,
577*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F9>,
578*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F10>,
579*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F11>,
580*bb4ee6a4SAndroid Build Coastguard Worker     SelectResult<F12>,
581*bb4ee6a4SAndroid Build Coastguard Worker ) {
582*bb4ee6a4SAndroid Build Coastguard Worker     select::Select12::new(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12).await
583*bb4ee6a4SAndroid Build Coastguard Worker }
584*bb4ee6a4SAndroid Build Coastguard Worker 
585*bb4ee6a4SAndroid Build Coastguard Worker // Combination helpers to run until all futures are complete.
586*bb4ee6a4SAndroid Build Coastguard Worker 
587*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the two given futures to completion, returning a tuple of the
588*bb4ee6a4SAndroid Build Coastguard Worker /// outputs each yields.
589*bb4ee6a4SAndroid Build Coastguard Worker ///
590*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
591*bb4ee6a4SAndroid Build Coastguard Worker ///
592*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
593*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{complete2, block_on};
594*bb4ee6a4SAndroid Build Coastguard Worker ///
595*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {5};
596*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {6};
597*bb4ee6a4SAndroid Build Coastguard Worker ///    assert_eq!(block_on(complete2(first, second)), (5,6));
598*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
complete2<F1, F2>(f1: F1, f2: F2) -> (F1::Output, F2::Output) where F1: Future, F2: Future,599*bb4ee6a4SAndroid Build Coastguard Worker pub async fn complete2<F1, F2>(f1: F1, f2: F2) -> (F1::Output, F2::Output)
600*bb4ee6a4SAndroid Build Coastguard Worker where
601*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future,
602*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future,
603*bb4ee6a4SAndroid Build Coastguard Worker {
604*bb4ee6a4SAndroid Build Coastguard Worker     complete::Complete2::new(f1, f2).await
605*bb4ee6a4SAndroid Build Coastguard Worker }
606*bb4ee6a4SAndroid Build Coastguard Worker 
607*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the three given futures to completion, returning a tuple of the
608*bb4ee6a4SAndroid Build Coastguard Worker /// outputs each yields.
609*bb4ee6a4SAndroid Build Coastguard Worker ///
610*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
611*bb4ee6a4SAndroid Build Coastguard Worker ///
612*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
613*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{complete3, block_on};
614*bb4ee6a4SAndroid Build Coastguard Worker ///
615*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {5};
616*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {6};
617*bb4ee6a4SAndroid Build Coastguard Worker ///    let third = async {7};
618*bb4ee6a4SAndroid Build Coastguard Worker ///    assert_eq!(block_on(complete3(first, second, third)), (5,6,7));
619*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
complete3<F1, F2, F3>(f1: F1, f2: F2, f3: F3) -> (F1::Output, F2::Output, F3::Output) where F1: Future, F2: Future, F3: Future,620*bb4ee6a4SAndroid Build Coastguard Worker pub async fn complete3<F1, F2, F3>(f1: F1, f2: F2, f3: F3) -> (F1::Output, F2::Output, F3::Output)
621*bb4ee6a4SAndroid Build Coastguard Worker where
622*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future,
623*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future,
624*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future,
625*bb4ee6a4SAndroid Build Coastguard Worker {
626*bb4ee6a4SAndroid Build Coastguard Worker     complete::Complete3::new(f1, f2, f3).await
627*bb4ee6a4SAndroid Build Coastguard Worker }
628*bb4ee6a4SAndroid Build Coastguard Worker 
629*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the four given futures to completion, returning a tuple of the
630*bb4ee6a4SAndroid Build Coastguard Worker /// outputs each yields.
631*bb4ee6a4SAndroid Build Coastguard Worker ///
632*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
633*bb4ee6a4SAndroid Build Coastguard Worker ///
634*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
635*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{complete4, block_on};
636*bb4ee6a4SAndroid Build Coastguard Worker ///
637*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {5};
638*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {6};
639*bb4ee6a4SAndroid Build Coastguard Worker ///    let third = async {7};
640*bb4ee6a4SAndroid Build Coastguard Worker ///    let fourth = async {8};
641*bb4ee6a4SAndroid Build Coastguard Worker ///    assert_eq!(block_on(complete4(first, second, third, fourth)), (5,6,7,8));
642*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
complete4<F1, F2, F3, F4>( f1: F1, f2: F2, f3: F3, f4: F4, ) -> (F1::Output, F2::Output, F3::Output, F4::Output) where F1: Future, F2: Future, F3: Future, F4: Future,643*bb4ee6a4SAndroid Build Coastguard Worker pub async fn complete4<F1, F2, F3, F4>(
644*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
645*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
646*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
647*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
648*bb4ee6a4SAndroid Build Coastguard Worker ) -> (F1::Output, F2::Output, F3::Output, F4::Output)
649*bb4ee6a4SAndroid Build Coastguard Worker where
650*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future,
651*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future,
652*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future,
653*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future,
654*bb4ee6a4SAndroid Build Coastguard Worker {
655*bb4ee6a4SAndroid Build Coastguard Worker     complete::Complete4::new(f1, f2, f3, f4).await
656*bb4ee6a4SAndroid Build Coastguard Worker }
657*bb4ee6a4SAndroid Build Coastguard Worker 
658*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a combinator that runs the five given futures to completion, returning a tuple of the
659*bb4ee6a4SAndroid Build Coastguard Worker /// outputs each yields.
660*bb4ee6a4SAndroid Build Coastguard Worker ///
661*bb4ee6a4SAndroid Build Coastguard Worker ///  # Example
662*bb4ee6a4SAndroid Build Coastguard Worker ///
663*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
664*bb4ee6a4SAndroid Build Coastguard Worker ///    use cros_async::{complete5, block_on};
665*bb4ee6a4SAndroid Build Coastguard Worker ///
666*bb4ee6a4SAndroid Build Coastguard Worker ///    let first = async {5};
667*bb4ee6a4SAndroid Build Coastguard Worker ///    let second = async {6};
668*bb4ee6a4SAndroid Build Coastguard Worker ///    let third = async {7};
669*bb4ee6a4SAndroid Build Coastguard Worker ///    let fourth = async {8};
670*bb4ee6a4SAndroid Build Coastguard Worker ///    let fifth = async {9};
671*bb4ee6a4SAndroid Build Coastguard Worker ///    assert_eq!(block_on(complete5(first, second, third, fourth, fifth)),
672*bb4ee6a4SAndroid Build Coastguard Worker ///               (5,6,7,8,9));
673*bb4ee6a4SAndroid Build Coastguard Worker ///    ```
complete5<F1, F2, F3, F4, F5>( f1: F1, f2: F2, f3: F3, f4: F4, f5: F5, ) -> (F1::Output, F2::Output, F3::Output, F4::Output, F5::Output) where F1: Future, F2: Future, F3: Future, F4: Future, F5: Future,674*bb4ee6a4SAndroid Build Coastguard Worker pub async fn complete5<F1, F2, F3, F4, F5>(
675*bb4ee6a4SAndroid Build Coastguard Worker     f1: F1,
676*bb4ee6a4SAndroid Build Coastguard Worker     f2: F2,
677*bb4ee6a4SAndroid Build Coastguard Worker     f3: F3,
678*bb4ee6a4SAndroid Build Coastguard Worker     f4: F4,
679*bb4ee6a4SAndroid Build Coastguard Worker     f5: F5,
680*bb4ee6a4SAndroid Build Coastguard Worker ) -> (F1::Output, F2::Output, F3::Output, F4::Output, F5::Output)
681*bb4ee6a4SAndroid Build Coastguard Worker where
682*bb4ee6a4SAndroid Build Coastguard Worker     F1: Future,
683*bb4ee6a4SAndroid Build Coastguard Worker     F2: Future,
684*bb4ee6a4SAndroid Build Coastguard Worker     F3: Future,
685*bb4ee6a4SAndroid Build Coastguard Worker     F4: Future,
686*bb4ee6a4SAndroid Build Coastguard Worker     F5: Future,
687*bb4ee6a4SAndroid Build Coastguard Worker {
688*bb4ee6a4SAndroid Build Coastguard Worker     complete::Complete5::new(f1, f2, f3, f4, f5).await
689*bb4ee6a4SAndroid Build Coastguard Worker }
690