use std::time::Duration;
use crate::{
cell::{Cell, CellImmutable, CellMutable},
platform,
signal::Signal,
traits::CellValue,
};
#[track_caller]
pub fn from_iter_with_delay<T, I>(iter: I, delay: Duration) -> Option<Cell<T, CellImmutable>>
where
T: CellValue,
I: IntoIterator<Item = T>,
I::IntoIter: Send + 'static,
{
let mut iter = iter.into_iter();
let first = iter.next()?;
let cell = Cell::<T, CellMutable>::new(first);
let weak = cell.downgrade();
platform::spawn_interval(delay, false, move |_count| match iter.next() {
Some(value) => {
let Some(c) = weak.upgrade() else {
return false;
};
c.notify(Signal::value(value));
true
}
None => {
if let Some(c) = weak.upgrade() {
c.notify(Signal::Complete);
}
false
}
});
Some(cell.lock())
}