diff options
author | 2022-01-28 18:43:20 +0700 | |
---|---|---|
committer | 2022-01-28 21:37:17 +0700 | |
commit | e730d97f61bc2edc77d2f061b6a763c4d0a948df (patch) | |
tree | 8966e2ad3b093c83295b3ad0c5b8d1c460a1c158 /futures | |
parent | 167be45a7db7c1f60a79116766bdf38300429c6a (diff) | |
download | iced-e730d97f61bc2edc77d2f061b6a763c4d0a948df.tar.gz iced-e730d97f61bc2edc77d2f061b6a763c4d0a948df.tar.bz2 iced-e730d97f61bc2edc77d2f061b6a763c4d0a948df.zip |
Implement `time` module for `wasm-bindgen` backend in `iced_futures`
Diffstat (limited to 'futures')
-rw-r--r-- | futures/Cargo.toml | 1 | ||||
-rw-r--r-- | futures/src/backend/wasm/wasm_bindgen.rs | 44 |
2 files changed, 45 insertions, 0 deletions
diff --git a/futures/Cargo.toml b/futures/Cargo.toml index aa55df1e..93c7693d 100644 --- a/futures/Cargo.toml +++ b/futures/Cargo.toml @@ -36,6 +36,7 @@ optional = true [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen-futures = "0.4" +wasm-timer = "0.2" [package.metadata.docs.rs] rustdoc-args = ["--cfg", "docsrs"] diff --git a/futures/src/backend/wasm/wasm_bindgen.rs b/futures/src/backend/wasm/wasm_bindgen.rs index e914aeba..b726501a 100644 --- a/futures/src/backend/wasm/wasm_bindgen.rs +++ b/futures/src/backend/wasm/wasm_bindgen.rs @@ -13,3 +13,47 @@ impl crate::Executor for Executor { wasm_bindgen_futures::spawn_local(future); } } + +pub mod time { + //! Listen and react to time. + use crate::subscription::{self, Subscription}; + use crate::BoxStream; + + /// Returns a [`Subscription`] that produces messages at a set interval. + /// + /// The first message is produced after a `duration`, and then continues to + /// produce more messages every `duration` after that. + pub fn every<H: std::hash::Hasher, E>( + duration: std::time::Duration, + ) -> Subscription<H, E, wasm_timer::Instant> { + Subscription::from_recipe(Every(duration)) + } + + #[derive(Debug)] + struct Every(std::time::Duration); + + impl<H, E> subscription::Recipe<H, E> for Every + where + H: std::hash::Hasher, + { + type Output = wasm_timer::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: BoxStream<E>, + ) -> BoxStream<Self::Output> { + use futures::stream::StreamExt; + + wasm_timer::Interval::new(self.0) + .map(|_| wasm_timer::Instant::now()) + .boxed_local() + } + } +} |