например, есть a = vec![1, 2, 3, 4, 5], а нужно получить итератор который для каждого a[N] будет генерировать последовательность от 0 до a[N],
то есть выдаст: 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5?
А как тоже самое сделать для потока?
Я сделал так:
pub fn poll(self, cnc: Rc<RefCell<Controller>>) -> impl Stream<Item = Event, Error = ()> {
let mut irq = self.irq;
let (mut irq_tx, irq_rx) = channel(1);
spawn(move || {
while let Ok(events) = irq.wait(None) {
if let Err(err) = irq_tx.try_send(events.len()) {
error!("{}", err);
break;
}
}
info!("Irq shutdown");
});
irq_rx
.and_then(move |_| cnc.borrow_mut().clear_events().map_err(|_| ()))
.map(|state| iter_ok(state.iter()))
.flatten()
}
и поток заканчивается после перечисления первого события.
Ручные poll’ы - это основная причина застрелить мейнтейнеров токио, потому что благодаря их трюкачеству в tokio/examples эта плесень расползлась по всему коммьюнити.