Write alert system macro

This commit is contained in:
contrapunctus 2022-02-14 22:09:55 +05:30
parent 21c442069e
commit aee7453ff8
2 changed files with 68 additions and 0 deletions

View File

@ -3519,6 +3519,39 @@ Return value is a list as specified by `tabulated-list-entries'."
do (cl-incf index)))
;; rows:1 ends here
;; [[file:chronometrist.org::*define-alert-system][define-alert-system:1]]
(defmacro chronometrist-define-alert-system (extension initvalue &rest custom-args)
"Define an alerts system for EXTENSION.
Defines a custom variable `chronometrist-EXTENSION-alerts-alist'
with INITVALUE and CUSTOM-ARGS, a variable
`chronometrist-EXTENSION--timer-list', and a procedure
`chronometrist-EXTENSION-run-at-time'."
(let* ((prefix (format "chronometrist-%s" extension))
(custom-var (intern (format "%s-alerts-alist" prefix)))
(list-var (intern (format "%s--timer-alist" prefix)))
(function (intern (format "%s-run-at-time" prefix))))
`(progn
(defcustom ,custom-var ,initvalue
,(let ((docstring (format "Alist of alerts run by `%s'.
Each element must be in the form (SYMBOL FUNCTION ALERT-FN &rest ALERT-ARGS),
where SYMBOL uniquely identifies the alert,
FUNCTION is a function calling `%s' and ALERT-FN,
and ALERT-ARGS are passed to ALERT-FN."
prefix function)))
(with-temp-buffer
(insert docstring)
(fill-region (point-min) (point-max))
(buffer-substring-no-properties (point-min) (point-max))))
,@custom-args)
(defvar ,list-var nil ,(format "Alist of timers created for `%s'." prefix))
(defun ,function (time repeat function &rest args)
,(format "Like `run-at-time', but store timer objects in `%s'." ,list-var)
(cl-pushnew (apply #'run-at-time time repeat function args) ,list-var)))))
;; (chronometrist-define-alert-system foo nil)
;; define-alert-system:1 ends here
(provide 'chronometrist)
;;; chronometrist.el ends here

View File

@ -4757,6 +4757,41 @@ Return value is a list as specified by `tabulated-list-entries'."
do (cl-incf index)))
#+END_SRC
** Extension utilities
*** define-alert-system
#+BEGIN_SRC emacs-lisp
(defmacro chronometrist-define-alert-system (extension initvalue &rest custom-args)
"Define an alerts system for EXTENSION.
Defines a custom variable `chronometrist-EXTENSION-alerts-alist'
with INITVALUE and CUSTOM-ARGS, a variable
`chronometrist-EXTENSION--timer-list', and a procedure
`chronometrist-EXTENSION-run-at-time'."
(let* ((prefix (format "chronometrist-%s" extension))
(custom-var (intern (format "%s-alerts-alist" prefix)))
(list-var (intern (format "%s--timer-alist" prefix)))
(function (intern (format "%s-run-at-time" prefix))))
`(progn
(defcustom ,custom-var ,initvalue
,(let ((docstring (format "Alist of alerts run by `%s'.
Each element must be in the form (SYMBOL FUNCTION ALERT-FN &rest ALERT-ARGS),
where SYMBOL uniquely identifies the alert,
FUNCTION is a function calling `%s' and ALERT-FN,
and ALERT-ARGS are passed to ALERT-FN."
prefix function)))
(with-temp-buffer
(insert docstring)
(fill-region (point-min) (point-max))
(buffer-substring-no-properties (point-min) (point-max))))
,@custom-args)
(defvar ,list-var nil ,(format "Alist of timers created for `%s'." prefix))
(defun ,function (time repeat function &rest args)
,(format "Like `run-at-time', but store timer objects in `%s'." ,list-var)
(cl-pushnew (apply #'run-at-time time repeat function args) ,list-var)))))
;; (chronometrist-define-alert-system foo nil)
#+END_SRC
** Provide
#+BEGIN_SRC emacs-lisp :comments no
(provide 'chronometrist)