//! stopwatch is a simple CLI stopwatch use crossbeam_channel::tick; use std::io::{stdout, Write}; use std::time::{Duration, Instant}; #[macro_use] extern crate crossbeam_channel; fn main() { let out = stdout(); let mut out = out.lock(); // 30 fps should be enough let step_duration = Duration::from_millis(1000 / 30); let start = Instant::now(); let ticker = tick(step_duration); loop { select! { recv(ticker) -> now => { let elapsed = now.unwrap().duration_since(start); let secs = elapsed.as_secs(); let millis = elapsed.subsec_millis(); write!(out, "\r[2K").unwrap(); write!(out, "{:02}:{:02}:{:03}", secs/60, secs % 60, millis).unwrap(); out.flush().unwrap(); } } } }