Skip to main content

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}