use std::time::{Duration, Instant};
pub fn time_it<F, T>(f: F) -> (T, Duration)
where
F: FnOnce() -> T,
{
let start = Instant::now();
let result = f();
(result, start.elapsed())
}
#[must_use]
pub const fn elapsed_millis(start: u64, end: u64) -> u64 {
end.saturating_sub(start)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_time_it() {
let (res, elapsed) = time_it(|| 42);
assert_eq!(res, 42);
assert!(elapsed <= Duration::from_secs(1));
}
#[test]
fn elapsed_millis_saturates() {
assert_eq!(elapsed_millis(10, 25), 15);
assert_eq!(elapsed_millis(25, 10), 0);
}
}