Skip to main content

entracte_lib/scheduler/
break_stats.rs

1use serde::Serialize;
2
3/// In-session break counters surfaced to the Insights tab.
4///
5/// Reset every time the scheduler starts; the persistent stats live in
6/// the JSONL event log under `crate::stats`. `postponed` counts each
7/// postpone, not unique breaks.
8#[derive(Debug, Clone, Default, Serialize)]
9pub struct BreakStats {
10    pub taken: u32,
11    pub skipped: u32,
12    pub postponed: u32,
13}
14
15impl BreakStats {
16    /// Skip ratio in `[0, 1]`, used to drive the overlay's "break
17    /// health" vignette: 0 when every offered break is taken, 1 when
18    /// every offered break is dismissed.
19    pub fn intensity(&self) -> f32 {
20        let total = self.taken + self.skipped;
21        if total == 0 {
22            return 0.0;
23        }
24        (self.skipped as f32 / total as f32).clamp(0.0, 1.0)
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn break_stats_intensity() {
34        let mut s = BreakStats::default();
35        assert_eq!(s.intensity(), 0.0);
36        s.taken = 4;
37        s.skipped = 1;
38        let i = s.intensity();
39        assert!((i - 0.2).abs() < 0.001);
40        s.skipped = 10;
41        s.taken = 0;
42        assert_eq!(s.intensity(), 1.0);
43    }
44}