branch: externals/consult
commit 725aeef647ca5d540ff4a4d71616d877ef6ac9f6
Author: Daniel Mendler <m...@daniel-mendler.de>
Commit: Daniel Mendler <m...@daniel-mendler.de>

    Simplify consult--dynamic-compute
---
 consult.el | 65 +++++++++++++++++++++++++-------------------------------------
 1 file changed, 26 insertions(+), 39 deletions(-)

diff --git a/consult.el b/consult.el
index a6c271d652..b76d51db90 100644
--- a/consult.el
+++ b/consult.el
@@ -2378,49 +2378,36 @@ highlighting function."
 
 ;;;; Dynamic collections based
 
-(defun consult--dynamic-compute (async fun &optional debounce min-input)
+(defun consult--dynamic-compute (async fun)
   "Dynamic computation of candidates.
 ASYNC is the sink.
-FUN computes the candidates given the input.
-DEBOUNCE is the time after which an interrupted computation should be
-restarted and defaults to `consult-async-input-debounce'.
-MIN-INPUT is the minimal input length and defaults to
-`consult-async-min-input'."
-  (setq debounce (or debounce consult-async-input-debounce)
-        min-input (or min-input consult-async-min-input))
-  (let* ((request) (current) (timer)
-         (cancel (lambda () (when timer (cancel-timer timer) (setq timer 
nil))))
-         (start (lambda (req) (setq request req) (funcall async 'refresh))))
+FUN computes the candidates given the input."
+  (let (request current)
     (lambda (action)
       (pcase action
-        ((and 'nil (guard (not request)))
-         (funcall async nil))
         ('nil
-         (funcall cancel)
-         (let ((state 'killed))
-           (unwind-protect
-               (progn
-                 (funcall async 'indicator 'running)
-                 (redisplay)
-                 ;; Run computation
-                 (let ((response (funcall fun request)))
-                   ;; Flush and update candidate list
-                   (funcall async 'flush)
-                   (setq state 'finished current request)
-                   (funcall async response)))
-             (funcall async 'indicator state)
-             ;; If the computation was killed, restart it after some time.
-             (when (eq state 'killed)
-               (setq timer (run-at-time debounce nil start request)))
-             (setq request nil))))
+         ;; Perform the computation when the candidates are requested,
+         ;; since then the computation can be interrupted by the completion UI.
+         (when request
+           (let ((state 'killed))
+             (unwind-protect
+                 (progn
+                   (funcall async 'indicator 'running)
+                   (redisplay)
+                   ;; Run computation
+                   (let ((response (funcall fun request)))
+                     ;; Flush and update candidate list
+                     (funcall async 'flush)
+                     (funcall async response)
+                     (setq state 'finished current request request nil)))
+               (funcall async 'indicator state))))
+         (funcall async nil))
         ((pred stringp)
-         (funcall cancel)
-         (if (or (length< action min-input) (equal action current))
-             (funcall async 'indicator 'finished)
-           (funcall start action)))
-        ((or 'destroy 'cancel)
-         (funcall cancel)
-         (funcall async action))
+         (unless (equal action current)
+           ;; Do not perform the computation immediately, only when the
+           ;; candidates are requested.
+           (setq request action)
+           (funcall async 'refresh)))
         (_ (funcall async action))))))
 
 (defun consult--dynamic-collection (fun &optional debounce min-input)
@@ -2429,8 +2416,8 @@ See `consult--dynamic-compute' for the arguments FUN, 
DEBOUNCE and MIN-INPUT."
   (thread-first
     (consult--async-sink)
     (consult--async-indicator)
-    (consult--dynamic-compute fun debounce min-input)
-    (consult--async-throttle)
+    (consult--dynamic-compute fun)
+    (consult--async-throttle nil debounce)
     (consult--async-split nil min-input)))
 
 ;;;; Special keymaps

Reply via email to