1use std::{
2 cmp::{Eq, PartialEq},
3 fmt::Debug,
4 sync::{Arc, RwLock},
5};
6
7#[derive(Clone, Debug)]
8pub struct Shared<T>(Arc<RwLock<T>>)
9where
10 T: Clone + Debug + PartialEq + Eq;
11
12impl<T> PartialEq for Shared<T>
13where
14 T: Clone + Debug + PartialEq + Eq,
15{
16 fn eq(&self, other: &Self) -> bool { *self.read() == *other.read() }
17}
18
19impl<T> Eq for Shared<T> where T: Clone + Debug + PartialEq + Eq {}
20
21impl<T> Shared<T>
22where
23 T: Clone + Debug + PartialEq + Eq,
24{
25 pub fn new(value: T) -> Self { Shared(Arc::new(RwLock::new(value))) }
26
27 pub fn read(&self) -> std::sync::RwLockReadGuard<'_, T> {
28 self.0.read().unwrap()
29 }
30
31 pub fn write(&self) -> std::sync::RwLockWriteGuard<'_, T> {
32 self.0.write().unwrap()
33 }
34}