summaryrefslogtreecommitdiff
path: root/src/multikey_cache.clj
blob: 74822a8eee774a6fa8c314aad77d6430d728f33a (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
(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 [f max-size]
  {:f    f
   :lru  (java.util.Collections/synchronizedMap (LRUMap. max-size))
   })

(defn get-keys [c keys]
  (let [f         (:f c)
        lru       (:lru c)
        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) key))

(defn invalidate-key [c key]
  (.remove (:lru c) key)
  nil)