use {crate::worker::MappedWorker, async_channel::Receiver}; pub type Wal = std::sync::Arc>>; pub async fn dispatch(wal: Wal, receiver: Receiver, worker: W1) where W1: MappedWorker, { let maybe = { wal.lock().clone() }; if let Some(event) = maybe { // Try to handle last not properly handled value worker.execute(event.clone()).await; wal.lock().take(); } let update = |event: E1| { let mut wal = wal.lock(); *wal = Some(event); }; while let Ok(event) = receiver.recv().await { // Keep event in state to ensure cancel safety (update(event.clone()), worker.execute(event).await); wal.lock().take(); } }