mm1_proto_timer/
lib.rs

1use std::future::Future;
2use std::hash::Hash;
3use std::ops::{Add, Sub};
4
5use mm1_proto::{Message, message};
6
7pub trait Timer: 'static {
8    type Key: Ord + Clone + Send + Hash;
9    type Instant: Copy
10        + Send
11        + Ord
12        + Add<Self::Duration, Output = Self::Instant>
13        + Sub<Self::Instant, Output = Self::Duration>;
14    type Duration: Copy + Send + Default;
15    type Message: Message;
16
17    fn sleep(d: Self::Duration) -> impl Future<Output = ()> + Send;
18
19    #[doc(hidden)]
20    fn instant_plus_duration(t: Self::Instant, d: Self::Duration) -> Self::Instant {
21        t + d
22    }
23}
24
25#[cfg_attr(
26    feature = "serde",
27    derive(derive_more::Debug, serde::Serialize, serde::Deserialize)
28)]
29#[message]
30pub struct ScheduleOnce<T: Timer> {
31    pub key: T::Key,
32    pub at:  T::Instant,
33    pub msg: T::Message,
34}
35
36#[cfg_attr(
37    feature = "serde",
38    derive(derive_more::Debug, serde::Serialize, serde::Deserialize)
39)]
40#[message]
41pub struct SchedulePeriodic<T: Timer>
42where
43    T::Message: Clone,
44{
45    pub key:    T::Key,
46    pub delay:  T::Instant,
47    pub period: T::Duration,
48    pub msg:    T::Message,
49}
50
51#[cfg_attr(
52    feature = "serde",
53    derive(derive_more::Debug, serde::Serialize, serde::Deserialize)
54)]
55#[message]
56pub struct Cancel<T: Timer> {
57    pub key: T::Key,
58}