fett 0.1.0

This is the way to do concurrent memoizing maps.
Documentation
#[cfg(not(loom))]
pub(crate) use parking_lot::{RwLockReadGuard, RwLockWriteGuard};

#[cfg(loom)]
pub(crate) use loom::sync::{RwLockReadGuard, RwLockWriteGuard};

#[derive(Debug)]
pub(crate) struct RwLock<T>(
    #[cfg(not(loom))] parking_lot::RwLock<T>,
    #[cfg(loom)] loom::sync::RwLock<T>,
);

impl<T> RwLock<T> {
    pub(crate) fn new(value: T) -> Self {
        #[cfg(not(loom))]
        let lock = parking_lot::RwLock::new(value);
        #[cfg(loom)]
        let lock = loom::sync::RwLock::new(value);

        Self(lock)
    }

    pub(crate) fn read(&self) -> RwLockReadGuard<'_, T> {
        let guard = self.0.read();

        #[cfg(loom)]
        let guard = guard.unwrap();

        guard
    }

    pub(crate) fn write(&self) -> RwLockWriteGuard<'_, T> {
        let guard = self.0.write();

        #[cfg(loom)]
        let guard = guard.unwrap();

        guard
    }

    #[allow(clippy::let_and_return)]
    pub(crate) fn into_inner(self) -> T {
        let inner = self.0.into_inner();

        #[cfg(loom)]
        let inner = inner.unwrap();

        inner
    }
}