use crate::Result;
use std::sync::{mpsc::Sender, Arc, Mutex};
use std::time::Duration;
use std::{thread, thread::JoinHandle};
#[derive(Debug, Default)]
pub struct Timer {
txs: Arc<Mutex<Vec<Sender<u64>>>>,
pub handle: Option<JoinHandle<Result<()>>>,
}
impl Timer {
pub fn initialize(self) -> Self {
let txs = Arc::clone(&self.txs);
let handle = Some(thread::spawn(move || {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)?
.as_secs();
let rem = 10u64.checked_sub(now.checked_rem(10).unwrap()).unwrap();
thread::sleep(Duration::from_secs(rem));
loop {
if txs.lock()?.len() == 0 {
return Ok(());
}
let current = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)?
.as_secs();
txs.lock()?.iter().for_each(|tx| {
tx.send(current).unwrap();
});
thread::sleep(Duration::from_millis(10000));
}
}));
Self { handle, ..self }
}
pub fn attach_listener(&mut self, tx: Sender<u64>) -> Result<()> {
let txs = Arc::clone(&self.txs);
txs.lock()?.push(tx);
Ok(())
}
pub fn drop_listeners(&mut self) -> Result<()> {
let txs = Arc::clone(&self.txs);
txs.lock()?.clear();
Ok(())
}
}