use std::sync::{Arc, Mutex};
#[cfg(test)]
mod tests;
pub type Shared<T> = Arc<Mutex<T>>;
pub trait IntoShared<T> {
fn into_shared(self) -> Shared<T>;
}
impl<T> IntoShared<T> for T {
fn into_shared(self) -> Shared<T> {
Arc::new(Mutex::new(self))
}
}
pub trait WithSharedInner<T> {
fn with_inner<F, R>(&self, func: F) -> Option<R>
where
F: FnOnce(&mut T) -> R;
fn try_with_inner<F, R>(&self, func: F) -> Option<R>
where
F: FnOnce(&mut T) -> R;
}
impl<T> WithSharedInner<T> for Shared<T> {
fn with_inner<F, R>(&self, func: F) -> Option<R>
where
F: FnOnce(&mut T) -> R,
{
self.lock().ok().map(|mut guard| func(&mut *guard))
}
fn try_with_inner<F, R>(&self, func: F) -> Option<R>
where
F: FnOnce(&mut T) -> R,
{
self.try_lock().ok().map(|mut guard| func(&mut *guard))
}
}