1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use std::time::{Duration, Instant};

/// Regulate minimum time intervals between some tasks.
#[derive(Debug)]
pub struct Pacemaker {
    min_interval: Duration,
    last_reset: Instant,
}

impl Pacemaker {
    /// Crate Pacemaker with minimum interval between ticks.
    pub fn new(min_interval: Duration) -> Pacemaker {
        Pacemaker {
            min_interval,
            last_reset: Instant::now(),
        }
    }

    /// Checks if minimum interval time has elapsed; returns true and resets if it did.
    pub fn tick(&mut self) -> bool {
        let now = Instant::now();
        if now.duration_since(self.last_reset) > self.min_interval {
            self.last_reset = now;
            return true
        }
        false
    }
}