summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Ostler <scottbot9000@gmail.com>2011-02-13 20:03:06 -0500
committerScott Ostler <scottbot9000@gmail.com>2011-02-13 20:03:06 -0500
commitd59f06da8e56c511dfd573cce2d8382dc043def1 (patch)
tree11104c24cf8ca70344a2fd06da54d1f00e429c6c
parente3f0134f9d292165c12b2cdb062b4a0863c50289 (diff)
Add multikey_cache
-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)