From 76698ff2b5753e637b14533650c0d28e681be3c5 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 1 Sep 2021 19:21:49 +0700 Subject: Make `Command` implementations platform-specific This allows us to introduce a platform-specific `Action` to both `iced_native` and `iced_web` and remove the `Clipboard` from `Application::update` to maintain purity. Additionally, this should let us implement further actions to let users query and modify the shell environment (e.g. window, clipboard, and more!) --- futures/src/command.rs | 138 ------------------------------------------------- futures/src/lib.rs | 2 - futures/src/runtime.rs | 21 ++++---- 3 files changed, 9 insertions(+), 152 deletions(-) delete mode 100644 futures/src/command.rs (limited to 'futures') diff --git a/futures/src/command.rs b/futures/src/command.rs deleted file mode 100644 index b06ab3f8..00000000 --- a/futures/src/command.rs +++ /dev/null @@ -1,138 +0,0 @@ -use crate::BoxFuture; -use futures::future::{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`]. -pub struct Command { - futures: Vec>, -} - -impl Command { - /// Creates an empty [`Command`]. - /// - /// In other words, a [`Command`] that does nothing. - pub fn none() -> Self { - Self { - futures: Vec::new(), - } - } - - /// Creates a [`Command`] that performs the action of the given future. - #[cfg(not(target_arch = "wasm32"))] - pub fn perform( - future: impl Future + 'static + Send, - f: impl Fn(T) -> A + 'static + Send, - ) -> Command { - Command { - futures: vec![Box::pin(future.map(f))], - } - } - - /// 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 { - Command { - futures: vec![Box::pin(future.map(f))], - } - } - - /// Applies a transformation to the result of a [`Command`]. - #[cfg(not(target_arch = "wasm32"))] - pub fn map( - mut self, - f: impl Fn(T) -> A + 'static + Send + Sync, - ) -> Command - where - T: 'static, - { - let f = std::sync::Arc::new(f); - - Command { - futures: self - .futures - .drain(..) - .map(|future| { - let f = f.clone(); - - Box::pin(future.map(move |result| f(result))) - as BoxFuture - }) - .collect(), - } - } - - /// Applies a transformation to the result of a [`Command`]. - #[cfg(target_arch = "wasm32")] - pub fn map(mut self, f: impl Fn(T) -> A + 'static) -> Command - where - T: 'static, - { - let f = std::rc::Rc::new(f); - - Command { - futures: self - .futures - .drain(..) - .map(|future| { - let f = f.clone(); - - Box::pin(future.map(move |result| f(result))) - as BoxFuture - }) - .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 { - Self { - futures: commands - .into_iter() - .flat_map(|command| command.futures) - .collect(), - } - } - - /// Converts a [`Command`] into its underlying list of futures. - pub fn futures(self) -> Vec> { - self.futures - } -} - -#[cfg(not(target_arch = "wasm32"))] -impl From for Command -where - A: Future + 'static + Send, -{ - fn from(future: A) -> Self { - Self { - futures: vec![future.boxed()], - } - } -} - -#[cfg(target_arch = "wasm32")] -impl From for Command -where - A: Future + 'static, -{ - fn from(future: A) -> Self { - Self { - futures: vec![future.boxed_local()], - } - } -} - -impl std::fmt::Debug for Command { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Command").finish() - } -} diff --git a/futures/src/lib.rs b/futures/src/lib.rs index 01cf5c89..657aab37 100644 --- a/futures/src/lib.rs +++ b/futures/src/lib.rs @@ -10,7 +10,6 @@ pub use futures; -mod command; mod runtime; pub mod executor; @@ -35,7 +34,6 @@ pub mod subscription; )] pub mod time; -pub use command::Command; pub use executor::Executor; pub use runtime::Runtime; pub use subscription::Subscription; diff --git a/futures/src/runtime.rs b/futures/src/runtime.rs index e56a4eb0..7779e235 100644 --- a/futures/src/runtime.rs +++ b/futures/src/runtime.rs @@ -1,5 +1,6 @@ //! Run commands and keep track of subscriptions. -use crate::{subscription, Command, Executor, Subscription}; +use crate::BoxFuture; +use crate::{subscription, Executor, Subscription}; use futures::{channel::mpsc, Sink}; use std::marker::PhantomData; @@ -51,22 +52,18 @@ where /// /// The resulting `Message` will be forwarded to the `Sender` of the /// [`Runtime`]. - pub fn spawn(&mut self, command: Command) { + pub fn spawn(&mut self, future: BoxFuture) { use futures::{FutureExt, SinkExt}; - let futures = command.futures(); + let mut sender = self.sender.clone(); - for future in futures { - let mut sender = self.sender.clone(); - - let future = future.then(|message| async move { - let _ = sender.send(message).await; + let future = future.then(|message| async move { + let _ = sender.send(message).await; - () - }); + () + }); - self.executor.spawn(future); - } + self.executor.spawn(future); } /// Tracks a [`Subscription`] in the [`Runtime`]. -- cgit