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