{-# LANGUAGE OverloadedStrings #-}
-- |

-- Module : Caching.ExpiringCacheMap.Internal

-- Copyright: (c) 2014 Edward L. Blake

-- License: BSD-style

-- Maintainer: Edward L. Blake <edwardlblake@gmail.com>

-- Stability: experimental

-- Portability: portable

--

-- A module with internal functions used in common by HashECM and OrdECM.

-- Assume these functions to change from version to version.

-- 


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
          {-
          if id1 == id
            then ((id1, incr') : latest : (id2, oincr2) : (id3, oincr3) : (id4, oincr4) : rest, lcount)
            else if id2 == id 
                   then ((id2, incr') : latest : (id1, oincr1) : (id3, oincr3) : (id4, oincr4) : rest, lcount)
                   else if id3 == id 
                          then ((id3, incr') : latest : (id1, oincr1) : (id2, oincr2) : (id4, oincr4) : rest, lcount)
                          else if id4 == id 
                                 then ((id4, incr') : latest : (id1, oincr1) : (id2, oincr2) : (id3, oincr3) : rest, lcount)
                                 else 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
          {-
          if id1 == id
            then ((id1, incr') : latest : (id2, oincr2) : (id3, oincr3) : rest, lcount)
            else if id2 == id 
                   then ((id2, incr') : latest : (id1, oincr1) : (id3, oincr3) : rest, lcount)
                   else if id3 == id 
                          then ((id3, incr') : latest : (id1, oincr1) : (id2, oincr2) : rest, lcount)
                          else 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
          {-
          if id1 == id
            then ((id1, incr') : latest : (id2, oincr2) : rest, lcount)
            else if id2 == id 
                   then ((id2, incr') : latest : (id1, oincr1) : rest, lcount)
                   else 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) -- filterExpired time

      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


-- | Debugging function

--

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