use std::time::{Instant, SystemTime, UNIX_EPOCH};
use crate::alphabet::FORWARD_JUMP_NS;
pub(crate) type UnixNanoClock = Box<dyn FnMut() -> u128 + Send>;
pub(crate) fn create_hybrid_clock() -> UnixNanoClock {
let base_wall_ns = system_time_ns();
let base_instant = Instant::now();
Box::new(move || {
let wall_ns = system_time_ns();
let mono_ns = base_wall_ns.saturating_add(base_instant.elapsed().as_nanos());
if wall_ns > mono_ns + FORWARD_JUMP_NS {
wall_ns
} else {
mono_ns
}
})
}
fn system_time_ns() -> u128 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or(0, |duration| duration.as_nanos())
}