use crate::{aggregation::types::Epoch, Monitor as M}; use futures::channel::mpsc; use std::sync::{Arc, Mutex}; struct Inner { epoch: Epoch, subscribers: Vec>, } impl Inner { fn new(epoch: Epoch) -> Self { Self { epoch, subscribers: Vec::new(), } } fn update(&mut self, epoch: Epoch) { self.epoch = epoch; for subscriber in &mut self.subscribers { subscriber.try_send(epoch).ok(); } } fn subscribe(&mut self) -> (Epoch, mpsc::Receiver) { let (tx, rx) = mpsc::channel(1); self.subscribers.push(tx); (self.epoch, rx) } } #[derive(Clone)] pub struct Monitor { inner: Arc>, } impl Monitor { pub fn new(epoch: Epoch) -> Self { let inner = Inner::new(epoch); Self { inner: Arc::new(Mutex::new(inner)), } } pub fn update(&self, epoch: Epoch) { self.inner.lock().unwrap().update(epoch); } } impl M for Monitor { type Index = Epoch; async fn subscribe(&mut self) -> (Self::Index, mpsc::Receiver) { self.inner.lock().unwrap().subscribe() } }