use futures::future::{BoxFuture, Future, FutureExt}; /// A collection of async operations. /// /// You should be able to turn a future easily into a [`Command`], either by /// using the `From` trait or [`Command::perform`]. /// /// [`Command`]: struct.Command.html pub struct Command { futures: Vec>, } impl Command { /// Creates an empty [`Command`]. /// /// In other words, a [`Command`] that does nothing. /// /// [`Command`]: struct.Command.html pub fn none() -> Self { Self { futures: Vec::new(), } } /// Creates a [`Command`] that performs the action of the given future. /// /// [`Command`]: struct.Command.html pub fn perform( future: impl Future + 'static + Send, f: impl Fn(T) -> A + 'static + Send, ) -> Command { Command { futures: vec![future.map(f).boxed()], } } /// Creates a [`Command`] that performs the actions of all the givens /// futures. /// /// Once this command is run, all the futures will be exectued at once. /// /// [`Command`]: struct.Command.html pub fn batch(commands: impl Iterator>) -> Self { Self { futures: commands.flat_map(|command| command.futures).collect(), } } /// Converts a [`Command`] into its underlying list of futures. /// /// [`Command`]: struct.Command.html pub fn futures(self) -> Vec> { self.futures } } impl From for Command where A: Future + 'static + Send, { fn from(future: A) -> Self { Self { futures: vec![future.boxed()], } } } impl std::fmt::Debug for Command { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Command").finish() } }