use std::time::Duration;
use sycamore_reactive::{create_signal, use_current_scope};
use tokio::time::sleep;
#[inline]
#[track_caller]
pub fn create_timeout(fun: impl FnOnce() + 'static, duration: Duration) {
let trigger = create_signal(());
let scope = use_current_scope();
any_spawner::Executor::spawn_local(async move {
sleep(duration).await;
if trigger.is_alive() {
scope.run_in(fun)
}
});
}
#[inline]
#[track_caller]
pub fn create_interval(mut fun: impl FnMut() + 'static, duration: Duration) {
let trigger = create_signal(());
let scope = use_current_scope();
any_spawner::Executor::spawn_local(async move {
loop {
sleep(duration).await;
if trigger.is_alive() {
scope.run_in(&mut fun)
} else {
return;
}
}
});
}