1use crate::Control;
5use crate::poll::PollEvents;
6use std::any::Any;
7use std::sync::Arc;
8use std::sync::atomic::{AtomicU64, Ordering};
9use std::time::{Duration, SystemTime};
10
11pub struct PollTick {
13 rate: Arc<AtomicU64>,
14 next: SystemTime,
15}
16
17impl PollTick {
18 pub fn new(start_lag: u64, rate: u64) -> Self {
27 Self::new_config(start_lag, rate).0
28 }
29
30 pub fn new_config(start_lag: u64, rate: u64) -> (Self, Arc<AtomicU64>) {
39 let tick = Self {
40 rate: Arc::new(AtomicU64::new(rate)),
41 next: SystemTime::now() + Duration::from_millis(start_lag),
42 };
43 let tick_cfg = tick.rate.clone();
44 (tick, tick_cfg)
45 }
46}
47
48impl<Event, Error> PollEvents<Event, Error> for PollTick
49where
50 Event: 'static,
51 Error: 'static,
52{
53 fn as_any(&self) -> &dyn Any {
54 self
55 }
56
57 fn poll(&mut self) -> Result<bool, Error> {
58 Ok(self.next <= SystemTime::now())
59 }
60
61 fn read(&mut self) -> Result<Control<Event>, Error> {
62 if self.next <= SystemTime::now() {
63 let rate = self.rate.load(Ordering::Acquire);
64 self.next += Duration::from_millis(rate);
65 Ok(Control::Changed)
66 } else {
67 Ok(Control::Continue)
68 }
69 }
70}