use std::sync::Arc; use parking_lot::Mutex; use tokio::sync::Notify; #[derive(Clone, Debug, Default)] pub struct LastValue { inner: Arc<(Notify, Mutex>)>, } impl LastValue { pub fn set(&self, data: T) { *self.inner.1.lock() = Some(data); self.inner.0.notify_waiters(); } pub async fn get(&self) -> T { loop { let notified = self.inner.0.notified(); if let Some(data) = self.inner.1.lock().take() { return data; } notified.await; } } }