module Data.TStorage( TMap,
HasKey(..),
newTMapIO,
add,
tryComplete,
complete,
remove,
removeByKey,
apply,
purgeTMap,
purgeTMapIO,
)
where
import Control.Concurrent.AdvSTM
import Control.Exception
import Prelude hiding (lookup,catch)
import qualified Data.TMap.Backend as B
import qualified Data.CacheStructure as C
import qualified Data.Edison.Assoc as M
import Data.TMap
class HasKey a k | a -> k where
key :: a -> k
add :: (M.FiniteMapX map k, MonadAdvSTM stm, Ord k, B.Backend k a b, C.CacheStructure c k
, HasKey a k)
=> a -> TMap map k a b c -> stm ()
add a = insert (key a) a
tryComplete :: (M.FiniteMapX map k, MonadAdvSTM stm, Ord k,B.Backend k a b, C.CacheStructure c k
, HasKey a k)
=> a -> TMap map k a b c -> stm (Maybe a)
tryComplete a = lookup (key a)
complete :: (M.FiniteMapX map k, MonadAdvSTM stm, Ord k, B.Backend k a b, C.CacheStructure c k
, HasKey a k)
=> a -> TMap map k a b c -> stm a
complete a tmap = do
mval <- tryComplete a tmap
case mval of
Just val -> return val
Nothing -> throw EntryNotFound
remove :: (M.FiniteMapX map k, MonadAdvSTM stm, Ord k, B.Backend k a b, C.CacheStructure c k
, HasKey a k)
=> a -> TMap map k a b c -> stm ()
remove a = delete (key a)
removeByKey :: (M.FiniteMapX map k, MonadAdvSTM stm, Ord k, B.Backend k a b, C.CacheStructure c k
, HasKey a k)
=> k -> TMap map k a b c -> stm ()
removeByKey = delete
apply :: (M.FiniteMapX map k, MonadAdvSTM stm, Ord k, B.Backend k a b, C.CacheStructure c k
, HasKey a k)
=> (a -> a) -> a -> TMap map k a b c -> stm a
apply f a tmap = do
adjust f (key a) tmap
complete a tmap