use std::time::{Duration, Instant};
use crate::timer::fastsleep_until;
const QUANTUM: u32 = 1;
pub struct Pacer {
next_pace_time: Instant,
interval: Duration,
counter: u32,
}
impl Pacer {
pub fn new(interval: Duration) -> Self {
Self {
next_pace_time: Instant::now(),
interval,
counter: 0,
}
}
pub async fn wait_next(&mut self) {
self.counter += 1;
if self.counter >= QUANTUM {
self.counter = 0;
fastsleep_until(self.next_pace_time).await;
self.next_pace_time = Instant::now().max(self.next_pace_time + self.interval * QUANTUM);
} else {
smol::future::yield_now().await;
}
}
pub fn set_interval(&mut self, interval: Duration) {
self.interval = interval
}
}