rgb_sequencer/time.rs
1//! Time abstraction traits for platform-agnostic timing.
2
3/// Trait for abstracting time sources.
4pub trait TimeSource<I: TimeInstant> {
5 /// Returns the current time instant.
6 fn now(&self) -> I;
7}
8
9/// Trait abstraction for duration types.
10pub trait TimeDuration: Copy + PartialEq {
11 /// Zero duration constant.
12 const ZERO: Self;
13
14 /// Converts duration to milliseconds.
15 fn as_millis(&self) -> u64;
16
17 /// Creates duration from milliseconds.
18 fn from_millis(millis: u64) -> Self;
19
20 /// Saturating subtraction (returns ZERO on underflow).
21 fn saturating_sub(self, other: Self) -> Self;
22}
23
24/// Trait abstraction for instant types.
25pub trait TimeInstant: Copy {
26 /// Duration type for this instant.
27 type Duration: TimeDuration;
28
29 /// Calculates duration since an earlier instant.
30 fn duration_since(&self, earlier: Self) -> Self::Duration;
31
32 /// Adds duration to instant, returns None on overflow.
33 fn checked_add(self, duration: Self::Duration) -> Option<Self>;
34
35 /// Subtracts duration from instant, returns None on underflow.
36 fn checked_sub(self, duration: Self::Duration) -> Option<Self>;
37}