This file is indexed.

/usr/share/doc/libghc-expiring-cache-map-doc/html/Caching-ExpiringCacheMap-HashECM.html is in libghc-expiring-cache-map-doc 0.0.6.1-3build3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Caching.ExpiringCacheMap.HashECM</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script src="file:///usr/share/javascript/mathjax/MathJax.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[
window.onload = function () {pageLoad();setSynopsis("mini_Caching-ExpiringCacheMap-HashECM.html");};
//]]>
</script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="src/Caching-ExpiringCacheMap-HashECM.html">Source</a></li><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">expiring-cache-map-0.0.6.1: General purpose simple caching.</p></div><div id="content"><div id="module-header"><table class="info"><tr><th valign="top">Copyright</th><td>(c) 2014 Edward L. Blake</td></tr><tr><th>License</th><td>BSD-style</td></tr><tr><th>Maintainer</th><td>Edward L. Blake &lt;edwardlblake@gmail.com&gt;</td></tr><tr><th>Stability</th><td>experimental</td></tr><tr><th>Portability</th><td>portable</td></tr><tr><th>Safe Haskell</th><td>Safe</td></tr><tr><th>Language</th><td>Haskell98</td></tr></table><p class="caption">Caching.ExpiringCacheMap.HashECM</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">Create cache</a></li><li><a href="#g:2">Request value from cache</a></li><li><a href="#g:3">Value request function state</a></li><li><a href="#g:4">Invalidate cache</a></li><li><a href="#g:5">List keys</a></li><li><a href="#g:6">Type</a></li></ul></div><div id="description"><p class="caption">Description</p><div class="doc"><p>A cache that holds values for a length of time that uses <code><a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a></code> keys
 with <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Strict.html">Data.HashMap.Strict</a>.</p><p>An example of creating a cache for accessing files:</p><pre>{-# LANGUAGE OverloadedStrings #-}

import Caching.ExpiringCacheMap.HashECM (newECMIO, lookupECM, CacheSettings(..), consistentDuration)

import qualified Data.Time.Clock.POSIX as POSIX (POSIXTime, getPOSIXTime)
import qualified Data.ByteString.Char8 as BS
import System.IO (withFile, IOMode(ReadMode))

example = do
  filecache &lt;- newECMIO
        (consistentDuration 100 -- Duration between access and expiry time of each item
          (\state id -&gt; do BS.putStrLn &quot;Reading a file again...&quot;
                           withFile (case id :: BS.ByteString of
                                       &quot;file1&quot; -&gt; &quot;file1.txt&quot;
                                       &quot;file2&quot; -&gt; &quot;file2.txt&quot;)
                              ReadMode $
                              \fh -&gt; do content &lt;- BS.hGetContents fh
                                        return $! (state, content)))
        (do time &lt;- POSIX.getPOSIXTime
            return (round (time * 100)))
        1 -- Time check frequency: (accumulator `mod` this_number) == 0.
        (CacheWithLRUList
          6     -- Expected size of key-value map when removing elements.
          6     -- Size of map when to remove items from key-value map.
          12    -- Size of list when to compact
          )
  
  -- Use lookupECM whenever the contents of &quot;file1&quot; is needed.
  b &lt;- lookupECM filecache &quot;file1&quot;
  BS.putStrLn b
  return ()
