a memo library as a replacement for memoizations in Cumulo and Respo. It's mainly experimental.
[cumulo/memof "0.2.3"]
(defonce *states (atom (memof.core/new-caches {}))) ; pass GC options
(defn f1 [x y] (* x y))
(memof.core/write-record! *states f1 [1 2] 3)
(memof.core/access-record *states f1 [1 2]) ; returns 3
(memof.core/new-loop! *states) ; when loop is large enough, it will trigger GC
A short hand for using it:
memof.alias/memof-call f ([] 1 2) 3
; handle this at first on reload!
memof.alias/reset-calling-caches!
; increment calling loop
memof.alias/tick-calling-loop!
States structure:
{
:loop 0 ; counter
:entries { ; where entries are stored
f1 {
:hit-times 1, :missed-times 1
:records {
[p1 p2] {:value 1, :hit-times 1, :last-hit-loop 1, :initial-loop 1}
}
}
}
:gc { ; configurations
:trigger-loop 100, ; trigger GC every N loops
:elapse-loop 50 ; entries are considered unuseful after not used for N loops
}
}
Methods:
(new-states)
creates states holding all entries(show-summary @*states)
list entries after formatted(write-record! *states f params value)
write to cache,params
supposed to be a collection(access-record *states f params)
access and return value(ornil
)(new-loop! *states)
loop and trigger actions(perform-gc! *states)
remove entries that are probably no longer useful(reset-entries! *states)
clear entries(modify-gc-options! *states {})
modify GC options
By designed, it supposed to be used behind macros:
(defmacro defcomp [x params & body]
(let [com-helper (gensym (str x "-helper-"))]
`(do
(defn ~com-helper [~@params] ~@body)
(defn ~x [~@params] (call-comp-helper ~com-helper [~@params])))))
(defn call-comp-helper [f params]
(let [v (memof/access-cache *states f params)]
(if (some? v)
v
(let [result (apply f params)]
(memof/write-cache! *states f x params result) result))))
By default, only GC logs will be emitted. To turn on vervose logs,
- browsers,
localStorage.setItem("memofVergose", "true")
- Node.js ,
memofVerbose=true node app.js
https://github.com/mvc-works/calcit-nodejs-workflow
MIT