Skip to main content

okee_wheel_timer/
event.rs

1/// Unique identifier of an event inside a wheel instance.
2///
3/// IDs are assigned by [`HashedWheelTimer::schedule`](crate::HashedWheelTimer::schedule)
4/// and preserved by update/reschedule operations.
5pub type EventId = u64;
6
7/// A scheduled event stored in the wheel.
8///
9/// `Event` values are returned by read/pop/remove operations.
10/// They carry metadata used by the wheel scheduler:
11/// - [`tick`](Self::tick): absolute tick when the event can be processed.
12/// - [`delta_tick`](Self::delta_tick): wave index within the same `tick`.
13///
14/// # Example
15/// ```
16/// use okee_wheel_timer::HashedWheelTimer;
17///
18/// let mut wheel = HashedWheelTimer::new(8);
19/// let id = wheel.schedule(0, "payload").id;
20///
21/// let events = wheel.pop_events();
22/// assert_eq!(events[0].id(), id);
23/// assert_eq!(events[0].tick(), 0);
24/// assert_eq!(events[0].data(), &"payload");
25/// ```
26#[derive(Debug, Clone, Copy)]
27pub struct Event<T> {
28    id: EventId,
29    tick: u64,
30    delta_tick: u64,
31    data: T,
32}
33
34impl<T> Event<T> {
35    pub(crate) fn new(id: EventId, tick: u64, delta_tick: u64, data: T) -> Self {
36        Self {
37            id,
38            tick,
39            delta_tick,
40            data,
41        }
42    }
43
44    /// Returns the unique ID of this event.
45    pub fn id(&self) -> EventId {
46        self.id
47    }
48
49    /// Returns the absolute tick when this event becomes available.
50    pub fn tick(&self) -> u64 {
51        self.tick
52    }
53
54    /// Returns the wave number inside [`tick`](Self::tick).
55    ///
56    /// Events with the same `(tick, delta_tick)` are popped together.
57    pub fn delta_tick(&self) -> u64 {
58        self.delta_tick
59    }
60
61    /// Returns a shared reference to the payload.
62    pub fn data(&self) -> &T {
63        &self.data
64    }
65
66    /// Consumes the event and returns its payload.
67    pub fn into_data(self) -> T {
68        self.data
69    }
70}