{-# LANGUAGE OverloadedStrings #-}
module Caching.ExpiringCacheMap.Internal.Internal (
updateUses,
detECM,
getStatsString,
detNotExpired
) where
import qualified Data.List as L
import Caching.ExpiringCacheMap.Types
import Caching.ExpiringCacheMap.Internal.Types
updateUses :: (Eq k) => ([(k, ECMIncr)], ECMULength) -> k
-> ECMIncr -> ECMULength -> ([(k, ECMIncr)] -> [(k, ECMIncr)])
-> ([(k, ECMIncr)], ECMULength)
{-# INLINE updateUses #-}
updateUses :: ([(k, ECMIncr)], ECMULength)
-> k
-> ECMIncr
-> ECMULength
-> ([(k, ECMIncr)] -> [(k, ECMIncr)])
-> ([(k, ECMIncr)], ECMULength)
updateUses (usesl :: [(k, ECMIncr)]
usesl, lcount :: ECMULength
lcount) id :: k
id incr' :: ECMIncr
incr' compactlistsize :: ECMULength
compactlistsize compactUses :: [(k, ECMIncr)] -> [(k, ECMIncr)]
compactUses
| ECMULength
lcount ECMULength -> ECMULength -> Bool
forall a. Ord a => a -> a -> Bool
>= 5 =
case [(k, ECMIncr)]
usesl of
(id' :: k
id', _) : rest :: [(k, ECMIncr)]
rest | k
id' k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id ->
((k
id', ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
latest :: (k, ECMIncr)
latest : (id1 :: k
id1, oincr1 :: ECMIncr
oincr1) : (id2 :: k
id2, oincr2 :: ECMIncr
oincr2) : (id3 :: k
id3, oincr3 :: ECMIncr
oincr3) : (id4 :: k
id4, oincr4 :: ECMIncr
oincr4) : rest :: [(k, ECMIncr)]
rest ->
case Bool
True of
_ | k
id1 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id1, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id2, ECMIncr
oincr2) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id3, ECMIncr
oincr3) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id4, ECMIncr
oincr4) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ | k
id2 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id2, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id1, ECMIncr
oincr1) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id3, ECMIncr
oincr3) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id4, ECMIncr
oincr4) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ | k
id3 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id3, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id1, ECMIncr
oincr1) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id2, ECMIncr
oincr2) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id4, ECMIncr
oincr4) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ | k
id4 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id4, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id1, ECMIncr
oincr1) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id2, ECMIncr
oincr2) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id3, ECMIncr
oincr3) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ -> ([(k, ECMIncr)], ECMULength)
justPrepend
_ -> ([(k, ECMIncr)], ECMULength)
justPrepend
| Bool
otherwise =
case [(k, ECMIncr)]
usesl of
(id' :: k
id', _) : rest :: [(k, ECMIncr)]
rest | k
id' k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id ->
((k
id', ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
latest :: (k, ECMIncr)
latest : (id1 :: k
id1, oincr1 :: ECMIncr
oincr1) : (id2 :: k
id2, oincr2 :: ECMIncr
oincr2) : (id3 :: k
id3, oincr3 :: ECMIncr
oincr3) : rest :: [(k, ECMIncr)]
rest ->
case Bool
True of
_ | k
id1 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id1, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id2, ECMIncr
oincr2) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id3, ECMIncr
oincr3) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ | k
id2 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id2, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id1, ECMIncr
oincr1) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id3, ECMIncr
oincr3) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ | k
id3 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id3, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id1, ECMIncr
oincr1) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id2, ECMIncr
oincr2) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ -> ([(k, ECMIncr)], ECMULength)
justPrepend
latest :: (k, ECMIncr)
latest : (id1 :: k
id1, oincr1 :: ECMIncr
oincr1) : (id2 :: k
id2, oincr2 :: ECMIncr
oincr2) : rest :: [(k, ECMIncr)]
rest ->
case Bool
True of
_ | k
id1 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id1, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id2, ECMIncr
oincr2) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ | k
id2 k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id -> ((k
id2, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k
id1, ECMIncr
oincr1) (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
_ -> ([(k, ECMIncr)], ECMULength)
justPrepend
latest :: (k, ECMIncr)
latest : (id' :: k
id', _) : rest :: [(k, ECMIncr)]
rest ->
if k
id' k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
id
then ((k
id', ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: (k, ECMIncr)
latest (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
rest, ECMULength
lcount)
else ([(k, ECMIncr)], ECMULength)
justPrepend
_ -> ([(k, ECMIncr)], ECMULength)
justPrepend
where
justPrepend :: ([(k, ECMIncr)], ECMULength)
justPrepend =
if ECMULength
lcount ECMULength -> ECMULength -> Bool
forall a. Ord a => a -> a -> Bool
> ECMULength
compactlistsize
then let newusesl :: [(k, ECMIncr)]
newusesl = [(k, ECMIncr)] -> [(k, ECMIncr)]
compactUses [(k, ECMIncr)]
usesl
in ((k
id, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
newusesl, (ECMULength -> ECMULength -> ECMULength
forall a. Num a => a -> a -> a
+1) (ECMULength -> ECMULength) -> ECMULength -> ECMULength
forall a b. (a -> b) -> a -> b
$! ([(k, ECMIncr)] -> ECMULength
forall (t :: * -> *) a. Foldable t => t a -> ECMULength
L.length [(k, ECMIncr)]
newusesl) )
else ((k
id, ECMIncr
incr') (k, ECMIncr) -> [(k, ECMIncr)] -> [(k, ECMIncr)]
forall a. a -> [a] -> [a]
: [(k, ECMIncr)]
usesl, ECMULength
lcount ECMULength -> ECMULength -> ECMULength
forall a. Num a => a -> a -> a
+ 1)
detECM
:: (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)]),
ECMMapSize,
ECMULength)
-> m TimeUnits
-> (((TimeUnits, TimeUnits, v) -> Bool)
-> mp k (TimeUnits, TimeUnits, v) -> mp k (TimeUnits, TimeUnits, v))
-> ECMMapSize
-> (mp k (TimeUnits, TimeUnits, v) -> ECMMapSize)
-> ([(k, ECMIncr)], ECMULength)
-> ECMIncr
-> ECMIncr
-> mp k (TimeUnits, TimeUnits, v)
-> m ((CacheState s mp k v, v), Bool)
{-# INLINE detECM #-}
detECM :: Maybe (ECMULength, ECMULength, v)
-> Maybe s
-> m (ECMULength, (Maybe s, v))
-> ((ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v),
(ECMULength, ECMULength, v)
-> [(k, ECMIncr)] -> mp k (ECMULength, ECMULength, v),
[(k, ECMIncr)] -> [(k, ECMIncr)], ECMULength, ECMULength)
-> m ECMULength
-> (((ECMULength, ECMULength, v) -> Bool)
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v))
-> ECMULength
-> (mp k (ECMULength, ECMULength, v) -> ECMULength)
-> ([(k, ECMIncr)], ECMULength)
-> ECMIncr
-> ECMIncr
-> mp k (ECMULength, ECMULength, v)
-> m ((CacheState s mp k v, v), Bool)
detECM result :: Maybe (ECMULength, ECMULength, v)
result retr_state :: Maybe s
retr_state retr_id :: m (ECMULength, (Maybe s, v))
retr_id etc :: ((ECMULength, ECMULength, v) -> mp k (ECMULength, ECMULength, v),
(ECMULength, ECMULength, v)
-> [(k, ECMIncr)] -> mp k (ECMULength, ECMULength, v),
[(k, ECMIncr)] -> [(k, ECMIncr)], ECMULength, ECMULength)
etc gettime :: m ECMULength
gettime filt :: ((ECMULength, ECMULength, v) -> Bool)
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v)
filt cmapsize :: ECMULength
cmapsize newsize :: mp k (ECMULength, ECMULength, v) -> ECMULength
newsize uses' :: ([(k, ECMIncr)], ECMULength)
uses' incr' :: ECMIncr
incr' timecheckmodulo :: ECMIncr
timecheckmodulo maps :: mp k (ECMULength, ECMULength, v)
maps =
case Maybe (ECMULength, ECMULength, v)
result of
Nothing -> do
(expirytime :: ECMULength
expirytime, (retr_state' :: Maybe s
retr_state', r :: v
r)) <- m (ECMULength, (Maybe s, v))
retr_id
ECMULength
time <- m ECMULength
gettime
let (newmaps :: mp k (ECMULength, ECMULength, v)
newmaps,mapsize' :: ECMULength
mapsize',newuses :: ([(k, ECMIncr)], ECMULength)
newuses) = ((ECMULength, ECMULength, v) -> mp k (ECMULength, ECMULength, v),
(ECMULength, ECMULength, v)
-> [(k, ECMIncr)] -> mp k (ECMULength, ECMULength, v),
[(k, ECMIncr)] -> [(k, ECMIncr)], ECMULength, ECMULength)
-> ECMULength
-> (mp k (ECMULength, ECMULength, v) -> ECMULength)
-> (((ECMULength, ECMULength, v) -> Bool)
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v))
-> ECMULength
-> v
-> ECMULength
-> ([(k, ECMIncr)], ECMULength)
-> (mp k (ECMULength, ECMULength, v), ECMULength,
([(k, ECMIncr)], ECMULength))
forall b a a b c t b t c.
(Ord b, Num b, Ord a, Num a, Ord a) =>
((a, b, c) -> t, (a, b, c) -> [(b, a)] -> t, [(b, a)] -> [(b, a)],
ECMULength, b)
-> b
-> (t -> b)
-> (((a, a, c) -> Bool) -> t -> t)
-> a
-> c
-> b
-> ([(b, a)], ECMULength)
-> (t, b, ([(b, a)], ECMULength))
insertAndPerhapsRemoveSome ((ECMULength, ECMULength, v) -> mp k (ECMULength, ECMULength, v),
(ECMULength, ECMULength, v)
-> [(k, ECMIncr)] -> mp k (ECMULength, ECMULength, v),
[(k, ECMIncr)] -> [(k, ECMIncr)], ECMULength, ECMULength)
etc ECMULength
cmapsize mp k (ECMULength, ECMULength, v) -> ECMULength
newsize ((ECMULength, ECMULength, v) -> Bool)
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v)
filt ECMULength
time v
r ECMULength
expirytime ([(k, ECMIncr)], ECMULength)
uses'
((CacheState s mp k v, v), Bool)
-> m ((CacheState s mp k v, v), Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (((CacheState s mp k v, v), Bool)
-> m ((CacheState s mp k v, v), Bool))
-> ((CacheState s mp k v, v), Bool)
-> m ((CacheState s mp k v, v), Bool)
forall a b. (a -> b) -> a -> b
$! (((Maybe s, mp k (ECMULength, ECMULength, v), ECMULength,
([(k, ECMIncr)], ECMULength), ECMIncr)
-> CacheState s mp k v
forall s (m :: * -> * -> *) k v.
(Maybe s, m k (ECMULength, ECMULength, v), ECMULength,
([(k, ECMIncr)], ECMULength), ECMIncr)
-> CacheState s m k v
CacheState (Maybe s
retr_state', mp k (ECMULength, ECMULength, v)
newmaps, ECMULength
mapsize', ([(k, ECMIncr)], ECMULength)
newuses, ECMIncr
incr'), v
r), Bool
False)
Just (_accesstime :: ECMULength
_accesstime, _expirytime :: ECMULength
_expirytime, m :: v
m) -> do
if ECMIncr
incr' ECMIncr -> ECMIncr -> ECMIncr
forall a. Integral a => a -> a -> a
`mod` ECMIncr
timecheckmodulo ECMIncr -> ECMIncr -> Bool
forall a. Eq a => a -> a -> Bool
== 0
then do
ECMULength
time <- m ECMULength
gettime
((CacheState s mp k v, v), Bool)
-> m ((CacheState s mp k v, v), Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (((CacheState s mp k v, v), Bool)
-> m ((CacheState s mp k v, v), Bool))
-> ((CacheState s mp k v, v), Bool)
-> m ((CacheState s mp k v, v), Bool)
forall a b. (a -> b) -> a -> b
$! let maps' :: mp k (ECMULength, ECMULength, v)
maps' = ECMULength
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v)
filterExpired ECMULength
time mp k (ECMULength, ECMULength, v)
maps
in (((Maybe s, mp k (ECMULength, ECMULength, v), ECMULength,
([(k, ECMIncr)], ECMULength), ECMIncr)
-> CacheState s mp k v
forall s (m :: * -> * -> *) k v.
(Maybe s, m k (ECMULength, ECMULength, v), ECMULength,
([(k, ECMIncr)], ECMULength), ECMIncr)
-> CacheState s m k v
CacheState (Maybe s
retr_state, mp k (ECMULength, ECMULength, v)
maps', (ECMULength -> ECMULength -> ECMULength
forall a. Num a => a -> a -> a
+0) (ECMULength -> ECMULength) -> ECMULength -> ECMULength
forall a b. (a -> b) -> a -> b
$! mp k (ECMULength, ECMULength, v) -> ECMULength
newsize mp k (ECMULength, ECMULength, v)
maps', ([(k, ECMIncr)], ECMULength)
uses', ECMIncr
incr'), v
m), Bool
True)
else ((CacheState s mp k v, v), Bool)
-> m ((CacheState s mp k v, v), Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (((Maybe s, mp k (ECMULength, ECMULength, v), ECMULength,
([(k, ECMIncr)], ECMULength), ECMIncr)
-> CacheState s mp k v
forall s (m :: * -> * -> *) k v.
(Maybe s, m k (ECMULength, ECMULength, v), ECMULength,
([(k, ECMIncr)], ECMULength), ECMIncr)
-> CacheState s m k v
CacheState (Maybe s
retr_state, mp k (ECMULength, ECMULength, v)
maps, ECMULength
cmapsize, ([(k, ECMIncr)], ECMULength)
uses', ECMIncr
incr'), v
m), Bool
False)
where
filterExpired :: ECMULength
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v)
filterExpired = (((ECMULength, ECMULength, v) -> Bool)
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v))
-> ECMULength
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v)
forall a c t.
(Ord a, Num a) =>
(((a, a, c) -> Bool) -> t) -> a -> t
filterExpired' ((ECMULength, ECMULength, v) -> Bool)
-> mp k (ECMULength, ECMULength, v)
-> mp k (ECMULength, ECMULength, v)
filt
{-# INLINE insertAndPerhapsRemoveSome #-}
insertAndPerhapsRemoveSome :: ((a, b, c) -> t, (a, b, c) -> [(b, a)] -> t, [(b, a)] -> [(b, a)],
ECMULength, b)
-> b
-> (t -> b)
-> (((a, a, c) -> Bool) -> t -> t)
-> a
-> c
-> b
-> ([(b, a)], ECMULength)
-> (t, b, ([(b, a)], ECMULength))
insertAndPerhapsRemoveSome (insert_id1 :: (a, b, c) -> t
insert_id1, insert_id2 :: (a, b, c) -> [(b, a)] -> t
insert_id2, mnub :: [(b, a)] -> [(b, a)]
mnub, minimumkeep :: ECMULength
minimumkeep, removalsize :: b
removalsize) cmapsize :: b
cmapsize newsize :: t -> b
newsize filt :: ((a, a, c) -> Bool) -> t -> t
filt time :: a
time r :: c
r expirytime :: b
expirytime uses :: ([(b, a)], ECMULength)
uses =
if b
cmapsize b -> b -> Bool
forall a. Ord a => a -> a -> Bool
>= b
removalsize
then
let (keepuses :: [(b, a)]
keepuses, _removekeys :: [b]
_removekeys) = [(b, a)] -> ([(b, a)], [b])
getKeepAndRemove [(b, a)]
usesl
newmaps :: t
newmaps = (a, b, c) -> [(b, a)] -> t
insert_id2 (a
time, b
expirytime, c
r) [(b, a)]
keepuses
newmaps' :: t
newmaps' = a -> t -> t
filterExpired a
time t
newmaps
in (t
newmaps', (b -> b -> b
forall a. Num a => a -> a -> a
+0) (b -> b) -> b -> b
forall a b. (a -> b) -> a -> b
$! t -> b
newsize t
newmaps', ([(b, a)]
keepuses, (ECMULength -> ECMULength -> ECMULength
forall a. Num a => a -> a -> a
+0) (ECMULength -> ECMULength) -> ECMULength -> ECMULength
forall a b. (a -> b) -> a -> b
$! ([(b, a)] -> ECMULength
forall (t :: * -> *) a. Foldable t => t a -> ECMULength
L.length [(b, a)]
keepuses)))
else
let newmaps :: t
newmaps = (a, b, c) -> t
insert_id1 (a
time, b
expirytime, c
r)
in (t
newmaps, b
cmapsize b -> b -> b
forall a. Num a => a -> a -> a
+ 1, ([(b, a)], ECMULength)
uses)
where
(usesl :: [(b, a)]
usesl, _lcount :: ECMULength
_lcount) = ([(b, a)], ECMULength)
uses
getKeepAndRemove :: [(b, a)] -> ([(b, a)], [b])
getKeepAndRemove =
([(a, b)], [(a, b)]) -> ([(b, a)], [b])
forall b a a b. ([(b, a)], [(a, b)]) -> ([(a, b)], [b])
finalTup (([(a, b)], [(a, b)]) -> ([(b, a)], [b]))
-> ([(b, a)] -> ([(a, b)], [(a, b)]))
-> [(b, a)]
-> ([(b, a)], [b])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ECMULength -> [(a, b)] -> ([(a, b)], [(a, b)])
forall a. ECMULength -> [a] -> ([a], [a])
splitAt ECMULength
minimumkeep ([(a, b)] -> ([(a, b)], [(a, b)]))
-> ([(b, a)] -> [(a, b)]) -> [(b, a)] -> ([(a, b)], [(a, b)])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, b)] -> [(a, b)]
forall a. [a] -> [a]
reverse ([(a, b)] -> [(a, b)])
-> ([(b, a)] -> [(a, b)]) -> [(b, a)] -> [(a, b)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[(a, b)] -> [(a, b)]
forall b. [(a, b)] -> [(a, b)]
sortI ([(a, b)] -> [(a, b)])
-> ([(b, a)] -> [(a, b)]) -> [(b, a)] -> [(a, b)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b, a) -> (a, b)) -> [(b, a)] -> [(a, b)]
forall a b. (a -> b) -> [a] -> [b]
map (b, a) -> (a, b)
forall b a. (b, a) -> (a, b)
swap2 ([(b, a)] -> [(a, b)])
-> ([(b, a)] -> [(b, a)]) -> [(b, a)] -> [(a, b)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(b, a)] -> [(b, a)]
mnub
where swap2 :: (b, a) -> (a, b)
swap2 (a :: b
a,b :: a
b) = (a
b,b
a)
finalTup :: ([(b, a)], [(a, b)]) -> ([(a, b)], [b])
finalTup (l1 :: [(b, a)]
l1,l2 :: [(a, b)]
l2) =
(((b, a) -> (a, b)) -> [(b, a)] -> [(a, b)]
forall a b. (a -> b) -> [a] -> [b]
map (\(c :: b
c,k :: a
k) -> (a
k,b
c)) [(b, a)]
l1, ((a, b) -> b) -> [(a, b)] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map (\(c :: a
c,k :: b
k) -> b
k) [(a, b)]
l2)
sortI :: [(a, b)] -> [(a, b)]
sortI = ((a, b) -> (a, b) -> Ordering) -> [(a, b)] -> [(a, b)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
L.sortBy (\(l :: a
l,_) (r :: a
r,_) -> a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
l a
r)
filterExpired :: a -> t -> t
filterExpired = (((a, a, c) -> Bool) -> t -> t) -> a -> t -> t
forall a c t.
(Ord a, Num a) =>
(((a, a, c) -> Bool) -> t) -> a -> t
filterExpired' ((a, a, c) -> Bool) -> t -> t
filt
{-# INLINE filterExpired' #-}
filterExpired' :: (((a, a, c) -> Bool) -> t) -> a -> t
filterExpired' filt :: ((a, a, c) -> Bool) -> t
filt time :: a
time =
((a, a, c) -> Bool) -> t
filt (\(accesstime :: a
accesstime, expirytime :: a
expirytime, _value :: c
_value) ->
(a
accesstime a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
time) Bool -> Bool -> Bool
&&
(a
accesstime a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> (a
time a -> a -> a
forall a. Num a => a -> a -> a
- a
expirytime)))
detNotExpired
:: TimeUnits -> [(k, (TimeUnits, TimeUnits, v))] -> [k]
{-# INLINE detNotExpired #-}
detNotExpired :: ECMULength -> [(k, (ECMULength, ECMULength, v))] -> [k]
detNotExpired _time :: ECMULength
_time l :: [(k, (ECMULength, ECMULength, v))]
l = ECMULength -> [(k, (ECMULength, ECMULength, v))] -> [k] -> [k]
forall t a c. (Ord t, Num t) => t -> [(a, (t, t, c))] -> [a] -> [a]
detNotExpired' ECMULength
_time [(k, (ECMULength, ECMULength, v))]
l []
{-# INLINE detNotExpired' #-}
detNotExpired' :: t -> [(a, (t, t, c))] -> [a] -> [a]
detNotExpired' _time :: t
_time [] l :: [a]
l = [a] -> [a]
forall a. [a] -> [a]
reverse [a]
l
detNotExpired' time :: t
time ((key :: a
key, (accesstime :: t
accesstime, expirytime :: t
expirytime, _value :: c
_value)) : r :: [(a, (t, t, c))]
r) l :: [a]
l
| (t
accesstime t -> t -> Bool
forall a. Ord a => a -> a -> Bool
<= t
time) Bool -> Bool -> Bool
&& (t
accesstime t -> t -> Bool
forall a. Ord a => a -> a -> Bool
> (t
time t -> t -> t
forall a. Num a => a -> a -> a
- t
expirytime)) =
t -> [(a, (t, t, c))] -> [a] -> [a]
detNotExpired' t
time [(a, (t, t, c))]
r (a
keya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
l)
| Bool
otherwise =
t -> [(a, (t, t, c))] -> [a] -> [a]
detNotExpired' t
time [(a, (t, t, c))]
r [a]
l
getStatsString :: ECM m b s m k v -> m String
getStatsString ecm :: ECM m b s m k v
ecm = do
CacheState (_retr_state :: Maybe s
_retr_state, _maps :: m k (ECMULength, ECMULength, v)
_maps, _mapsize :: ECMULength
_mapsize, uses :: ([(k, ECMIncr)], ECMULength)
uses, _incr :: ECMIncr
_incr) <- ECMReadState m b s m k v
ro b (CacheState s m k v)
m'uses
String -> m String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> m String) -> String -> m String
forall a b. (a -> b) -> a -> b
$ ([(k, ECMIncr)], ECMULength) -> String
forall a. Show a => a -> String
show ([(k, ECMIncr)], ECMULength)
uses
where
ECM ( m'uses :: b (CacheState s m k v)
m'uses, _retr :: Maybe s -> k -> m (ECMULength, (Maybe s, v))
_retr, _gettime :: m ECMULength
_gettime, _minimumkeep :: ECMULength
_minimumkeep, _timecheckmodulo :: ECMIncr
_timecheckmodulo, _removalsize :: ECMULength
_removalsize,
_compactlistsize :: ECMULength
_compactlistsize, _enter :: ECMEnterState m b s m k v
_enter, ro :: ECMReadState m b s m k v
ro ) = ECM m b s m k v
ecm