//! A timed loop implementation use async_std::{future::Future, task}; use chrono::{DateTime, Utc}; use std::{ sync::{ atomic::{AtomicBool, Ordering}, Arc, }, time::Duration, }; /// Number of ticks per second const TICKS: u64 = 100; const TICK_TIME: Duration = Duration::from_millis(1000 / TICKS); /// Run a timed loop until you no longer want to pub fn block_loop(run: Arc, f: F) where F: Future + Send + Copy + 'static, { while run.load(Ordering::Relaxed) { let t1 = Utc::now(); task::block_on(f); let t2 = Utc::now(); let t3 = (t2 - t1).to_std().unwrap(); task::block_on(async { task::sleep(TICK_TIME - t3) }); } } /// Run a detached timed loop until you no longer want to pub fn spawn_loop(run: Arc, f: F) where F: Future + Send + Copy + 'static, { task::spawn(async move { block_loop(run, f) }); }