use std::{future::Future, time::Duration};
use discro::Publisher;
use crate::{BlinkingLedOutput, BlinkingLedTicker};
#[expect(clippy::manual_async_fn)] pub fn blinking_led_task(
period: Duration,
publisher: Publisher<BlinkingLedOutput>,
) -> impl Future<Output = ()> + Send + 'static {
async move {
let mut ticker = BlinkingLedTicker::default();
let mut interval = tokio::time::interval(period);
interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Delay);
loop {
interval.tick().await;
let output = ticker.tick();
publisher.write(output);
}
}
}
#[cfg(feature = "blinking-led-task-tokio-rt")]
#[must_use]
pub fn spawn_blinking_led_task(period: Duration) -> discro::Subscriber<BlinkingLedOutput> {
let publisher = Publisher::new(BlinkingLedOutput::ON);
let subscriber = publisher.subscribe_changed();
let task = blinking_led_task(period, publisher);
tokio::spawn(task);
subscriber
}