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}