use std::{thread, time::Duration};
use crate::{
cell::{Cell, CellImmutable, CellMutable},
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();
thread::spawn(move || {
for value in iter {
thread::sleep(delay);
let Some(c) = weak.upgrade() else { break };
c.notify(Signal::value(value));
}
if let Some(c) = weak.upgrade() {
c.notify(Signal::Complete);
}
});
Some(cell.lock())
}