use tokio::sync::watch;
#[derive(Clone, Debug)]
pub struct WatchReceiver<T> {
receiver: watch::Receiver<T>,
}
impl<T> WatchReceiver<T> {
pub fn new(receiver: watch::Receiver<T>) -> Self {
Self { receiver }
}
}
impl<T> WatchReceiver<T>
where
T: Clone,
{
pub fn with_watch_data<U, F>(&self, f: F) -> U
where
F: FnOnce(T) -> U,
{
let cloned_data = self.cloned_watch_data();
f(cloned_data)
}
pub fn borrow_mapped<U: 'static, F>(&self, f: F) -> U
where
F: FnOnce(watch::Ref<T>) -> U,
{
f(self.receiver.borrow())
}
pub fn cloned_watch_data(&self) -> T {
self.receiver.borrow().clone()
}
pub async fn changed(&mut self) -> Result<(), watch::error::RecvError> {
self.receiver.changed().await
}
pub fn has_changed(&self) -> Result<bool, watch::error::RecvError> {
self.receiver.has_changed()
}
pub fn mark_as_seen(&mut self) {
self.receiver.borrow_and_update();
}
pub fn mark_changed(&mut self) {
self.receiver.mark_changed();
}
}