Skip to main content

proteus_lib/tools/
timer.rs

1//! Simple pause/resume timer utility.
2
3use std::time::{Duration, Instant};
4
5/// A pauseable timer that accumulates elapsed duration.
6#[derive(Debug, Clone)]
7pub struct Timer {
8    pub time: Duration,
9    start_time: Option<Instant>,
10}
11
12impl Timer {
13    /// Create a new timer in the stopped state.
14    pub fn new() -> Self {
15        Self {
16            time: Duration::new(0, 0),
17            start_time: None,
18        }
19    }
20
21    /// Start or restart timing from the current accumulated time.
22    pub fn start(&mut self) {
23        self.start_time = Some(Instant::now());
24    }
25
26    /// Start timing at a specific offset.
27    pub fn start_at(&mut self, time: Duration) {
28        self.start_time = Some(Instant::now());
29        self.time = time;
30    }
31
32    /// Resume timing if it is currently paused.
33    pub fn un_pause(&mut self) {
34        if self.start_time == None {
35            self.start_time = Some(Instant::now());
36        }
37    }
38
39    /// Pause timing and accumulate elapsed duration.
40    pub fn pause(&mut self) {
41        if let Some(start) = self.start_time {
42            self.time += start.elapsed();
43            self.start_time = None;
44        }
45    }
46
47    /// Stop and reset the timer.
48    pub fn stop(&mut self) {
49        self.reset();
50    }
51
52    /// Get the current elapsed duration.
53    pub fn get_time(&self) -> Duration {
54        if let Some(start) = self.start_time {
55            self.time + start.elapsed()
56        } else {
57            self.time
58        }
59    }
60
61    /// Reset the timer to zero without running.
62    pub fn reset(&mut self) {
63        self.start_time = None;
64        self.time = Duration::new(0, 0);
65    }
66}