1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
use std::sync::{Arc, RwLock, RwLockReadGuard, TryLockResult};

pub struct ReadOnlyLock<T> {
    value: Arc<RwLock<T>>,
}

impl<T> ReadOnlyLock<T> {
    pub fn from(value: Arc<RwLock<T>>) -> Self {
        Self { value }
    }

    pub fn try_read(&self) -> TryLockResult<RwLockReadGuard<T>> {
        self.value.try_read()
    }
}

impl<T> Clone for ReadOnlyLock<T> {
    fn clone(&self) -> Self {
        Self::from(Arc::clone(&self.value))
    }
}