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;