use std::error::Error;
use std::sync::{RwLock, RwLockReadGuard};
pub struct SharedData<T> {
inner: RwLock<T>,
}
impl<T> SharedData<T> {
pub fn new(inner: T) -> Self {
Self {
inner: RwLock::new(inner),
}
}
pub fn read(&'_ self) -> RwLockReadGuard<'_, T> {
match self.inner.read() {
Ok(guard) => guard,
Err(error) => error.into_inner(),
}
}
pub fn read_fn<F, R>(&self, f: F) -> Result<R, Box<dyn Error>>
where
F: FnOnce(&T) -> Result<R, Box<dyn Error>>,
{
let guard = match self.inner.read() {
Ok(guard) => guard,
Err(error) => error.into_inner(),
};
f(&*guard)
}
pub fn write_fn<F, R>(&self, f: F) -> Result<R, Box<dyn Error>>
where
F: FnOnce(&mut T) -> Result<R, Box<dyn Error>>,
{
let mut guard = self.inner.write().expect("Failed to acquire write lock");
f(&mut guard)
}
pub fn write_fn_unchecked<F>(&self, f: F)
where
F: FnOnce(&mut T) -> (),
{
let mut guard = self.inner.write().expect("Failed to acquire write lock");
f(&mut guard)
}
}