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)
|