relay_cogs/
measurement.rs1use crate::time::{Duration, Instant};
2
3pub struct Measurements {
8    start: Instant,
9    categorized: Vec<Measurement>,
10}
11
12impl Measurements {
13    pub fn start() -> Self {
15        Measurements {
16            start: Instant::now(),
17            categorized: Vec::new(),
18        }
19    }
20
21    pub fn add(&mut self, duration: Duration, category: &'static str) {
23        self.categorized.push(Measurement {
24            duration,
25            category: Some(category),
26        });
27    }
28
29    pub fn finish(&self) -> impl Iterator<Item = Measurement> + '_ {
32        let mut duration = self.start.elapsed();
33        for c in &self.categorized {
34            duration = duration.saturating_sub(c.duration);
35        }
36
37        std::iter::once(Measurement {
38            duration,
39            category: None,
40        })
41        .chain(self.categorized.iter().copied())
42        .filter(|m| !m.duration.is_zero())
43    }
44}
45
46#[derive(Copy, Clone)]
48pub struct Measurement {
49    pub duration: Duration,
51    pub category: Option<&'static str>,
53}