diff --git a/lisp/emacs-lisp/timer.el b/lisp/emacs-lisp/timer.el index 795554fec5..26c8426d3e 100644 --- a/lisp/emacs-lisp/timer.el +++ b/lisp/emacs-lisp/timer.el @@ -545,6 +545,22 @@ internal-timer-start-idle (dolist (timer timer-idle-list) (if (timerp timer) ;; FIXME: Why test? (setf (timer--triggered timer) nil)))) + + +(defmacro debounce (function secs) + "Postpone FUNCTION call until after SECS seconds have elapsed. +Return a debounced function that will postpone FUNCTION call +until after SECS seconds have elapsed since the last time +it was invoked." + (declare (indent 0) (debug t)) + (let ((timer-sym (make-symbol "timer"))) + `(let (,timer-sym) + (lambda (&rest args) + (when (timerp ,timer-sym) + (cancel-timer ,timer-sym)) + (setq ,timer-sym + (run-with-timer ,secs nil (lambda () (apply ,function args)))))))) + (provide 'timer)