use {crate::worker::MappedWorker, async_channel::Receiver};
pub type Wal<T1> = std::sync::Arc<parking_lot::Mutex<std::option::Option<T1>>>;
pub async fn dispatch<E1: Clone, W1>(wal: Wal<E1>, receiver: Receiver<E1>, worker: W1)
where
W1: MappedWorker<E1>,
{
let maybe = { wal.lock().clone() };
if let Some(event) = maybe {
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 {
(update(event.clone()), worker.execute(event).await);
wal.lock().take();
}
}