{-# LANGUAGE OverloadedStrings #-}
module Caching.ExpiringCacheMap.OrdECM (
newECMIO,
newECMForM,
consistentDuration,
lookupECM,
getValReqState,
invalidate,
invalidateCache,
keysCached,
keysNotExpired,
ECM,
CacheSettings(..)
) where
import qualified Control.Concurrent.MVar as MV
import qualified Data.Map.Strict as M
import qualified Data.List as L
import Caching.ExpiringCacheMap.Internal.Internal (updateUses, detECM, detNotExpired)
import Caching.ExpiringCacheMap.Types
import Caching.ExpiringCacheMap.Internal.Types
newECMIO :: Ord k => (Maybe s -> k -> IO (TimeUnits, (Maybe s, v))) -> (IO TimeUnits)
-> ECMIncr
-> CacheSettings
-> IO (ECM IO MV.MVar s M.Map k v)
newECMIO :: forall k s v.
Ord k =>
(Maybe s -> k -> IO (TimeUnits, (Maybe s, v)))
-> IO TimeUnits
-> ECMIncr
-> CacheSettings
-> IO (ECM IO MVar s Map k v)
newECMIO Maybe s -> k -> IO (TimeUnits, (Maybe s, v))
retr IO TimeUnits
gettime ECMIncr
timecheckmodulo CacheSettings
settings = do
(Maybe s -> k -> IO (TimeUnits, (Maybe s, v)))
-> IO TimeUnits
-> ECMIncr
-> CacheSettings
-> ECMNewState IO MVar s Map k v
-> ECMEnterState IO MVar s Map k v
-> ECMReadState IO MVar s Map k v
-> IO (ECM IO MVar s Map k v)
forall (m1 :: * -> *) (m2 :: * -> *) k s v (mv :: * -> *).
(Monad m1, Monad m2, Ord k) =>
(Maybe s -> k -> m1 (TimeUnits, (Maybe s, v)))
-> m1 TimeUnits
-> ECMIncr
-> CacheSettings
-> ECMNewState m2 mv s Map k v
-> ECMEnterState m1 mv s Map k v
-> ECMReadState m1 mv s Map k v
-> m2 (ECM m1 mv s Map k v)
newECMForM Maybe s -> k -> IO (TimeUnits, (Maybe s, v))
retr IO TimeUnits
gettime ECMIncr
timecheckmodulo CacheSettings
settings
ECMNewState IO MVar s Map k v
forall a. a -> IO (MVar a)
MV.newMVar ECMEnterState IO MVar s Map k v
forall a b. MVar a -> (a -> IO (a, b)) -> IO b
MV.modifyMVar ECMReadState IO MVar s Map k v
forall a. MVar a -> IO a
MV.readMVar
newECMForM :: (Monad m1, Monad m2) => Ord k => (Maybe s -> k -> m1 (TimeUnits, (Maybe s, v))) -> (m1 TimeUnits)
-> ECMIncr
-> CacheSettings
-> ECMNewState m2 mv s M.Map k v
-> ECMEnterState m1 mv s M.Map k v
-> ECMReadState m1 mv s M.Map k v
-> m2 (ECM m1 mv s M.Map k v)
newECMForM :: forall (m1 :: * -> *) (m2 :: * -> *) k s v (mv :: * -> *).
(Monad m1, Monad m2, Ord k) =>
(Maybe s -> k -> m1 (TimeUnits, (Maybe s, v)))
-> m1 TimeUnits
-> ECMIncr
-> CacheSettings
-> ECMNewState m2 mv s Map k v
-> ECMEnterState m1 mv s Map k v
-> ECMReadState m1 mv s Map k v
-> m2 (ECM m1 mv s Map k v)
newECMForM Maybe s -> k -> m1 (TimeUnits, (Maybe s, v))
retr m1 TimeUnits
gettime ECMIncr
timecheckmodulo (CacheWithLRUList TimeUnits
minimumkeep TimeUnits
removalsize TimeUnits
compactlistsize)
ECMNewState m2 mv s Map k v
newstate ECMEnterState m1 mv s Map k v
enterstate ECMReadState m1 mv s Map k v
readstate =
if ECMIncr
timecheckmodulo ECMIncr -> ECMIncr -> Bool
forall a. Ord a => a -> a -> Bool
<= ECMIncr
0
then [Char] -> m2 (ECM m1 mv s Map k v)
forall a. HasCallStack => [Char] -> a
error [Char]
"Modulo time check must be 1 or higher."
else do
mv (CacheState s Map k v)
m'maps <- ECMNewState m2 mv s Map k v
newstate ECMNewState m2 mv s Map k v -> ECMNewState m2 mv s Map k v
forall a b. (a -> b) -> a -> b
$ (Maybe s, Map k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), ECMIncr)
-> CacheState s Map k v
forall s (m :: * -> * -> *) k v.
(Maybe s, m k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), ECMIncr)
-> CacheState s m k v
CacheState ( Maybe s
forall a. Maybe a
Nothing, Map k (TimeUnits, TimeUnits, v)
forall k a. Map k a
M.empty, TimeUnits
0, ([], TimeUnits
0), ECMIncr
0 )
ECM m1 mv s Map k v -> m2 (ECM m1 mv s Map k v)
forall a. a -> m2 a
forall (m :: * -> *) a. Monad m => a -> m a
return (ECM m1 mv s Map k v -> m2 (ECM m1 mv s Map k v))
-> ECM m1 mv s Map k v -> m2 (ECM m1 mv s Map k v)
forall a b. (a -> b) -> a -> b
$ (mv (CacheState s Map k v),
Maybe s -> k -> m1 (TimeUnits, (Maybe s, v)), m1 TimeUnits,
TimeUnits, ECMIncr, TimeUnits, TimeUnits,
ECMEnterState m1 mv s Map k v, ECMReadState m1 mv s Map k v)
-> ECM m1 mv s Map k v
forall (a :: * -> *) (b :: * -> *) s (m :: * -> * -> *) k v.
(b (CacheState s m k v),
Maybe s -> k -> a (TimeUnits, (Maybe s, v)), a TimeUnits,
TimeUnits, ECMIncr, TimeUnits, TimeUnits,
ECMEnterState a b s m k v, ECMReadState a b s m k v)
-> ECM a b s m k v
ECM ( mv (CacheState s Map k v)
m'maps, Maybe s -> k -> m1 (TimeUnits, (Maybe s, v))
retr, m1 TimeUnits
gettime, TimeUnits
minimumkeep, ECMIncr
timecheckmodulo, TimeUnits
removalsize,
TimeUnits
compactlistsize, ECMEnterState m1 mv s Map k v
enterstate, ECMReadState m1 mv s Map k v
readstate )
lookupECM :: (Monad m, Ord k) => ECM m mv s M.Map k v -> k -> m v
lookupECM :: forall (m :: * -> *) k (mv :: * -> *) s v.
(Monad m, Ord k) =>
ECM m mv s Map k v -> k -> m v
lookupECM ECM m mv s Map k v
ecm k
id = do
ECMEnterState m mv s Map k v
enter mv (CacheState s Map k v)
m'maps ((CacheState s Map k v -> m (CacheState s Map k v, v)) -> m v)
-> (CacheState s Map k v -> m (CacheState s Map k v, v)) -> m v
forall a b. (a -> b) -> a -> b
$
\(CacheState (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
maps, TimeUnits
mapsize, ([(k, ECMIncr)], TimeUnits)
uses, ECMIncr
incr)) ->
let incr' :: ECMIncr
incr' = ECMIncr
incr ECMIncr -> ECMIncr -> ECMIncr
forall a. Num a => a -> a -> a
+ ECMIncr
1
in if ECMIncr
incr' ECMIncr -> ECMIncr -> Bool
forall a. Ord a => a -> a -> Bool
< ECMIncr
incr
then (Maybe s, Map k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), Integer)
-> ECMIncr -> m (CacheState s Map k v, v)
forall {e}.
(Maybe s, Map k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), e)
-> ECMIncr -> m (CacheState s Map k v, v)
lookupECM' (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
forall k a. Map k a
M.empty, TimeUnits
0, ([], TimeUnits
0), Integer
0) (ECMIncr
0ECMIncr -> ECMIncr -> ECMIncr
forall a. Num a => a -> a -> a
+ECMIncr
1)
else (Maybe s, Map k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), ECMIncr)
-> ECMIncr -> m (CacheState s Map k v, v)
forall {e}.
(Maybe s, Map k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), e)
-> ECMIncr -> m (CacheState s Map k v, v)
lookupECM' (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
maps, TimeUnits
mapsize, ([(k, ECMIncr)], TimeUnits)
uses, ECMIncr
incr) ECMIncr
incr'
where
ECM ( mv (CacheState s Map k v)
m'maps, Maybe s -> k -> m (TimeUnits, (Maybe s, v))
retr, m TimeUnits
gettime, TimeUnits
minimumkeep, ECMIncr
timecheckmodulo, TimeUnits
removalsize,
TimeUnits
compactlistsize, ECMEnterState m mv s Map k v
enter, ECMReadState m mv s Map k v
_ro ) = ECM m mv s Map k v
ecm
mnub :: [(k, a)] -> [(k, a)]
mnub = Map k a -> [(k, a)]
forall k a. Map k a -> [(k, a)]
M.toList (Map k a -> [(k, a)])
-> ([(k, a)] -> Map k a) -> [(k, a)] -> [(k, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(k, a)] -> Map k a
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(k, a)] -> Map k a)
-> ([(k, a)] -> [(k, a)]) -> [(k, a)] -> Map k a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(k, a)] -> [(k, a)]
forall a. [a] -> [a]
reverse
lookupECM' :: (Maybe s, Map k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), e)
-> ECMIncr -> m (CacheState s Map k v, v)
lookupECM' (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
maps, TimeUnits
mapsize, ([(k, ECMIncr)], TimeUnits)
uses, e
incr) ECMIncr
incr' = do
let uses' :: ([(k, ECMIncr)], TimeUnits)
uses' = ([(k, ECMIncr)], TimeUnits)
-> k
-> ECMIncr
-> TimeUnits
-> ([(k, ECMIncr)] -> [(k, ECMIncr)])
-> ([(k, ECMIncr)], TimeUnits)
forall k.
Eq k =>
([(k, ECMIncr)], TimeUnits)
-> k
-> ECMIncr
-> TimeUnits
-> ([(k, ECMIncr)] -> [(k, ECMIncr)])
-> ([(k, ECMIncr)], TimeUnits)
updateUses ([(k, ECMIncr)], TimeUnits)
uses k
id ECMIncr
incr' TimeUnits
compactlistsize [(k, ECMIncr)] -> [(k, ECMIncr)]
forall {a}. [(k, a)] -> [(k, a)]
mnub
((CacheState s Map k v, v)
ret, Bool
do_again) <- Maybe s
-> Map k (TimeUnits, TimeUnits, v)
-> TimeUnits
-> ([(k, ECMIncr)], TimeUnits)
-> ECMIncr
-> m ((CacheState s Map k v, v), Bool)
det Maybe s
retr_state Map k (TimeUnits, TimeUnits, v)
maps TimeUnits
mapsize ([(k, ECMIncr)], TimeUnits)
uses' ECMIncr
incr'
if Bool
do_again
then do let (CacheState (Maybe s
retr_state', Map k (TimeUnits, TimeUnits, v)
maps', TimeUnits
mapsize', ([(k, ECMIncr)], TimeUnits)
uses'', ECMIncr
incr''), v
_) = (CacheState s Map k v, v)
ret
uses''' :: ([(k, ECMIncr)], TimeUnits)
uses''' = ([(k, ECMIncr)], TimeUnits)
-> k
-> ECMIncr
-> TimeUnits
-> ([(k, ECMIncr)] -> [(k, ECMIncr)])
-> ([(k, ECMIncr)], TimeUnits)
forall k.
Eq k =>
([(k, ECMIncr)], TimeUnits)
-> k
-> ECMIncr
-> TimeUnits
-> ([(k, ECMIncr)] -> [(k, ECMIncr)])
-> ([(k, ECMIncr)], TimeUnits)
updateUses ([(k, ECMIncr)], TimeUnits)
uses'' k
id ECMIncr
incr'' TimeUnits
compactlistsize [(k, ECMIncr)] -> [(k, ECMIncr)]
forall {a}. [(k, a)] -> [(k, a)]
mnub
((CacheState s Map k v, v)
ret', Bool
_) <- Maybe s
-> Map k (TimeUnits, TimeUnits, v)
-> TimeUnits
-> ([(k, ECMIncr)], TimeUnits)
-> ECMIncr
-> m ((CacheState s Map k v, v), Bool)
det Maybe s
retr_state' Map k (TimeUnits, TimeUnits, v)
maps' TimeUnits
mapsize' ([(k, ECMIncr)], TimeUnits)
uses''' ECMIncr
incr''
(CacheState s Map k v, v) -> m (CacheState s Map k v, v)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (CacheState s Map k v, v)
ret'
else (CacheState s Map k v, v) -> m (CacheState s Map k v, v)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (CacheState s Map k v, v)
ret
det :: Maybe s
-> Map k (TimeUnits, TimeUnits, v)
-> TimeUnits
-> ([(k, ECMIncr)], TimeUnits)
-> ECMIncr
-> m ((CacheState s Map k v, v), Bool)
det Maybe s
retr_state Map k (TimeUnits, TimeUnits, v)
maps TimeUnits
mapsize ([(k, ECMIncr)], TimeUnits)
uses' ECMIncr
incr' =
Maybe (TimeUnits, TimeUnits, v)
-> Maybe s
-> m (TimeUnits, (Maybe s, v))
-> ((TimeUnits, TimeUnits, v) -> Map k (TimeUnits, TimeUnits, v),
(TimeUnits, TimeUnits, v)
-> [(k, ECMIncr)] -> Map k (TimeUnits, TimeUnits, v),
[(k, ECMIncr)] -> [(k, ECMIncr)], TimeUnits, TimeUnits)
-> m TimeUnits
-> (((TimeUnits, TimeUnits, v) -> Bool)
-> Map k (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v))
-> TimeUnits
-> (Map k (TimeUnits, TimeUnits, v) -> TimeUnits)
-> ([(k, ECMIncr)], TimeUnits)
-> ECMIncr
-> ECMIncr
-> Map k (TimeUnits, TimeUnits, v)
-> m ((CacheState s Map k v, v), Bool)
forall (m :: * -> *) k v s (mp :: * -> * -> *).
(Monad m, Eq k) =>
Maybe (TimeUnits, TimeUnits, v)
-> Maybe s
-> m (TimeUnits, (Maybe s, v))
-> ((TimeUnits, TimeUnits, v) -> mp k (TimeUnits, TimeUnits, v),
(TimeUnits, TimeUnits, v)
-> [(k, ECMIncr)] -> mp k (TimeUnits, TimeUnits, v),
[(k, ECMIncr)] -> [(k, ECMIncr)], TimeUnits, TimeUnits)
-> m TimeUnits
-> (((TimeUnits, TimeUnits, v) -> Bool)
-> mp k (TimeUnits, TimeUnits, v)
-> mp k (TimeUnits, TimeUnits, v))
-> TimeUnits
-> (mp k (TimeUnits, TimeUnits, v) -> TimeUnits)
-> ([(k, ECMIncr)], TimeUnits)
-> ECMIncr
-> ECMIncr
-> mp k (TimeUnits, TimeUnits, v)
-> m ((CacheState s mp k v, v), Bool)
detECM (k
-> Map k (TimeUnits, TimeUnits, v)
-> Maybe (TimeUnits, TimeUnits, v)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup k
id Map k (TimeUnits, TimeUnits, v)
maps) Maybe s
retr_state (Maybe s -> k -> m (TimeUnits, (Maybe s, v))
retr Maybe s
retr_state k
id)
( (\(TimeUnits, TimeUnits, v)
time_r -> k
-> (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v)
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert k
id (TimeUnits, TimeUnits, v)
time_r Map k (TimeUnits, TimeUnits, v)
maps),
(\(TimeUnits, TimeUnits, v)
time_r [(k, ECMIncr)]
keepuses -> k
-> (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v)
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert k
id (TimeUnits, TimeUnits, v)
time_r (Map k (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v))
-> Map k (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v)
forall a b. (a -> b) -> a -> b
$! Map k (TimeUnits, TimeUnits, v)
-> Map k ECMIncr -> Map k (TimeUnits, TimeUnits, v)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
M.intersection Map k (TimeUnits, TimeUnits, v)
maps (Map k ECMIncr -> Map k (TimeUnits, TimeUnits, v))
-> Map k ECMIncr -> Map k (TimeUnits, TimeUnits, v)
forall a b. (a -> b) -> a -> b
$ [(k, ECMIncr)] -> Map k ECMIncr
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [(k, ECMIncr)]
keepuses),
[(k, ECMIncr)] -> [(k, ECMIncr)]
forall {a}. [(k, a)] -> [(k, a)]
mnub, TimeUnits
minimumkeep, TimeUnits
removalsize )
m TimeUnits
gettime
((TimeUnits, TimeUnits, v) -> Bool)
-> Map k (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v)
forall a k. (a -> Bool) -> Map k a -> Map k a
M.filter
TimeUnits
mapsize Map k (TimeUnits, TimeUnits, v) -> TimeUnits
forall k a. Map k a -> TimeUnits
M.size
([(k, ECMIncr)], TimeUnits)
uses' ECMIncr
incr' ECMIncr
timecheckmodulo Map k (TimeUnits, TimeUnits, v)
maps
getValReqState :: (Monad m, Ord k) => ECM m mv s M.Map k v -> k -> m (Maybe s)
getValReqState :: forall (m :: * -> *) k (mv :: * -> *) s v.
(Monad m, Ord k) =>
ECM m mv s Map k v -> k -> m (Maybe s)
getValReqState ECM m mv s Map k v
ecm k
id = do
CacheState (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
maps, TimeUnits
mapsize, ([(k, ECMIncr)], TimeUnits)
uses, ECMIncr
incr) <- ECMReadState m mv s Map k v
read mv (CacheState s Map k v)
m'maps
Maybe s -> m (Maybe s)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe s
retr_state
where
ECM ( mv (CacheState s Map k v)
m'maps, Maybe s -> k -> m (TimeUnits, (Maybe s, v))
_, m TimeUnits
_, TimeUnits
_, ECMIncr
_, TimeUnits
_, TimeUnits
_, ECMEnterState m mv s Map k v
_, ECMReadState m mv s Map k v
read ) = ECM m mv s Map k v
ecm
invalidate :: (Monad m, Ord k) => ECM m mv s M.Map k v -> k -> m (Maybe v)
invalidate :: forall (m :: * -> *) k (mv :: * -> *) s v.
(Monad m, Ord k) =>
ECM m mv s Map k v -> k -> m (Maybe v)
invalidate ECM m mv s Map k v
ecm k
id = do
CacheState (Maybe s
_, Map k (TimeUnits, TimeUnits, v)
maps0, TimeUnits
_, ([(k, ECMIncr)], TimeUnits)
_, ECMIncr
_) <- ECMReadState m mv s Map k v
read mv (CacheState s Map k v)
m'maps
case k
-> Map k (TimeUnits, TimeUnits, v)
-> Maybe (TimeUnits, TimeUnits, v)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup k
id Map k (TimeUnits, TimeUnits, v)
maps0 of
Just (TimeUnits, TimeUnits, v)
time_prev0 -> do
v
prev0' <- ECMEnterState m mv s Map k v
enter mv (CacheState s Map k v)
m'maps ((CacheState s Map k v -> m (CacheState s Map k v, v)) -> m v)
-> (CacheState s Map k v -> m (CacheState s Map k v, v)) -> m v
forall a b. (a -> b) -> a -> b
$
\(CacheState (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
maps, TimeUnits
mapsize, ([(k, ECMIncr)], TimeUnits)
uses, ECMIncr
incr)) ->
let (TimeUnits
_, TimeUnits
_, v
prev) =
case k
-> Map k (TimeUnits, TimeUnits, v)
-> Maybe (TimeUnits, TimeUnits, v)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup k
id Map k (TimeUnits, TimeUnits, v)
maps of
Just (TimeUnits, TimeUnits, v)
time_prev -> (TimeUnits, TimeUnits, v)
time_prev
Maybe (TimeUnits, TimeUnits, v)
Nothing -> (TimeUnits, TimeUnits, v)
time_prev0
maps' :: Map k (TimeUnits, TimeUnits, v)
maps' = k
-> Map k (TimeUnits, TimeUnits, v)
-> Map k (TimeUnits, TimeUnits, v)
forall k a. Ord k => k -> Map k a -> Map k a
M.delete k
id Map k (TimeUnits, TimeUnits, v)
maps
in (CacheState s Map k v, v) -> m (CacheState s Map k v, v)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Maybe s, Map k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), ECMIncr)
-> CacheState s Map k v
forall s (m :: * -> * -> *) k v.
(Maybe s, m k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), ECMIncr)
-> CacheState s m k v
CacheState (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
maps', TimeUnits
mapsize, ([(k, ECMIncr)], TimeUnits)
uses, ECMIncr
incr), v
prev)
Maybe v -> m (Maybe v)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe v -> m (Maybe v)) -> Maybe v -> m (Maybe v)
forall a b. (a -> b) -> a -> b
$ v -> Maybe v
forall a. a -> Maybe a
Just v
prev0'
Maybe (TimeUnits, TimeUnits, v)
Nothing -> Maybe v -> m (Maybe v)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe v
forall a. Maybe a
Nothing
where
ECM ( mv (CacheState s Map k v)
m'maps, Maybe s -> k -> m (TimeUnits, (Maybe s, v))
_, m TimeUnits
_, TimeUnits
_, ECMIncr
_, TimeUnits
_, TimeUnits
compactlistsize, ECMEnterState m mv s Map k v
enter, ECMReadState m mv s Map k v
read ) = ECM m mv s Map k v
ecm
invalidateCache :: (Monad m, Ord k) => ECM m mv s M.Map k v -> m (Maybe (k, v))
invalidateCache :: forall (m :: * -> *) k (mv :: * -> *) s v.
(Monad m, Ord k) =>
ECM m mv s Map k v -> m (Maybe (k, v))
invalidateCache ECM m mv s Map k v
ecm = do
CacheState (Maybe s
_, Map k (TimeUnits, TimeUnits, v)
maps0, TimeUnits
_, ([(k, ECMIncr)]
uses0, TimeUnits
_), ECMIncr
_) <- ECMReadState m mv s Map k v
read mv (CacheState s Map k v)
m'maps
case (Map k ECMIncr -> [(k, ECMIncr)]
forall k a. Map k a -> [(k, a)]
M.toList (Map k ECMIncr -> [(k, ECMIncr)])
-> Map k ECMIncr -> [(k, ECMIncr)]
forall a b. (a -> b) -> a -> b
$ Map k ECMIncr -> Map k (TimeUnits, TimeUnits, v) -> Map k ECMIncr
forall k a b. Ord k => Map k a -> Map k b -> Map k a
M.intersection ([(k, ECMIncr)] -> Map k ECMIncr
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(k, ECMIncr)] -> Map k ECMIncr)
-> [(k, ECMIncr)] -> Map k ECMIncr
forall a b. (a -> b) -> a -> b
$ [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. [a] -> [a]
reverse [(k, ECMIncr)]
uses0) Map k (TimeUnits, TimeUnits, v)
maps0) of
[] -> Maybe (k, v) -> m (Maybe (k, v))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (k, v)
forall a. Maybe a
Nothing
[(k, ECMIncr)]
uses0' ->
let (k
id, ECMIncr
_) = ((k, ECMIncr) -> (k, ECMIncr) -> Ordering)
-> [(k, ECMIncr)] -> (k, ECMIncr)
forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
L.maximumBy (\(k
_,ECMIncr
a) (k
_,ECMIncr
b) -> ECMIncr -> ECMIncr -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ECMIncr
a ECMIncr
b) [(k, ECMIncr)]
uses0' in
case k
-> Map k (TimeUnits, TimeUnits, v)
-> Maybe (TimeUnits, TimeUnits, v)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup k
id Map k (TimeUnits, TimeUnits, v)
maps0 of
Just (TimeUnits, TimeUnits, v)
time_prev0 -> do
v
prev0' <- ECMEnterState m mv s Map k v
enter mv (CacheState s Map k v)
m'maps ((CacheState s Map k v -> m (CacheState s Map k v, v)) -> m v)
-> (CacheState s Map k v -> m (CacheState s Map k v, v)) -> m v
forall a b. (a -> b) -> a -> b
$
\(CacheState (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
maps, TimeUnits
_mapsize, ([(k, ECMIncr)], TimeUnits)
_uses, ECMIncr
_incr)) ->
let (TimeUnits
_, TimeUnits
_, v
prev) =
case k
-> Map k (TimeUnits, TimeUnits, v)
-> Maybe (TimeUnits, TimeUnits, v)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup k
id Map k (TimeUnits, TimeUnits, v)
maps of
Just (TimeUnits, TimeUnits, v)
time_prev -> (TimeUnits, TimeUnits, v)
time_prev
Maybe (TimeUnits, TimeUnits, v)
Nothing -> (TimeUnits, TimeUnits, v)
time_prev0
in (CacheState s Map k v, v) -> m (CacheState s Map k v, v)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Maybe s, Map k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), ECMIncr)
-> CacheState s Map k v
forall s (m :: * -> * -> *) k v.
(Maybe s, m k (TimeUnits, TimeUnits, v), TimeUnits,
([(k, ECMIncr)], TimeUnits), ECMIncr)
-> CacheState s m k v
CacheState (Maybe s
retr_state, Map k (TimeUnits, TimeUnits, v)
forall k a. Map k a
M.empty, TimeUnits
0, ([], TimeUnits
0), ECMIncr
0), v
prev)
Maybe (k, v) -> m (Maybe (k, v))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (k, v) -> m (Maybe (k, v)))
-> Maybe (k, v) -> m (Maybe (k, v))
forall a b. (a -> b) -> a -> b
$ (k, v) -> Maybe (k, v)
forall a. a -> Maybe a
Just (k
id, v
prev0')
where
ECM ( mv (CacheState s Map k v)
m'maps, Maybe s -> k -> m (TimeUnits, (Maybe s, v))
_, m TimeUnits
_, TimeUnits
_, ECMIncr
_, TimeUnits
_, TimeUnits
compactlistsize, ECMEnterState m mv s Map k v
enter, ECMReadState m mv s Map k v
read ) = ECM m mv s Map k v
ecm
keysCached :: (Monad m, Ord k) => ECM m mv s M.Map k v -> m [k]
keysCached :: forall (m :: * -> *) k (mv :: * -> *) s v.
(Monad m, Ord k) =>
ECM m mv s Map k v -> m [k]
keysCached ECM m mv s Map k v
ecm = do
CacheState (Maybe s
_, Map k (TimeUnits, TimeUnits, v)
maps0, TimeUnits
_, ([(k, ECMIncr)], TimeUnits)
_, ECMIncr
_) <- ECMReadState m mv s Map k v
read mv (CacheState s Map k v)
m'maps
[k] -> m [k]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([k] -> m [k]) -> [k] -> m [k]
forall a b. (a -> b) -> a -> b
$ Map k (TimeUnits, TimeUnits, v) -> [k]
forall k a. Map k a -> [k]
M.keys Map k (TimeUnits, TimeUnits, v)
maps0
where
ECM ( mv (CacheState s Map k v)
m'maps, Maybe s -> k -> m (TimeUnits, (Maybe s, v))
_, m TimeUnits
_, TimeUnits
_, ECMIncr
_, TimeUnits
_, TimeUnits
_, ECMEnterState m mv s Map k v
_, ECMReadState m mv s Map k v
read ) = ECM m mv s Map k v
ecm
keysNotExpired :: (Monad m, Ord k) => ECM m mv s M.Map k v -> m [k]
keysNotExpired :: forall (m :: * -> *) k (mv :: * -> *) s v.
(Monad m, Ord k) =>
ECM m mv s Map k v -> m [k]
keysNotExpired ECM m mv s Map k v
ecm = do
CacheState (Maybe s
_, Map k (TimeUnits, TimeUnits, v)
maps0, TimeUnits
_, ([(k, ECMIncr)], TimeUnits)
_, ECMIncr
_) <- ECMReadState m mv s Map k v
read mv (CacheState s Map k v)
m'maps
TimeUnits
current_time <- m TimeUnits
gettime
[k] -> m [k]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([k] -> m [k]) -> [k] -> m [k]
forall a b. (a -> b) -> a -> b
$ TimeUnits -> [(k, (TimeUnits, TimeUnits, v))] -> [k]
forall k v. TimeUnits -> [(k, (TimeUnits, TimeUnits, v))] -> [k]
detNotExpired TimeUnits
current_time ([(k, (TimeUnits, TimeUnits, v))] -> [k])
-> [(k, (TimeUnits, TimeUnits, v))] -> [k]
forall a b. (a -> b) -> a -> b
$ Map k (TimeUnits, TimeUnits, v) -> [(k, (TimeUnits, TimeUnits, v))]
forall k a. Map k a -> [(k, a)]
M.toList Map k (TimeUnits, TimeUnits, v)
maps0
where
ECM ( mv (CacheState s Map k v)
m'maps, Maybe s -> k -> m (TimeUnits, (Maybe s, v))
_, m TimeUnits
gettime, TimeUnits
_, ECMIncr
_, TimeUnits
_, TimeUnits
_, ECMEnterState m mv s Map k v
_, ECMReadState m mv s Map k v
read ) = ECM m mv s Map k v
ecm
consistentDuration :: (Monad m, Ord k) => TimeUnits -> (Maybe s -> k -> m (Maybe s, v)) -> (Maybe s -> k -> m (TimeUnits, (Maybe s, v)))
consistentDuration :: forall (m :: * -> *) k s v.
(Monad m, Ord k) =>
TimeUnits
-> (Maybe s -> k -> m (Maybe s, v))
-> Maybe s
-> k
-> m (TimeUnits, (Maybe s, v))
consistentDuration TimeUnits
duration Maybe s -> k -> m (Maybe s, v)
fun =
\Maybe s
state k
id -> do
(Maybe s, v)
ret <- Maybe s -> k -> m (Maybe s, v)
fun Maybe s
state k
id
(TimeUnits, (Maybe s, v)) -> m (TimeUnits, (Maybe s, v))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (TimeUnits
duration, (Maybe s, v)
ret)