use std::time::{Duration, Instant};
pub struct Stopwatch {
beginning: Instant,
elapsed: Duration,
is_running: bool,
}
impl Default for Stopwatch {
fn default() -> Self {
Self::new()
}
}
impl Stopwatch {
pub fn new() -> Self {
Self {
beginning: Instant::now(),
elapsed: Duration::ZERO,
is_running: false,
}
}
pub fn start(&mut self) {
if !self.is_running {
self.beginning = Instant::now();
self.is_running = true;
}
}
pub fn stop(&mut self) {
if self.is_running {
self.elapsed += self.beginning.elapsed();
self.is_running = false;
}
}
pub fn reset(&mut self) {
self.elapsed = Duration::ZERO;
self.is_running = false;
self.beginning = Instant::now();
}
pub fn seek(&mut self, t: &Duration) {
self.elapsed = *t;
if self.is_running {
self.beginning = Instant::now();
}
}
pub fn value(&self) -> Duration {
if self.is_running {
self.elapsed + self.beginning.elapsed()
} else {
self.elapsed
}
}
}