use std::future::Future;
use std::time::Duration;
use tokio::task::JoinHandle;
use tokio::time::MissedTickBehavior;
pub(super) fn spawn_interval_task<F, Fut>(
interval: Duration,
run_on_start: bool,
task: F,
) -> JoinHandle<()>
where
F: Fn() -> Fut + Send + Sync + 'static,
Fut: Future<Output = ()> + Send + 'static,
{
tokio::spawn(async move {
let mut ticker = tokio::time::interval(interval);
ticker.set_missed_tick_behavior(MissedTickBehavior::Delay);
if run_on_start {
task().await;
}
ticker.tick().await;
loop {
ticker.tick().await;
task().await;
}
})
}