karyon_core::event

Struct EventEmitter

Source
pub struct EventEmitter<T> {
    listeners: Mutex<HashMap<T, HashMap<String, HashMap<EventListenerID, Sender<Event>>>>>,
    listener_buffer_size: usize,
}
Expand description

EventEmitter emits events to registered listeners based on topics.

§Example

use karyon_core::event::{EventEmitter, EventValueTopic, EventValue};

 async {
    let event_emitter = EventEmitter::new();

    #[derive(Hash, PartialEq, Eq, Debug, Clone)]
    enum Topic {
        TopicA,
        TopicB,
    }

    #[derive(Clone, Debug, PartialEq)]
    struct A(usize);

   impl EventValue for A {
        fn id() -> &'static str {
            "A"
        }
    }

    let listener = event_emitter.register::<A>(&Topic::TopicA).await;

    event_emitter.emit_by_topic(&Topic::TopicA, &A(3)) .await;
    let msg: A = listener.recv().await.unwrap();

    #[derive(Clone, Debug, PartialEq)]
    struct B(usize);

    impl EventValue for B {
        fn id() -> &'static str {
            "B"
        }
    }

    impl EventValueTopic for B {
        type Topic = Topic;
        fn topic() -> Self::Topic{
            Topic::TopicB
        }
    }

    let listener = event_emitter.register::<B>(&Topic::TopicB).await;

    event_emitter.emit(&B(3)) .await;
    let msg: B = listener.recv().await.unwrap();

    // ....
 };

Fields§

§listeners: Mutex<HashMap<T, HashMap<String, HashMap<EventListenerID, Sender<Event>>>>>§listener_buffer_size: usize

Implementations§

Source§

impl<T> EventEmitter<T>
where T: Hash + Eq + Debug + Clone,

Source

pub fn new() -> Arc<EventEmitter<T>>

Creates a new EventEmitter

Source

pub fn with_buffer_size(size: usize) -> Arc<EventEmitter<T>>

Creates a new EventEmitter with the provided buffer size for the EventListener channel.

This is important to control the memory used by the listener channel. If the consumer for the event listener can’t keep up with the new events coming, then the channel buffer will fill with new events, and if the buffer is full, the emit function will block until the listener starts to consume the buffered events.

If size is zero, this function will panic.

Source

pub async fn emit<E: EventValueTopic<Topic = T> + Clone>( &self, value: &E, ) -> Result<()>

Emits an event to the listeners.

The event must implement the EventValueTopic trait to indicate the topic of the event. Otherwise, you can use emit_by_topic().

Source

pub async fn emit_by_topic<E: EventValueAny + EventValue + Clone>( &self, topic: &T, value: &E, ) -> Result<()>

Emits an event to the listeners.

Source

pub async fn register<E: EventValueAny + EventValue + Clone>( self: &Arc<Self>, topic: &T, ) -> EventListener<T, E>

Registers a new event listener for the given topic.

Source

pub async fn clear(self: &Arc<Self>)

Remove all topics and event listeners

Source

pub async fn unregister_topic(self: &Arc<Self>, topic: &T)

Unregisters all event listeners for the given topic.

Source

async fn remove(&self, topic: &T, event_id: &str, listener_id: &EventListenerID)

Removes the event listener attached to the given topic.

Auto Trait Implementations§

§

impl<T> !Freeze for EventEmitter<T>

§

impl<T> !RefUnwindSafe for EventEmitter<T>

§

impl<T> Send for EventEmitter<T>
where T: Send,

§

impl<T> Sync for EventEmitter<T>
where T: Send,

§

impl<T> Unpin for EventEmitter<T>
where T: Unpin,

§

impl<T> UnwindSafe for EventEmitter<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more