Skip to content

Instantly share code, notes, and snippets.

@bendlas
Created January 15, 2012 16:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bendlas/1616417 to your computer and use it in GitHub Desktop.
Save bendlas/1616417 to your computer and use it in GitHub Desktop.
(defn jit-memoize [query-fn]
(let [cache-agent (agent {})]
(letfn
[(add-listener [queries parameter callback]
(if-let [listeners (queries parameter)]
(assoc queries parameter
(cons callback listeners))
(add-query queries parameter callback)))
(add-query [queries parameter callback]
(future (send cache-agent
deliver-result parameter
(try (query-fn parameter)
(catch Exception e
[::error e]))))
(assoc queries parameter (cons callback nil)))
(deliver-result [queries parameter value]
(future-call
dorun (map #(try (% value)
(catch Exception e
(log/error e "When delivering result" value
"for (" query-fn parameter ")")))
(queries parameter)))
(dissoc queries parameter))]
(fn query
([parameter]
(let [result (promise)]
(query parameter
#(deliver result %)
#(deliver result [::error %]))
(match @result
[::error ex] (throw ex)
val val)))
([parameter on-result on-error]
(send cache-agent add-listener parameter
#(match %
[::error ex] (on-error ex)
val (on-result)))
nil)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment