From d59f06da8e56c511dfd573cce2d8382dc043def1 Mon Sep 17 00:00:00 2001 From: Scott Ostler Date: Sun, 13 Feb 2011 20:03:06 -0500 Subject: Add multikey_cache --- src/multikey_cache.clj | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/multikey_cache.clj (limited to 'src/multikey_cache.clj') 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) -- cgit v1.2.3-70-g09d2