(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 [func max-size canonicalizer] {:func func :lru (java.util.Collections/synchronizedMap (LRUMap. max-size)) :canonicalizer canonicalizer }) (defn get-keys [c keys] (let [f (:func c) lru (:lru c) keys (map (:canonicalizer c) keys) 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) ((:canonicalizer c) key))) (defn invalidate-key [c key] (.remove (:lru c) ((:canonicalizer c) key)) nil)