1use std::{pin::Pin, time::Duration};
2
3use futures::task::{Context, Poll};
4use wasm_timer::{Delay, Instant};
5
6#[derive(Debug)]
7pub struct PeriodicJob {
8 pub interval: Duration,
9 pub inner: Delay,
10}
11
12impl PeriodicJob {
13 pub fn new(interval: Duration) -> Self {
14 Self {
15 interval,
16 inner: Delay::new(interval),
17 }
18 }
19
20 pub fn poll_now(&mut self, cx: &mut Context<'_>) -> Poll<()> {
21 if let Poll::Ready(Ok(_)) = Delay::poll(Pin::new(&mut self.inner), cx) {
22 let deadline = Instant::now() + self.interval;
23 self.inner = Delay::new_at(deadline);
24 Poll::Ready(())
25 } else {
26 Poll::Pending
27 }
28 }
29
30 pub fn poll(&mut self, cx: &mut Context<'_>, now: Instant) -> Poll<()> {
31 if let Poll::Ready(Ok(_)) = Delay::poll(Pin::new(&mut self.inner), cx) {
32 let deadline = now + self.interval;
33 self.inner = Delay::new_at(deadline);
34 Poll::Ready(())
35 } else {
36 Poll::Pending
37 }
38 }
39}