extern crate chrono;
use chrono::prelude::*;
use chrono::{DateTime, Duration, Local, Utc};
use std::thread;
pub struct Metronome {
interval: Duration,
pub wake_time: DateTime<Utc>,
}
impl Metronome {
pub fn new(interval: Duration) -> Metronome {
Metronome {
interval: interval,
wake_time: Utc::now(),
}
}
pub fn sleep(&mut self) {
self.wake_time = self.wake_time + self.interval;
let delta_s = self.wake_time.timestamp() - Utc::now().timestamp();
let delta_ms = self.wake_time.timestamp_subsec_millis() as i32 - Utc::now().timestamp_subsec_millis() as i32;
let duration = Duration::seconds(delta_s) + Duration::milliseconds(delta_ms as i64);
if duration > Duration::zero() {
duration.to_std().and_then(|d| Ok(thread::sleep(d)));
}
}
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}