blob: ac462ca3d31ae614040f76d4229dd22f5776af91 (
plain)
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
|
(ns multikey-cache
(:import java.util.Collections
org.apache.commons.collections.map.LRUMap)
(:use clojure.contrib.seq-utils
cache-dot-clj.cache
))
(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 (: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))]
(.put lru k v)))
(map #(.get lru %) keys)))
(defn get-key [c key]
(first (get-keys c [key])))
(defn has-key [c key]
(.containsKey (:lru c)
((:canonicalizer c) key)))
(defn invalidate-key [c key]
(.remove (:lru c) ((:canonicalizer c) key))
nil)
|