use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GapInfo {
pub index: usize,
pub gap_ns: u64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MonotonicityResult {
StrictlyMonotonic,
Violation { index: usize, prev: u64, curr: u64 },
}
impl MonotonicityResult {
pub fn is_ok(&self) -> bool {
matches!(self, Self::StrictlyMonotonic)
}
}
pub fn check_monotonicity(timestamps_ns: &[u64]) -> MonotonicityResult {
for i in 1..timestamps_ns.len() {
if timestamps_ns[i] <= timestamps_ns[i - 1] {
return MonotonicityResult::Violation {
index: i,
prev: timestamps_ns[i - 1],
curr: timestamps_ns[i],
};
}
}
MonotonicityResult::StrictlyMonotonic
}
pub fn detect_gaps(timestamps_ns: &[u64], threshold_ns: u64) -> Vec<GapInfo> {
let mut gaps = Vec::new();
for i in 1..timestamps_ns.len() {
let gap = timestamps_ns[i].saturating_sub(timestamps_ns[i - 1]);
if gap > threshold_ns {
gaps.push(GapInfo {
index: i - 1,
gap_ns: gap,
});
}
}
gaps
}