{-# LANGUAGE OverloadedStrings #-}
-- |

-- Module : Caching.ExpiringCacheMap.Internal.Types

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

-- License: BSD-style

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

-- Stability: experimental

-- Portability: portable

--

-- Types used by internal functions and as the opaque types exported by other 

-- modules, assume these type definitions to change from version to version.

-- 


module Caching.ExpiringCacheMap.Internal.Types (
    -- * Cache internals

    ECM(..),
    CacheState(..),
    ECMNewState,
    ECMEnterState,
    ECMReadState
) where

import qualified Control.Concurrent.MVar as MV
import Caching.ExpiringCacheMap.Utils.Types

type ECMNewState a b s m k v = (CacheState s m k v) -> a (b (CacheState s m k v))

type ECMEnterState a b s m k v = b (CacheState s m k v) -> ((CacheState s m k v) -> a ((CacheState s m k v), v)) -> a v

type ECMReadState a b s m k v = b (CacheState s m k v) -> a (CacheState s m k v)

-- | The cache state.

newtype CacheState s m k v =
  CacheState (Maybe s, m k (TimeUnits, TimeUnits, v), ECMMapSize, ([(k, ECMIncr)], ECMULength), ECMIncr)

-- | The type that encapsulates a cache map.

newtype ECM a b s m k v = ECM ( b (CacheState s m k v),
                  Maybe s -> k -> a (TimeUnits, (Maybe s, v)),
                  a TimeUnits,
                  ECMMapSize,
                  -- TimeUnits,

                  ECMIncr,
                  ECMULength,
                  ECMULength,
                  ECMEnterState a b s m k v,
                  ECMReadState a b s m k v)