use crate::{analysis, timing::Snapshot, TimeSpan};
pub fn calculate(
timer: &Snapshot<'_>,
segment_index: usize,
comparison: &str,
live: bool,
) -> (Option<TimeSpan>, bool) {
let segments = timer.run().segments();
let method = timer.current_timing_method();
let mut prev_time = TimeSpan::zero();
let segment = timer.run().segment(segment_index);
catch! {
let mut best_segments = segment.best_segment_time()[method]?;
for segment in segments[..segment_index].iter().rev() {
if let Some(split_time) = segment.comparison(comparison)[method] {
prev_time = split_time;
break;
} else if let Some(best_segment) = segment.best_segment_time()[method] {
best_segments += best_segment;
}
}
let mut time = segment.comparison(comparison)[method]? - best_segments - prev_time;
let mut updates_frequently = false;
if live && timer.current_split_index() == Some(segment_index) {
if let Some(segment_delta) = analysis::live_segment_delta(
timer,
segment_index,
comparison,
method,
) {
let segment_delta = TimeSpan::zero() - segment_delta;
if segment_delta < time {
time = segment_delta;
updates_frequently = timer.current_phase().is_running();
}
}
}
if time < TimeSpan::zero() {
(Some(TimeSpan::zero()), false)
} else {
(Some(time), updates_frequently)
}
}
.unwrap_or_default()
}
pub fn calculate_total(
timer: &Snapshot<'_>,
segment_index: usize,
comparison: &str,
) -> (TimeSpan, bool) {
let mut total = TimeSpan::zero();
let mut updates_frequently = false;
for index in segment_index..timer.run().len() {
let (time_save, changing) = calculate(timer, index, comparison, true);
updates_frequently |= changing;
if let Some(time_save) = time_save {
total += time_save;
}
}
(total, updates_frequently)
}