canic_core/interface/ic/
timer.rs

1use crate::cdk::timers::{
2    clear_timer as cdk_clear_timer, set_timer as cdk_set_timer,
3    set_timer_interval as cdk_set_timer_interval,
4};
5
6pub use crate::cdk::timers::TimerId;
7use std::{cell::RefCell, future::Future, rc::Rc, time::Duration};
8
9///
10/// Timer
11///
12
13pub struct Timer;
14
15impl Timer {
16    pub fn set(delay: Duration, task: impl Future<Output = ()> + 'static) -> TimerId {
17        cdk_set_timer(delay, task)
18    }
19
20    pub fn set_interval<F, Fut>(interval: Duration, task: F) -> TimerId
21    where
22        F: FnMut() -> Fut + 'static,
23        Fut: Future<Output = ()> + 'static,
24    {
25        let task = Rc::new(RefCell::new(task));
26
27        cdk_set_timer_interval(interval, move || {
28            let task = Rc::clone(&task);
29            async move {
30                let fut = { (task.borrow_mut())() };
31                fut.await;
32            }
33        })
34    }
35
36    pub fn clear(id: TimerId) {
37        cdk_clear_timer(id);
38    }
39}