dfinity-radix-tree-0.6.0: src/DFINITY/RadixTree/Lock.hs
{-# OPTIONS -Wall #-}
module DFINITY.RadixTree.Lock
( withReadLock
, withWriteLock
)
where
import Control.Concurrent.ReadWriteLock
import Control.Monad.Trans.Resource
withLock
:: MonadResource m
=> (RWLock -> IO ())
-> (RWLock -> IO ())
-> RWLock
-> m a
-> m a
withLock f g lock action = do
key <- fst <$> allocate acquireLock releaseLock
result <- action
release key
pure result
where
acquireLock = f lock
releaseLock = const $ g lock
withReadLock :: MonadResource m => RWLock -> m a -> m a
withReadLock = withLock acquireRead releaseRead
withWriteLock :: MonadResource m => RWLock -> m a -> m a
withWriteLock = withLock acquireWrite releaseWrite