mod action; pub use action::Action; #[cfg(target_arch = "wasm32")] use std::future::Future; /// A set of asynchronous actions to be performed by some runtime. pub enum Command { None, Single(Action), Batch(Vec>), } impl Command { /// Creates an empty [`Command`]. /// /// In other words, a [`Command`] that does nothing. pub fn none() -> Self { Self::None } /// Creates a [`Command`] that performs the action of the given future. #[cfg(target_arch = "wasm32")] pub fn perform( future: impl Future + 'static, f: impl Fn(T) -> A + 'static + Send, ) -> Command { use iced_futures::futures::FutureExt; Command::Single(Action::Future(Box::pin(future.map(f)))) } /// Applies a transformation to the result of a [`Command`]. #[cfg(target_arch = "wasm32")] pub fn map(mut self, f: impl Fn(T) -> A + 'static + Clone) -> Command where T: 'static, { match self { Self::None => Command::None, Self::Single(action) => Command::Single(action.map(f)), Self::Batch(batch) => Command::Batch( batch .into_iter() .map(|action| action.map(f.clone())) .collect(), ), } } /// Creates a [`Command`] that performs the actions of all the given /// commands. /// /// Once this command is run, all the commands will be executed at once. pub fn batch(commands: impl IntoIterator>) -> Self { let mut batch = Vec::new(); for command in commands { match command { Self::None => {} Self::Single(command) => batch.push(command), Self::Batch(commands) => batch.extend(commands), } } Self::Batch(batch) } pub fn actions(self) -> Vec> { match self { Self::None => Vec::new(), Self::Single(action) => vec![action], Self::Batch(batch) => batch, } } }