1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
//! Provides an event system for Wolf Engine.
//!
//! # Examples
//!
//! This module provides a [FIFO](https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics))
//! (First-in, First-out) event system based on the sender / receiver / message channel found in
//! [std::sync::mpsc].
//!
//! ## Create an Event Queue
//!
//! ```
//! # use wolf_engine_events::*;
//! # enum EventType { Event };
//! #
//! let (event_sender, event_receiver) = mpsc::event_queue();
//! #
//! # event_sender.send_event(123);
//! ```
//!
//! ## Handling Events
//!
//! An [`EventReceiver`] will collect incoming events, and store them until they are ready to be
//! processed. The order of incoming events is always preserved.
//!
//! Queued events are queried in a loop. Querying events requires you have mutable access to the
//! Event Queue.
//!
//! ```
//! # use wolf_engine_events::*;
//! # enum EventType { Event };
//! #
//! # let (event_sender, mut event_receiver) = mpsc::event_queue::<EventType>();
//! #
//! while let Some(event) = event_receiver.next_event() {
//! match event {
//! EventType::Event => (), // Handle the event.
//! }
//! }
//! ```
//!
//! ## Sending Events
//!
//! To send an event to an [`EventReceiver`], we use an [`EventSender`]. An event sender is like
//! a tunnel, through which you can send data, and it will pop out on the other side.
//!
//! ```
//! # use wolf_engine_events::*;
//! # enum EventType { Event };
//! # let (event_sender, event_receiver) = mpsc::event_queue();
//! #
//! event_sender.send_event(EventType::Event);
//! ```
//!
//! ### Cloning, and Transferring Ownership of an `EventSender`
//!
//! Event Senders are extremely useful because they can be freely, and safely cloned, and their
//! ownership moved to other code that needs to send events. This enables sending events from
//! code that otherwise does not have access to the Event Queue.
//!
//! ```
//! # use wolf_engine_events::*;
//! # #[derive(Clone)]
//! # enum EventType { Event };
//! #
//! # struct SomeOtherType {
//! # pub event_sender: mpsc::MpscEventSender<EventType>,
//! # }
//! #
//! # impl SomeOtherType {
//! # fn new(event_sender: mpsc::MpscEventSender<EventType>) -> Self {
//! # Self { event_sender }
//! # }
//! # }
//! #
//! # fn some_other_function(event_sender: &mpsc::MpscEventSender<EventType>) {}
//! #
//! # let (event_sender, event_receiver) = mpsc::event_queue();
//! #
//! // The EventSender can be cloned, and freely passed around.
//! let other_type = SomeOtherType::new(event_sender.clone());
//! some_other_function(&event_sender);
//!
//! // The original EventSender is unaffected.
//! event_sender.send_event(EventType::Event);
//! ```
//!
//! ### Sending an `EventSender` to Another Thread
//!
//! Event Senders can be safely sent to other threads.
//!
//! ```
//! # use wolf_engine_events::*;
//! # enum EventType { Event };
//! # let (event_sender, event_receiver) = mpsc::event_queue();
//! #
//! // This EventSender stays on the main thread with the EventReceiver.
//! event_sender.send_event(EventType::Event);
//!
//! // The clone is moved to the other thread.
//! let thread_sender = event_sender.clone();
//! std::thread::spawn(move || {
//! thread_sender.send_event(EventType::Event);
//! }).join();
//! ```
#[cfg(feature = "dynamic")]
pub mod dynamic;
mod event_queue;
pub use event_queue::*;
pub mod mpsc;