</pre></div></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><a href="#v:newECMIO">newECMIO</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s -&gt; k -&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a> (<a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a>, (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s, v))) -&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a> <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a> -&gt; <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMIncr">ECMIncr</a> -&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:CacheSettings">CacheSettings</a> -&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a> (<a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a> <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#t:MVar">MVar</a> s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v)</li><li class="src short"><a href="#v:newECMForM">newECMForM</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m1, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m2) =&gt; (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s -&gt; k -&gt; m1 (<a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a>, (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s, v))) -&gt; m1 <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a> -&gt; <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMIncr">ECMIncr</a> -&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:CacheSettings">CacheSettings</a> -&gt; <a href="Caching-ExpiringCacheMap-Internal-Types.html#t:ECMNewState">ECMNewState</a> m2 mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; <a href="Caching-ExpiringCacheMap-Internal-Types.html#t:ECMEnterState">ECMEnterState</a> m1 mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; <a href="Caching-ExpiringCacheMap-Internal-Types.html#t:ECMReadState">ECMReadState</a> m1 mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; m2 (<a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m1 mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v)</li><li class="src short"><a href="#v:consistentDuration">consistentDuration</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a> -&gt; (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s -&gt; k -&gt; m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s, v)) -&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s -&gt; k -&gt; m (<a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a>, (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s, v))</li><li class="src short"><a href="#v:lookupECM">lookupECM</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; k -&gt; m v</li><li class="src short"><a href="#v:getValReqState">getValReqState</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; k -&gt; m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s)</li><li class="src short"><a href="#v:invalidate">invalidate</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; k -&gt; m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> v)</li><li class="src short"><a href="#v:invalidateCache">invalidateCache</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (k, v))</li><li class="src short"><a href="#v:keysCached">keysCached</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; m [k]</li><li class="src short"><a href="#v:keysNotExpired">keysNotExpired</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; m [k]</li><li class="src short"><span class="keyword">data</span> <a href="#t:ECM">ECM</a> a b s m k v</li><li class="src short"><span class="keyword">data</span> <a href="#t:CacheSettings">CacheSettings</a> = <a href="#v:CacheWithLRUList">CacheWithLRUList</a> {<ul class="subs"><li><a href="#v:mapsize">mapsize</a> :: <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMMapSize">ECMMapSize</a></li><li><a href="#v:removalsize">removalsize</a> :: <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMMapSize">ECMMapSize</a></li><li><a href="#v:compactlistsize">compactlistsize</a> :: <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMULength">ECMULength</a></li></ul>}</li></ul></div><div id="interface"><h1 id="g:1">Create cache</h1><div class="top"><p class="src"><a id="v:newECMIO" class="def">newECMIO</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s -&gt; k -&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a> (<a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a>, (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s, v))) -&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a> <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a> -&gt; <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMIncr">ECMIncr</a> -&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:CacheSettings">CacheSettings</a> -&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a> (<a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a> <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#t:MVar">MVar</a> s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v) <a href="src/Caching-ExpiringCacheMap-HashECM.html#newECMIO" class="link">Source</a> <a href="#v:newECMIO" class="selflink">#</a></p><div class="doc"><p>Create a new expiring cache for retrieving uncached values via <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/System-IO.html#t:IO">IO</a></code>
 interaction (such as in the case of reading a file from disk), with 
 a shared state lock via an <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#t:MVar">MVar</a></code> to manage cache state.</p><p>Value request and time check request functions are provided as arguments.</p><p>The time check frequency value has to be 1 or higher, with higher values
 postponing time checks for longer periods of time.</p><p>A cache setting specifies how the cache should remove entries when the
 cache becomes a certain size. The only constructor for this is
 <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:CacheWithLRUList">CacheWithLRUList</a></code>.</p></div></div><div class="top"><p class="src"><a id="v:newECMForM" class="def">newECMForM</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m1, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m2) =&gt; (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s -&gt; k -&gt; m1 (<a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a>, (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s, v))) -&gt; m1 <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a> -&gt; <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMIncr">ECMIncr</a> -&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:CacheSettings">CacheSettings</a> -&gt; <a href="Caching-ExpiringCacheMap-Internal-Types.html#t:ECMNewState">ECMNewState</a> m2 mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; <a href="Caching-ExpiringCacheMap-Internal-Types.html#t:ECMEnterState">ECMEnterState</a> m1 mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; <a href="Caching-ExpiringCacheMap-Internal-Types.html#t:ECMReadState">ECMReadState</a> m1 mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; m2 (<a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m1 mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v) <a href="src/Caching-ExpiringCacheMap-HashECM.html#newECMForM" class="link">Source</a> <a href="#v:newECMForM" class="selflink">#</a></p><div class="doc"><p>Create a new expiring cache along arbitrary monads with provided
 functions to create cache state in <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a></code> m2, and modify and read
 cache state in <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a></code> m1.</p><p><code><a href="Caching-ExpiringCacheMap-HashECM.html#v:newECMIO">newECMIO</a></code> is just a wrapper to this function with <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#t:MVar">MVar</a></code> functions:</p><pre> newECMIO retr gettime timecheckmodulo cachesettings =
   newECMForM retr gettime timecheckmodulo cachesettings
     <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#v:newMVar">newMVar</a></code> <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#v:modifyMVar">modifyMVar</a></code> <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#v:readMVar">readMVar</a></code>
</pre><p>Value request and time check request functions are provided as arguments.</p><p>The time check frequency value has to be 1 or higher, with higher values
 postponing time checks for longer periods of time.</p><p>A cache setting specifies how the cache should remove entries when the
 cache becomes a certain size. The only constructor for this is
 <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:CacheWithLRUList">CacheWithLRUList</a></code>.</p></div></div><div class="top"><p class="src"><a id="v:consistentDuration" class="def">consistentDuration</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a> -&gt; (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s -&gt; k -&gt; m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s, v)) -&gt; <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s -&gt; k -&gt; m (<a href="Caching-ExpiringCacheMap-Utils-Types.html#t:TimeUnits">TimeUnits</a>, (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s, v)) <a href="src/Caching-ExpiringCacheMap-HashECM.html#consistentDuration" class="link">Source</a> <a href="#v:consistentDuration" class="selflink">#</a></p><div class="doc"><p>Used with <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:newECMIO">newECMIO</a></code> or <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:newECMForM">newECMForM</a></code> to provide a consistent duration for requested values.</p></div></div><h1 id="g:2">Request value from cache</h1><div class="top"><p class="src"><a id="v:lookupECM" class="def">lookupECM</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; k -&gt; m v <a href="src/Caching-ExpiringCacheMap-HashECM.html#lookupECM" class="link">Source</a> <a href="#v:lookupECM" class="selflink">#</a></p><div class="doc"><p>Request a value associated with a key from the cache.</p><ul><li>If the value is not in the cache, the value will be requested through the 
    function defined when the <code><a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a></code> value was created, its computation
    returned and the value stored in the cache state map.</li><li>If the value is in the cache and has not expired, it will be returned.</li><li>If the value is in the cache and a new time is computed in the same
    lookup, and the value has been determined to have since expired, it 
    will be discarded and a new value will be requested for this computation.</li></ul><p>Every <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:lookupECM">lookupECM</a></code> computation increments an accumulator in the cache state
 which is used to keep track of the succession of key accesses. Based on the
 parameters provided with the <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:CacheWithLRUList">CacheWithLRUList</a></code> constructor, this history 
 of key accesses is then used to remove entries from the cache back down to 
 a minimum size. Also, when the modulo of the accumulator and the modulo 
 value computes to 0, the time request function is invoked. In some cases the 
 accumulator may get incremented more than once in a <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:lookupECM">lookupECM</a></code> computation.</p><p>As the accumulator is a bound unsigned integer, when the accumulator
 increments back to 0, the cache state is completely cleared.</p><p>The time request function is invoked in one of two different conditions</p><ul><li>When a new key-value entry is requested, the current time is also
    requested during the same lookup, as a recent time determination is
    needed for a new entry in the key-value cache.</li><li>When the modulo of the accumulator and a specified value equals to 0.</li></ul><p>When the current time is determined during a lookup, access times of the
 entries in the key-value cache are compared with the new time to filter
 out expired entries from the key-value map.</p></div></div><h1 id="g:3">Value request function state</h1><div class="top"><p class="src"><a id="v:getValReqState" class="def">getValReqState</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; k -&gt; m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> s) <a href="src/Caching-ExpiringCacheMap-HashECM.html#getValReqState" class="link">Source</a> <a href="#v:getValReqState" class="selflink">#</a></p></div><h1 id="g:4">Invalidate cache</h1><div class="top"><p class="src"><a id="v:invalidate" class="def">invalidate</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; k -&gt; m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> v) <a href="src/Caching-ExpiringCacheMap-HashECM.html#invalidate" class="link">Source</a> <a href="#v:invalidate" class="selflink">#</a></p><div class="doc"><p>Invalidates a key from the cache and returns its value if any.
   Note that this is a sequential composition of a read and modify of the
   mutable cache container (e.g. <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#v:readMVar">readMVar</a></code> followed by <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#v:modifyMVar">modifyMVar</a></code>
   with <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:newECMIO">newECMIO</a></code> instances).</p></div></div><div class="top"><p class="src"><a id="v:invalidateCache" class="def">invalidateCache</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; m (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Maybe.html#t:Maybe">Maybe</a> (k, v)) <a href="src/Caching-ExpiringCacheMap-HashECM.html#invalidateCache" class="link">Source</a> <a href="#v:invalidateCache" class="selflink">#</a></p><div class="doc"><p>Invalidates the entire cache and returns the last key and value if any.
   Note that this is a sequential composition of a read and modify of the
   mutable cache container (e.g. <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#v:readMVar">readMVar</a></code> followed by <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#v:modifyMVar">modifyMVar</a></code>
   with <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:newECMIO">newECMIO</a></code> instances).</p></div></div><h1 id="g:5">List keys</h1><div class="top"><p class="src"><a id="v:keysCached" class="def">keysCached</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; m [k] <a href="src/Caching-ExpiringCacheMap-HashECM.html#keysCached" class="link">Source</a> <a href="#v:keysCached" class="selflink">#</a></p><div class="doc"><p>List of keys in the cache map without performing a time check, returning
   both stored keys that are expired and keys that are not expired. keys are
   in an unspecified order.</p></div></div><div class="top"><p class="src"><a id="v:keysNotExpired" class="def">keysNotExpired</a> :: (<a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Monad.html#t:Monad">Monad</a> m, <a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Data-Eq.html#t:Eq">Eq</a> k, <a href="file:///usr/share/doc/libghc-hashable-doc/html/Data-Hashable.html#t:Hashable">Hashable</a> k) =&gt; <a href="Caching-ExpiringCacheMap-HashECM.html#t:ECM">ECM</a> m mv s <a href="file:///usr/share/doc/libghc-unordered-containers-doc/html/Data-HashMap-Lazy.html#t:HashMap">HashMap</a> k v -&gt; m [k] <a href="src/Caching-ExpiringCacheMap-HashECM.html#keysNotExpired" class="link">Source</a> <a href="#v:keysNotExpired" class="selflink">#</a></p><div class="doc"><p>List of keys in the cache map that are not expired values. A time check
   is always performed to compare with the elapsed time left with each key.
   The cache state is not modified and the time check is not performed from
   within a modifying state context, e.g. not within <code><a href="file:///usr/share/doc/ghc-doc/html/libraries/base-4.9.1.0/Control-Concurrent-MVar.html#v:modifyMVar">modifyMVar</a></code> with a 
   <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:newECMIO">newECMIO</a></code> instance. Keys are in an unspecified order. </p></div></div><h1 id="g:6">Type</h1><div class="top"><p class="src"><span class="keyword">data</span> <a id="t:ECM" class="def">ECM</a> a b s m k v <a href="src/Caching-ExpiringCacheMap-Internal-Types.html#ECM" class="link">Source</a> <a href="#t:ECM" class="selflink">#</a></p><div class="doc"><p>The type that encapsulates a cache map.</p></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a id="t:CacheSettings" class="def">CacheSettings</a> <a href="src/Caching-ExpiringCacheMap-Types.html#CacheSettings" class="link">Source</a> <a href="#t:CacheSettings" class="selflink">#</a></p><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a id="v:CacheWithLRUList" class="def">CacheWithLRUList</a></td><td class="doc"><p>A cache that maintains a key access history list to perform removals
 of <em>least recently used</em> entries. Once the key-value map reaches 
 <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:removalsize">removalsize</a></code> keys, then a list of keys to keep in the map is determined 
 which is no larger than <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:mapsize">mapsize</a></code> size. Entries are removed only on 
 insertion of a new entry in the key-value map.</p><p>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 <code><a href="Caching-ExpiringCacheMap-HashECM.html#v:compactlistsize">compactlistsize</a></code> items, it is compacted by removing 
 duplicate keys, by keeping only the most recent accumulator value for 
 that key.</p></td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><ul><li><dfn class="src"><a id="v:mapsize" class="def">mapsize</a> :: <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMMapSize">ECMMapSize</a></dfn><div class="doc empty">&nbsp;</div></li><li><dfn class="src"><a id="v:removalsize" class="def">removalsize</a> :: <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMMapSize">ECMMapSize</a></dfn><div class="doc empty">&nbsp;</div></li><li><dfn class="src"><a id="v:compactlistsize" class="def">compactlistsize</a> :: <a href="Caching-ExpiringCacheMap-Utils-Types.html#t:ECMULength">ECMULength</a></dfn><div class="doc empty">&nbsp;</div></li></ul></div></td></tr></table></div></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.17.3</p></div></body></html>