summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/multikey_cache.clj30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/multikey_cache.clj b/src/multikey_cache.clj
new file mode 100644
index 0000000..74822a8
--- /dev/null
+++ b/src/multikey_cache.clj
@@ -0,0 +1,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)