canic_core/interface/ic/
timer.rs1use 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
9pub 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}