use crate::metrics::types::SystemMetrics;
pub struct FluxionCalculator {
last_metrics: Option<SystemMetrics>,
}
impl FluxionCalculator {
pub fn new() -> Self {
Self { last_metrics: None }
}
pub fn calculate_velocity(&mut self, current: &SystemMetrics) -> Option<f64> {
let last = match &self.last_metrics {
Some(m) => m,
None => {
self.last_metrics = Some(*current);
return None;
}
};
let dt = (current.timestamp - last.timestamp) as f64;
if dt <= 0.0 { return None; }
let velocity = (current.mem_free_mb - last.mem_free_mb) / dt;
self.last_metrics = Some(*current);
Some(velocity)
}
pub fn time_to_exhaustion(current_mb: f64, velocity_mb_per_sec: f64, min_mb: f64) -> Option<f64> {
if velocity_mb_per_sec >= 0.0 { return None; }
let remaining = current_mb - min_mb;
if remaining <= 0.0 { return Some(0.0); }
Some(remaining / velocity_mb_per_sec.abs())
}
}