diff options
author | mattkae <mattkae@protonmail.com> | 2022-05-11 09:23:58 -0400 |
---|---|---|
committer | mattkae <mattkae@protonmail.com> | 2022-05-11 09:23:58 -0400 |
commit | 3f4a0d5370ae6c34afe180df96add3b8522f4af1 (patch) | |
tree | ae901409e02bde8ee278475f8cf6818f8f680a60 /elpa/skewer-mode-20200304.1142/cache-table.el |
initial commit
Diffstat (limited to 'elpa/skewer-mode-20200304.1142/cache-table.el')
-rw-r--r-- | elpa/skewer-mode-20200304.1142/cache-table.el | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/elpa/skewer-mode-20200304.1142/cache-table.el b/elpa/skewer-mode-20200304.1142/cache-table.el new file mode 100644 index 0000000..c3b2448 --- /dev/null +++ b/elpa/skewer-mode-20200304.1142/cache-table.el @@ -0,0 +1,66 @@ +;;; cache-table.el --- a hash table with expiring entries -*- lexical-binding: t; -*- + +;; This is free and unencumbered software released into the public domain. + +;; Author: Christopher Wellons <mosquitopsu@gmail.com> +;; Version: 1.0 + +;;; Commentary: + +;; See the docstring of `cache-table-create'. There is no +;; `cache-table-put': use `setf' on `cache-table-get' instead. + +;;; Code: + +(require 'cl-lib) + +(cl-defstruct (cache-table (:constructor cache-table--create)) + "A cache table with expiring entries." + expire-time table) + +(defun cache-table-create (expire-time &rest keyword-args) + "Create a new cache-table with entries automatically removed +from the table after EXPIRE-TIME seconds. This function accepts +the same keyword arguments as `make-hash-table'. Entries are not +actually removed from the cache-table until an access is made to +the cache-table. + +Use `cache-table-get' to get and put (via setf) entries." + (cache-table--create :expire-time expire-time + :table (apply #'make-hash-table keyword-args))) + +(defun cache-table-clear-expired (cache-table) + "Remove all expired entries from CACHE-TABLE." + (cl-loop with expire-time = (cache-table-expire-time cache-table) + with table = (cache-table-table cache-table) + with dead-time = (- (float-time) expire-time) + for key being the hash-keys of table using (hash-value entry) + for (time . value) = entry + when (< time dead-time) do (remhash key table))) + +(defun cache-table-get (key cache-table &optional default) + "Access the value for KEY in CACHE-TABLE if it has not yet +expired. Behaves just like `gethash'." + (cache-table-clear-expired cache-table) + (cdr (gethash key (cache-table-table cache-table) (cons 0 default)))) + +(gv-define-setter cache-table-get (value key cache-table) + "Put an entry in the hash table, like (setf (gethash key table) value)." + `(progn + (cache-table-clear-expired ,cache-table) + (puthash ,key (cons (float-time) ,value) + (cache-table-table ,cache-table)))) + +(defun cache-table-map (f cache-table) + "Like `maphash', call F for all non-expired entries in CACHE-TABLE." + (cache-table-clear-expired cache-table) + (maphash (lambda (k v) (funcall f k (cdr v))) + (cache-table-table cache-table))) + +(defun cache-table-count (cache-table) + "Like `hash-table-count', count the number of non-expired entries." + (hash-table-count (cache-table-table cache-table))) + +(provide 'cache-table) + +;;; cache-table.el ends here |