module Database.Perdure.Cache (
Cache(..),
Entry(..),
empty,
lookup,
insert,
delete
) where
import Prelude ()
import Cgm.Prelude hiding (empty, lookup, insert, delete)
import qualified Database.Perdure.Cache1 as Cache
import Control.Monad.Random
import Data.Dynamic
import Cgm.Data.Len
import Data.Word
import Database.Perdure.Count(Address)
data Entry = Entry {entryValue :: Dynamic, entrySize :: Len Word64 Word64}
instance Cache.Entry Entry where entrySize (Entry _ s) = fromIntegral s
newtype Cache = Cache (Cache.Cache Address Entry)
empty :: Integer -> Cache
empty = Cache . Cache.empty . getLen . (id :: Id (Len Word64 Integer)) . coarsenLen . (id :: Id (Len Word8 Integer)) . unsafeLen
lookup :: Address -> Cache -> Maybe (Entry, Cache)
lookup k (Cache c) = fmap (second Cache) $ Cache.lookup k c
insert :: RandomGen g => Address -> Entry -> Cache -> Rand g Cache
insert k v (Cache c) = fmap Cache $ Cache.insert k v c
delete :: Address -> Cache -> Cache
delete k (Cache c) = Cache $ Cache.delete k c