pub struct PriorityEventDispatcher<P, T>where
P: Ord,
T: PartialEq + Eq + Hash + Clone + Send + Sync + 'static,{ /* private fields */ }
Expand description
In charge of prioritised sync dispatching to all listeners.
Owns a map event-variants and Weak
-references to their
listeners and/or owns Fn
s.
Opposed to EventListener
, this structure utilises one BTreeMap
per
event-type to order listeners by a given priority-level.
Note: Consider implementing your own Ord
-trait, if you
want a different kind of order.
Implementations§
source§impl<P, T> PriorityEventDispatcher<P, T>where
P: Ord + Clone,
T: PartialEq + Eq + Hash + Clone + Send + Sync + 'static,
impl<P, T> PriorityEventDispatcher<P, T>where
P: Ord + Clone,
T: PartialEq + Eq + Hash + Clone + Send + Sync + 'static,
sourcepub fn add_listener<D: Listener<T> + Send + Sync + 'static>(
&mut self,
event_identifier: T,
listener: &Arc<Mutex<D>>,
priority: P
)
pub fn add_listener<D: Listener<T> + Send + Sync + 'static>(
&mut self,
event_identifier: T,
listener: &Arc<Mutex<D>>,
priority: P
)
Adds a Listener
to listen for an event_identifier
, considering
a given priority
implementing the Ord
-trait, to sort dispatch-order.
If event_identifier
is a new HashMap
-key, it will be added.
Note: If your Enum
owns fields you need to consider implementing
the Hash
- and PartialEq
-trait if you want to ignore fields,
see second example for an implementation-suggestion.
Examples
Adding a Listener
to the dispatcher:
extern crate hey_listen;
use std::sync::Arc;
use hey_listen::{Listener, Mutex, PriorityEventDispatcher, SyncDispatcherRequest};
#[derive(Clone, Eq, Hash, PartialEq)]
enum Event {
EventType,
}
struct ListenerStruct {}
impl Listener<Event> for ListenerStruct {
fn on_event(&mut self, event: &Event) -> Option<SyncDispatcherRequest> { None }
}
fn main() {
let listener = Arc::new(Mutex::new(ListenerStruct {}));
let mut dispatcher: PriorityEventDispatcher<u32, Event> = PriorityEventDispatcher::default();
dispatcher.add_listener(Event::EventType, &listener, 1);
}
Declaring your own Hash
- and PartialEq
-trait to bypass
hashing on fields:
use std::hash::{Hash, Hasher};
use std::mem::discriminant;
#[derive(Clone)]
enum Event {
TestVariant(i32),
}
impl Hash for Event {
fn hash<H: Hasher>(&self, _state: &mut H) {}
}
impl PartialEq for Event {
fn eq(&self, other: &Event) -> bool {
discriminant(self) == discriminant(other)
}
}
impl Eq for Event {}
sourcepub fn add_fn(
&mut self,
event_identifier: T,
function: Box<dyn Fn(&T) -> Option<SyncDispatcherRequest> + Send + Sync>,
priority: P
)
pub fn add_fn(
&mut self,
event_identifier: T,
function: Box<dyn Fn(&T) -> Option<SyncDispatcherRequest> + Send + Sync>,
priority: P
)
Adds an Fn
to listen for an event_identifier
, considering
a given priority
implementing the Ord
-trait in order to sort dispatch-order.
If event_identifier
is a new HashMap
-key, it will be added.
Examples
Adding an Fn
to the dispatcher:
extern crate hey_listen;
use hey_listen::{Mutex, PriorityEventDispatcher, SyncDispatcherRequest};
use std::sync::Arc;
#[derive(Clone, Eq, Hash, PartialEq)]
enum Event {
EventType,
}
struct EventListener {
used_method: bool,
}
impl EventListener {
fn test_method(&mut self, _event: &Event) {
self.used_method = true;
}
}
fn main() {
let listener = Arc::new(Mutex::new(EventListener { used_method: false }));
let mut dispatcher: PriorityEventDispatcher<u32, Event> = PriorityEventDispatcher::default();
let weak_listener_ref = Arc::downgrade(&Arc::clone(&listener));
let closure = Box::new(move |event: &Event| -> Option<SyncDispatcherRequest> {
if let Some(listener) = weak_listener_ref.upgrade() {
listener.lock().test_method(&event);
None
} else {
Some(SyncDispatcherRequest::StopListening)
}
});
dispatcher.add_fn(Event::EventType, closure, 1);
}
sourcepub fn dispatch_event(&mut self, event_identifier: &T)
pub fn dispatch_event(&mut self, event_identifier: &T)
All Listener
s listening to a passed event_identifier
will be called via their implemented on_event
-method.
Fn
s returning Result
with Ok(())
will be retained
and Err(SyncDispatcherRequest::StopListening)
will cause them to
be removed from the event-dispatcher.
Notice: Listener
s will called ordered by their priority-level.