diff options
| author | 2021-09-01 19:21:49 +0700 | |
|---|---|---|
| committer | 2021-09-02 13:29:34 +0700 | |
| commit | 76698ff2b5753e637b14533650c0d28e681be3c5 (patch) | |
| tree | 6b3376df6ac84598b03f2885598b7908e993fe4a /futures | |
| parent | b7b7741578257bbf6a8b873c360182e2c9b920ab (diff) | |
| download | iced-76698ff2b5753e637b14533650c0d28e681be3c5.tar.gz iced-76698ff2b5753e637b14533650c0d28e681be3c5.tar.bz2 iced-76698ff2b5753e637b14533650c0d28e681be3c5.zip | |
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!)
Diffstat (limited to 'futures')
| -rw-r--r-- | futures/src/command.rs | 138 | ||||
| -rw-r--r-- | futures/src/lib.rs | 2 | ||||
| -rw-r--r-- | futures/src/runtime.rs | 21 | 
3 files changed, 9 insertions, 152 deletions
| 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<T> { -    futures: Vec<BoxFuture<T>>, -} - -impl<T> Command<T> { -    /// 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<A>( -        future: impl Future<Output = T> + 'static + Send, -        f: impl Fn(T) -> A + 'static + Send, -    ) -> Command<A> { -        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<A>( -        future: impl Future<Output = T> + 'static, -        f: impl Fn(T) -> A + 'static + Send, -    ) -> Command<A> { -        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<A>( -        mut self, -        f: impl Fn(T) -> A + 'static + Send + Sync, -    ) -> Command<A> -    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<A> -                }) -                .collect(), -        } -    } - -    /// Applies a transformation to the result of a [`Command`]. -    #[cfg(target_arch = "wasm32")] -    pub fn map<A>(mut self, f: impl Fn(T) -> A + 'static) -> Command<A> -    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<A> -                }) -                .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<Item = Command<T>>) -> 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<BoxFuture<T>> { -        self.futures -    } -} - -#[cfg(not(target_arch = "wasm32"))] -impl<T, A> From<A> for Command<T> -where -    A: Future<Output = T> + 'static + Send, -{ -    fn from(future: A) -> Self { -        Self { -            futures: vec![future.boxed()], -        } -    } -} - -#[cfg(target_arch = "wasm32")] -impl<T, A> From<A> for Command<T> -where -    A: Future<Output = T> + 'static, -{ -    fn from(future: A) -> Self { -        Self { -            futures: vec![future.boxed_local()], -        } -    } -} - -impl<T> std::fmt::Debug for Command<T> { -    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<Message>) { +    pub fn spawn(&mut self, future: BoxFuture<Message>) {          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`]. | 
