{-# LANGUAGE OverloadedStrings #-}
-- |

-- Module : Caching.ExpiringCacheMap.Types

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

-- License: BSD-style

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

-- Stability: experimental

-- Portability: portable

--

-- Types common to "Caching.ExpiringCacheMap.OrdECM" and "Caching.ExpiringCacheMap.HashECM".

-- 


module Caching.ExpiringCacheMap.Types (
    -- * Configuration

    CacheSettings(..),
    -- * Cache encapsulation

    ECM,
    CacheState,
    -- * Types

    TimeUnits,
    ECMMapSize,
    ECMULength,
    ECMIncr,
    -- * Types for state function

    ECMNewState,
    ECMEnterState,
    ECMReadState,
) where

import Caching.ExpiringCacheMap.Utils.Types
import Caching.ExpiringCacheMap.Internal.Types

data CacheSettings =
  -- | A cache that maintains a key access history list to perform removals

  -- of /least recently used/ entries. Once the key-value map reaches 

  -- 'removalsize' keys, then a list of keys to keep in the map is determined 

  -- which is no larger than 'mapsize' size. Entries are removed only on 

  -- insertion of a new entry in the key-value map.

  -- 

  -- Key access history entries are prepended to the head of the LRU list, 

  -- if an existing entry for the key appears close to the head of the list

  -- it is moved to the head of the list, instead of growing the list. When the 

  -- LRU list reaches 'compactlistsize' items, it is compacted by removing 

  -- duplicate keys, by keeping only the most recent accumulator value for 

  -- that key.

  --

  CacheWithLRUList {
    CacheSettings -> ECMMapSize
mapsize :: ECMMapSize,
    CacheSettings -> ECMMapSize
removalsize :: ECMMapSize,
    CacheSettings -> ECMMapSize
compactlistsize :: ECMULength
  }