Struct hey_listen::ParallelEventDispatcher [] [src]

pub struct ParallelEventDispatcher<T> where
    T: PartialEq + Eq + Hash + Clone + Send + Sync + 'static, 
{ /* fields omitted */ }

Owns a map of all listened event-variants, Weak-references to their listeners and Fns.

Methods

impl<T> ParallelEventDispatcher<T> where
    T: PartialEq + Eq + Hash + Clone + Send + Sync + 'static, 
[src]

[src]

Adds a ParallelListener to listen for an event_identifier. 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 ParallelListener to the dispatcher:

extern crate hey_listen;
extern crate parking_lot;
use std::sync::Arc;

use hey_listen::ParallelListener;
use hey_listen::ParallelEventDispatcher;
use hey_listen::ParallelDispatcherRequest;

#[derive(Clone, Eq, Hash, PartialEq)]
enum Event {
    EventType,
}

struct ListenerStruct {}

impl ParallelListener<Event> for ListenerStruct {
    fn on_event(&mut self, event: &Event) -> Option<ParallelDispatcherRequest> { None }
}

fn main() {
    let listener = Arc::new(parking_lot::Mutex::new(ListenerStruct {}));
    let mut dispatcher: ParallelEventDispatcher<Event> = ParallelEventDispatcher::default();

    dispatcher.add_listener(Event::EventType, &listener);
}

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 {}

[src]

Adds a Fn to listen for an event_identifier. 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 these.

Examples

Adding a Fn to the dispatcher:

extern crate hey_listen;
extern crate parking_lot;
extern crate failure;
#[macro_use]
extern crate failure_derive;

use hey_listen::ParallelEventDispatcher;
use hey_listen::ParallelDispatcherRequest;
use std::sync::Arc;
use parking_lot::Mutex;

#[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: ParallelEventDispatcher<Event> = ParallelEventDispatcher::default();
    let weak_listener_ref = Arc::downgrade(&Arc::clone(&listener));

    let closure = Box::new(move |event: &Event| -> Option<ParallelDispatcherRequest> {
        if let Some(listener) = weak_listener_ref.upgrade() {
            listener.lock().test_method(&event);
            None
        } else {
            Some(ParallelDispatcherRequest::StopListening)
        }
    });

    dispatcher.add_fn(Event::EventType, closure);
}

[src]

Immediately after calling this method, the dispatcher will attempt to build a thread-pool with num amount of threads. If internals fail to build, BuildError is returned.

Note: Failing to build the thread-pool will result in keeping the prior thread-pool, if one has been built before. If none has been built, none will be used; being default.

[src]

All ParallelListeners listening to a passed event_identifier will be called via their implemented on_event-method. Fns returning an Option wrapping ParallelDispatcherRequest with ParallelDispatcherRequest::StopListening will cause them to be removed from the event-dispatcher.

Trait Implementations

impl<T> Default for ParallelEventDispatcher<T> where
    T: PartialEq + Eq + Hash + Clone + Send + Sync + 'static, 
[src]

[src]

Returns the "default value" for a type. Read more

Auto Trait Implementations