diff options
| author | Scott Ostler <scottbot9000@gmail.com> | 2011-02-13 20:03:06 -0500 |
|---|---|---|
| committer | Scott Ostler <scottbot9000@gmail.com> | 2011-02-13 20:03:06 -0500 |
| commit | d59f06da8e56c511dfd573cce2d8382dc043def1 (patch) | |
| tree | 11104c24cf8ca70344a2fd06da54d1f00e429c6c | |
| parent | e3f0134f9d292165c12b2cdb062b4a0863c50289 (diff) | |
Add multikey_cache
| -rw-r--r-- | src/multikey_cache.clj | 30 |
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) |
