pub type Time = u64;
pub struct TimeSource {
next: u64,
}
impl TimeSource {
pub fn from_last_time(last_time: Option<Time>) -> Self {
let last = last_time.unwrap_or(0);
Self {
next: last.saturating_add(1),
}
}
pub fn next_time(&mut self) -> Time {
let t = self.next;
self.next = self.next.saturating_add(1);
t
}
pub fn exhausted(&self) -> bool {
self.next >= Time::MAX - 1
}
pub fn peek(&self) -> Time {
self.next
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty_log_starts_at_1() {
let mut ts = TimeSource::from_last_time(None);
assert_eq!(ts.next_time(), 1);
assert_eq!(ts.next_time(), 2);
}
#[test]
fn test_restore_from_last_time() {
let mut ts = TimeSource::from_last_time(Some(10));
assert_eq!(ts.next_time(), 11);
assert_eq!(ts.next_time(), 12);
}
#[test]
fn test_increments_by_one() {
let mut ts = TimeSource::from_last_time(Some(5));
let t1 = ts.next_time();
let t2 = ts.next_time();
assert_eq!(t2 - t1, 1);
}
}