use std::sync::{Arc, Mutex};
use metrique_core::CloseValue;
use crate::traits::{AggregateSink, RootSink};
pub struct MutexSink<Inner> {
inner: Arc<Mutex<Inner>>,
}
impl<Inner> Clone for MutexSink<Inner> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
impl<Inner: Default> Default for MutexSink<Inner> {
fn default() -> Self {
Self::new(Inner::default())
}
}
impl<Inner> MutexSink<Inner> {
pub fn new(inner: Inner) -> Self {
Self {
inner: Arc::new(Mutex::new(inner)),
}
}
}
impl<T, Inner> RootSink<T> for MutexSink<Inner>
where
Inner: AggregateSink<T>,
{
fn merge(&self, entry: T) {
self.inner.lock().unwrap().merge(entry);
}
}
impl<Inner> CloseValue for MutexSink<Inner>
where
Inner: CloseValue + Default,
{
type Closed = Inner::Closed;
fn close(self) -> Self::Closed {
let mut guard = self.inner.lock().unwrap();
std::mem::take(&mut *guard).close()
}
}