module Data.Cache.LRU.IO
( AtomicLRU
, newAtomicLRU
, fromList
, toList
, maxSize
, insert
, lookup
, delete
, size
)
where
import Prelude hiding ( lookup )
import Control.Applicative ( (<$>) )
import Control.Concurrent.MVar
( MVar
, newMVar
, readMVar
, modifyMVar
, modifyMVar_
)
import Data.Cache.LRU ( LRU )
import qualified Data.Cache.LRU as LRU
newtype AtomicLRU key val = C (MVar (LRU key val))
newAtomicLRU :: Ord key => Int
-> IO (AtomicLRU key val)
newAtomicLRU = fmap C . newMVar . LRU.newLRU
fromList :: Ord key => Int
-> [(key, val)] -> IO (AtomicLRU key val)
fromList s l = fmap C . newMVar $ LRU.fromList s l
toList :: Ord key => AtomicLRU key val -> IO [(key, val)]
toList (C mvar) = LRU.toList <$> readMVar mvar
maxSize :: AtomicLRU key val -> IO Int
maxSize (C mvar) = LRU.maxSize <$> readMVar mvar
insert :: Ord key => key -> val -> AtomicLRU key val -> IO ()
insert key val (C mvar) = modifyMVar_ mvar $ return . LRU.insert key val
lookup :: Ord key => key -> AtomicLRU key val -> IO (Maybe val)
lookup key (C mvar) = modifyMVar mvar $ return . LRU.lookup key
delete :: (Ord key) => key -> AtomicLRU key val -> IO Bool
delete key (C mvar) = modifyMVar mvar $ return . LRU.delete key
size :: AtomicLRU key val -> IO Int
size (C mvar) = LRU.size <$> readMVar mvar