From 2d7b675a6c074c8d8ed48324de50553ecb5eb4ed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Feb 2017 04:53:55 -0500 Subject: [PATCH] Add core/autoload/memoize.el library --- core/autoload/memoize.el | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 core/autoload/memoize.el diff --git a/core/autoload/memoize.el b/core/autoload/memoize.el new file mode 100644 index 000000000..a7e95d090 --- /dev/null +++ b/core/autoload/memoize.el @@ -0,0 +1,32 @@ +;;; memoize.el +(provide 'core-lib-memoize) + +(defvar doom-memoized-table (make-hash-table :test 'equal) + "TODO") + +;;;###autoload +(defun doom-memoize (func) + "Memoize the given function." + (cl-typecase func + (symbol (put func 'function-documentation + (concat (documentation func) " (memoized)")) + (fset func (doom--memoize-wrap (symbol-function func))) + func) + (function (doom--memoize-wrap func)))) + +;;;###autoload +(defun doom--memoize-wrap (func) + "Return the memoized version of FUNC." + `(lambda (&rest args) + (or (gethash args doom-memoized-table) + (puthash args (apply ',func args) doom-memoized-table)))) + +;;;###autoload +(defmacro @def-memoized (name arglist &rest body) + "Create a memoize'd function. NAME, ARGLIST, DOCSTRING and BODY +have the same meaning as in `defun'." + (declare (indent defun) (doc-string 3)) + `(progn + (defun ,name ,arglist ,@body) + (doom-memoize ',name))) +