summaryrefslogtreecommitdiff
path: root/src/multikey_cache.clj
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)