diff options
Diffstat (limited to '')
| -rw-r--r-- | native/src/subscription.rs | 22 | ||||
| -rw-r--r-- | native/src/subscription/events.rs | 19 | 
2 files changed, 36 insertions, 5 deletions
diff --git a/native/src/subscription.rs b/native/src/subscription.rs index 0d002c6c..18750abf 100644 --- a/native/src/subscription.rs +++ b/native/src/subscription.rs @@ -43,5 +43,25 @@ use events::Events;  /// [`Subscription`]: type.Subscription.html  /// [`Event`]: ../enum.Event.html  pub fn events() -> Subscription<Event> { -    Subscription::from_recipe(Events) +    Subscription::from_recipe(Events { f: Some }) +} + +/// Returns a [`Subscription`] that filters all the runtime events with the +/// provided function, producing messages accordingly. +/// +/// This subscription will call the provided function for every [`Event`] +/// handled by the runtime. If the function: +/// +/// - Returns `None`, the [`Event`] will be discarded. +/// - Returns `Some` message, the `Message` will be produced. +/// +/// [`Subscription`]: type.Subscription.html +/// [`Event`]: ../enum.Event.html +pub fn events_with<Message>( +    f: fn(Event) -> Option<Message>, +) -> Subscription<Message> +where +    Message: 'static + Send, +{ +    Subscription::from_recipe(Events { f })  } diff --git a/native/src/subscription/events.rs b/native/src/subscription/events.rs index ceae467d..a1ae6051 100644 --- a/native/src/subscription/events.rs +++ b/native/src/subscription/events.rs @@ -2,17 +2,26 @@ use crate::{      subscription::{EventStream, Recipe},      Event, Hasher,  }; +use iced_futures::futures::future; +use iced_futures::futures::StreamExt;  use iced_futures::BoxStream; -pub struct Events; +pub struct Events<Message> { +    pub(super) f: fn(Event) -> Option<Message>, +} -impl Recipe<Hasher, Event> for Events { -    type Output = Event; +impl<Message> Recipe<Hasher, Event> for Events<Message> +where +    Message: 'static + Send, +{ +    type Output = Message;      fn hash(&self, state: &mut Hasher) {          use std::hash::Hash; -        std::any::TypeId::of::<Self>().hash(state); +        struct Marker; +        std::any::TypeId::of::<Marker>().hash(state); +        self.f.hash(state);      }      fn stream( @@ -20,5 +29,7 @@ impl Recipe<Hasher, Event> for Events {          event_stream: EventStream,      ) -> BoxStream<Self::Output> {          event_stream +            .filter_map(move |event| future::ready((self.f)(event))) +            .boxed()      }  }  | 
