diff options
| author | 2021-07-22 12:37:39 -0500 | |
|---|---|---|
| committer | 2021-07-22 12:37:39 -0500 | |
| commit | e822f654e44d2d7375b7fda966bb772055f377d4 (patch) | |
| tree | 8707561f1bb09c9e58cc9d9884bfb16d956f9f65 /futures | |
| parent | 1c06920158e1a47977b2762bf8b34e56fd1a935a (diff) | |
| parent | dc0b96ce407283f2ffd9add5ad339f89097555d3 (diff) | |
| download | iced-e822f654e44d2d7375b7fda966bb772055f377d4.tar.gz iced-e822f654e44d2d7375b7fda966bb772055f377d4.tar.bz2 iced-e822f654e44d2d7375b7fda966bb772055f377d4.zip | |
Merge branch 'master' of https://github.com/hecrj/iced into wgpu_outdatedframe
Diffstat (limited to 'futures')
| -rw-r--r-- | futures/Cargo.toml | 11 | ||||
| -rw-r--r-- | futures/src/executor.rs | 6 | ||||
| -rw-r--r-- | futures/src/executor/smol.rs | 18 | ||||
| -rw-r--r-- | futures/src/lib.rs | 16 | ||||
| -rw-r--r-- | futures/src/subscription.rs | 6 | ||||
| -rw-r--r-- | futures/src/subscription/tracker.rs | 2 | ||||
| -rw-r--r-- | futures/src/time.rs | 47 | 
7 files changed, 93 insertions, 13 deletions
| diff --git a/futures/Cargo.toml b/futures/Cargo.toml index e8e47c08..3cea6e1a 100644 --- a/futures/Cargo.toml +++ b/futures/Cargo.toml @@ -1,6 +1,6 @@  [package]  name = "iced_futures" -version = "0.2.0" +version = "0.3.0"  authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]  edition = "2018"  description = "Commands, subscriptions, and runtimes for Iced" @@ -26,15 +26,20 @@ optional = true  features = ["rt-core", "rt-threaded", "time", "stream"]  [target.'cfg(not(target_arch = "wasm32"))'.dependencies.tokio] -version = "0.3" +package = "tokio" +version = "1.0"  optional = true -features = ["rt-multi-thread", "time", "stream"] +features = ["rt", "rt-multi-thread", "time"]  [target.'cfg(not(target_arch = "wasm32"))'.dependencies.async-std]  version = "1.0"  optional = true  features = ["unstable"] +[target.'cfg(not(target_arch = "wasm32"))'.dependencies.smol] +version = "1.2" +optional = true +  [target.'cfg(target_arch = "wasm32")'.dependencies]  wasm-bindgen-futures = "0.4" diff --git a/futures/src/executor.rs b/futures/src/executor.rs index fa87216a..b35b5bc1 100644 --- a/futures/src/executor.rs +++ b/futures/src/executor.rs @@ -13,6 +13,9 @@ mod tokio_old;  #[cfg(all(not(target_arch = "wasm32"), feature = "async-std"))]  mod async_std; +#[cfg(all(not(target_arch = "wasm32"), feature = "smol"))] +mod smol; +  #[cfg(target_arch = "wasm32")]  mod wasm_bindgen; @@ -30,6 +33,9 @@ pub use self::tokio_old::TokioOld;  #[cfg(all(not(target_arch = "wasm32"), feature = "async-std"))]  pub use self::async_std::AsyncStd; +#[cfg(all(not(target_arch = "wasm32"), feature = "smol"))] +pub use self::smol::Smol; +  #[cfg(target_arch = "wasm32")]  pub use wasm_bindgen::WasmBindgen; diff --git a/futures/src/executor/smol.rs b/futures/src/executor/smol.rs new file mode 100644 index 00000000..deafd43a --- /dev/null +++ b/futures/src/executor/smol.rs @@ -0,0 +1,18 @@ +use crate::Executor; + +use futures::Future; + +/// A `smol` runtime. +#[cfg_attr(docsrs, doc(cfg(feature = "smol")))] +#[derive(Debug)] +pub struct Smol; + +impl Executor for Smol { +    fn new() -> Result<Self, futures::io::Error> { +        Ok(Self) +    } + +    fn spawn(&self, future: impl Future<Output = ()> + Send + 'static) { +        smol::spawn(future).detach(); +    } +} diff --git a/futures/src/lib.rs b/futures/src/lib.rs index c7c6fd3a..01cf5c89 100644 --- a/futures/src/lib.rs +++ b/futures/src/lib.rs @@ -17,10 +17,22 @@ pub mod executor;  pub mod subscription;  #[cfg(all( -    any(feature = "tokio", feature = "tokio_old", feature = "async-std"), +    any( +        feature = "tokio", +        feature = "tokio_old", +        feature = "async-std", +        feature = "smol" +    ),      not(target_arch = "wasm32")  ))] -#[cfg_attr(docsrs, doc(cfg(any(feature = "tokio", feature = "async-std"))))] +#[cfg_attr( +    docsrs, +    doc(cfg(any( +        feature = "tokio", +        feature = "async-std", +        feature = "smol" +    ))) +)]  pub mod time;  pub use command::Command; diff --git a/futures/src/subscription.rs b/futures/src/subscription.rs index 27d2d295..e60ad79a 100644 --- a/futures/src/subscription.rs +++ b/futures/src/subscription.rs @@ -125,9 +125,9 @@ impl<I, O, H> std::fmt::Debug for Subscription<I, O, H> {  /// - [`stopwatch`], a watch with start/stop and reset buttons showcasing how  /// to listen to time.  /// -/// [examples]: https://github.com/hecrj/iced/tree/0.2/examples -/// [`download_progress`]: https://github.com/hecrj/iced/tree/0.2/examples/download_progress -/// [`stopwatch`]: https://github.com/hecrj/iced/tree/0.2/examples/stopwatch +/// [examples]: https://github.com/hecrj/iced/tree/0.3/examples +/// [`download_progress`]: https://github.com/hecrj/iced/tree/0.3/examples/download_progress +/// [`stopwatch`]: https://github.com/hecrj/iced/tree/0.3/examples/stopwatch  pub trait Recipe<Hasher: std::hash::Hasher, Event> {      /// The events that will be produced by a [`Subscription`] with this      /// [`Recipe`]. diff --git a/futures/src/subscription/tracker.rs b/futures/src/subscription/tracker.rs index 43222b5b..3a8d4a87 100644 --- a/futures/src/subscription/tracker.rs +++ b/futures/src/subscription/tracker.rs @@ -135,7 +135,7 @@ where              .filter_map(|connection| connection.listener.as_mut())              .for_each(|listener| {                  if let Err(error) = listener.try_send(event.clone()) { -                    log::error!( +                    log::warn!(                          "Error sending event to subscription: {:?}",                          error                      ); diff --git a/futures/src/time.rs b/futures/src/time.rs index 5e9ea436..86b4a4e7 100644 --- a/futures/src/time.rs +++ b/futures/src/time.rs @@ -13,6 +13,33 @@ pub fn every<H: std::hash::Hasher, E>(  struct Every(std::time::Duration); +#[cfg(all( +    not(any(feature = "tokio_old", feature = "tokio", feature = "async-std")), +    feature = "smol" +))] +impl<H, E> subscription::Recipe<H, E> for Every +where +    H: std::hash::Hasher, +{ +    type Output = std::time::Instant; + +    fn hash(&self, state: &mut H) { +        use std::hash::Hash; + +        std::any::TypeId::of::<Self>().hash(state); +        self.0.hash(state); +    } + +    fn stream( +        self: Box<Self>, +        _input: futures::stream::BoxStream<'static, E>, +    ) -> futures::stream::BoxStream<'static, Self::Output> { +        use futures::stream::StreamExt; + +        smol::Timer::interval(self.0).boxed() +    } +} +  #[cfg(feature = "async-std")]  impl<H, E> subscription::Recipe<H, E> for Every  where @@ -41,7 +68,7 @@ where  #[cfg(all(      any(feature = "tokio", feature = "tokio_old"), -    not(feature = "async-std") +    not(any(feature = "async-std", feature = "smol"))  ))]  impl<H, E> subscription::Recipe<H, E> for Every  where @@ -67,8 +94,20 @@ where          let start = tokio::time::Instant::now() + self.0; -        tokio::time::interval_at(start, self.0) -            .map(|_| std::time::Instant::now()) -            .boxed() +        let stream = { +            #[cfg(feature = "tokio")] +            { +                futures::stream::unfold( +                    tokio::time::interval_at(start, self.0), +                    |mut interval| async move { +                        Some((interval.tick().await, interval)) +                    }, +                ) +            } +            #[cfg(feature = "tokio_old")] +            tokio::time::interval_at(start, self.0) +        }; + +        stream.map(tokio::time::Instant::into_std).boxed()      }  } | 
