Implement time module for wasm-bindgen backend in iced_futures

This commit is contained in:
Héctor Ramón Jiménez 2022-01-28 18:43:20 +07:00
parent 167be45a7d
commit e730d97f61
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
7 changed files with 61 additions and 21 deletions

View file

@ -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()
}
}
}