Skip to content

Instantly share code, notes, and snippets.

@brinchj
Created January 12, 2012 14:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brinchj/8dbff672a14533c70aa2 to your computer and use it in GitHub Desktop.
Save brinchj/8dbff672a14533c70aa2 to your computer and use it in GitHub Desktop.
data Param m k v = Param {
cacheSize :: Int
, table :: H.HashTableSTM k (Ref v)
, toIO :: forall a. m a -> IO a
, lock :: TVar Int
}
newtype CacheSTM m k v a = CacheSTM { runCacheSTM :: ReaderT (Param m k v) STM a }
deriving (Monad, MonadReader (Param m k v), Functor)
evalCacheSTM :: Param m k v -> CacheSTM m k v a -> IO a
evalCacheSTM p m =
atomically $ runReaderT (runCacheSTM m) p
sizedParam :: Int -> (forall a. m a -> IO a) -> IO (Param m k v)
sizedParam s f = do
ht <- H.newSized s
mv <- atomically $ newTVar 0
return $ Param s ht f mv
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment