gwr_engine/events/mod.rs
1// Copyright (c) 2023 Graphcore Ltd. All rights reserved.
2
3//! Different types of events.
4//!
5//! Events should be used to coordinate between
6//! [spawned](crate::executor::Spawner) tasks so that they can run in an
7//! event-driven manner and yield until there is something ready to process.
8//!
9//! [Basic events](crate::events::once) are created to be triggered once using
10//! `notify()` method. Any number of other tasks can be waiting for the event
11//! to be triggered. The `listen()` method is used to wait for the event to be
12//! triggered.
13//!
14//! # Example:
15//!
16//! An event being created to co-ordinate between two tasks.
17//!
18//! ```rust
19//! # use gwr_engine::engine::Engine;
20//! # use gwr_engine::events::once::Once;
21//! # use gwr_engine::run_simulation;
22//! # use gwr_engine::traits::Event;
23//! #
24//! fn spawn_listen<T>(engine: &mut Engine, event: Once<T>)
25//! where
26//! T: Copy + 'static,
27//! {
28//! engine.spawn(async move {
29//! event.listen().await;
30//! println!("After event");
31//! Ok(())
32//! });
33//! }
34//!
35//! fn spawn_notify<T>(engine: &mut Engine, event: Once<T>)
36//! where
37//! T: Copy + 'static,
38//! {
39//! let clock = engine.default_clock();
40//! engine.spawn(async move {
41//! clock.wait_ticks(10).await;
42//! println!("Trigger event");
43//! event.notify();
44//! Ok(())
45//! });
46//! }
47//!
48//! fn main() {
49//! let mut engine = Engine::default();
50//! let event = Once::default();
51//! spawn_listen(&mut engine, event.clone());
52//! spawn_notify(&mut engine, event);
53//! run_simulation!(engine);
54//! # assert_eq!(engine.time_now_ns(), 10.0);
55//! }
56//! ```
57
58pub mod all_of;
59pub mod any_of;
60pub mod once;
61pub mod repeated;