Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
(defn- stateful-memoize
[f #^java.util.Map map]
(fn [& args]
(if-let [e (find map args)]
(val e)
(let [ret (apply f args)]
(.put map args ret)
(defn weak-memoize
"Same as memoize, but uses a WeakHashMap for storing argument keys and result values.
**Be aware of what this entails for persistence of values: lose your keys, and
the associated value may get recalculated**"
(stateful-memoize f (java.util.WeakHashMap.)))
(defn lru-map
(proxy [java.util.LinkedHashMap] []
(removeEldestEntry [entry]
(> (.size #^java.util.Map this) max-size))))
(defn lru-memoize
"Same as memoize, but uses a LinkedHashMap-based LRU cache to ensure that a maximum of
max-size entries are held at any time."
[f max-size]
(stateful-memoize f (lru-map max-size)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment