summaryrefslogtreecommitdiff
path: root/src/multikey_cache.clj
diff options
context:
space:
mode:
authorScott Ostler <scottbot9000@gmail.com>2011-02-21 23:28:46 -0500
committerScott Ostler <scottbot9000@gmail.com>2011-02-21 23:28:46 -0500
commitd6c8d8ab019721ba47a289de97c95e9786dd5ded (patch)
treefbafe9199d175250477f3881f5b5e5808df81df8 /src/multikey_cache.clj
parentf2525430e94460085f369a526986b2b0a176b99f (diff)
sostler add favorite to frontpage
Diffstat (limited to 'src/multikey_cache.clj')
-rw-r--r--src/multikey_cache.clj15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/multikey_cache.clj b/src/multikey_cache.clj
index 74822a8..ac462ca 100644
--- a/src/multikey_cache.clj
+++ b/src/multikey_cache.clj
@@ -5,14 +5,16 @@
cache-dot-clj.cache
))
-(defn multikey-lru-cache [f max-size]
- {:f f
- :lru (java.util.Collections/synchronizedMap (LRUMap. max-size))
+(defn multikey-lru-cache [func max-size canonicalizer]
+ {:func func
+ :lru (java.util.Collections/synchronizedMap (LRUMap. max-size))
+ :canonicalizer canonicalizer
})
(defn get-keys [c keys]
- (let [f (:f c)
+ (let [f (:func c)
lru (:lru c)
+ keys (map (:canonicalizer c) keys)
uncached (filter (complement #(.containsKey lru %)) keys)]
(when-not (empty? uncached)
(doseq [[k v] (map list uncached (f uncached))]
@@ -23,8 +25,9 @@
(first (get-keys c [key])))
(defn has-key [c key]
- (.containsKey (:lru c) key))
+ (.containsKey (:lru c)
+ ((:canonicalizer c) key)))
(defn invalidate-key [c key]
- (.remove (:lru c) key)
+ (.remove (:lru c) ((:canonicalizer c) key))
nil)