branch: externals/plz
commit 269988094bff67f094c3692db37a7ecf638ad062
Author: Adam Porter <a...@alphapapa.net>
Commit: Adam Porter <a...@alphapapa.net>

    Add: (plz-queue-finally)
---
 README.org        |  3 ++-
 plz.el            | 15 ++++++++++-----
 tests/test-plz.el | 16 +++++++++++-----
 3 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/README.org b/README.org
index 08fc387eda..1bb52c5ee0 100644
--- a/README.org
+++ b/README.org
@@ -175,7 +175,8 @@ You may also clear a queue with ~plz-clear~, which cancels 
any active or queued
 
 ** 0.5-pre
 
-Nothing new yet.
+*Additions*
++ Struct ~plz-queue~'s ~finally~ slot, a function called when the queue is 
finished.
 
 ** 0.4
 
diff --git a/plz.el b/plz.el
index b8d24f71df..07843d6247 100644
--- a/plz.el
+++ b/plz.el
@@ -502,6 +502,8 @@ default, it's FIFO).  Use functions `plz-queue', `plz-run', 
and
             :documentation "Queued requests.")
   (canceled-p nil
               :documentation "Non-nil when queue has been canceled.")
+  (finally nil
+           :documentation "Function called after queue has been emptied or 
canceled.")
   first-active last-active
   first-request last-request)
 
@@ -618,15 +620,17 @@ QUEUE should be a `plz-queue' structure."
           (setf args (plist-put args :timeout timeout)))
         (setf (plz-queued-request-process request) (apply #'plz args))
         (push request (plz-queue-active queue))))
+    (funcall (plz-queue-finally queue))
     queue))
 
 (defun plz-clear (queue)
   "Clear QUEUE and return it.
-Cancels any active or pending requests.  For pending requests,
-their ELSE functions will be called with a `plz-error' structure
-with the message, \"`plz' queue cleared; request canceled.\";
-active requests will have their curl processes killed and their
-ELSE functions called with the corresponding data."
+Cancels any active or pending requests and calls the queue's
+FINALLY function.  For pending requests, their ELSE functions
+will be called with a `plz-error' structure with the message,
+\"`plz' queue cleared; request canceled.\"; active requests will
+have their curl processes killed and their ELSE functions called
+with the corresponding data."
   (setf (plz-queue-canceled-p queue) t)
   (dolist (request (plz-queue-active queue))
     (kill-process (plz-queued-request-process request))
@@ -635,6 +639,7 @@ ELSE functions called with the corresponding data."
     (funcall (plz-queued-request-else request)
              (make-plz-error :message "`plz' queue cleared; request 
canceled."))
     (setf (plz-queue-requests queue) (delq request (plz-queue-requests 
queue))))
+  (funcall (plz-queue-finally queue))
   (setf (plz-queue-first-active queue) nil
         (plz-queue-last-active queue) nil
         (plz-queue-first-request queue) nil
diff --git a/tests/test-plz.el b/tests/test-plz.el
index 523b5dd241..6c06ef03dc 100644
--- a/tests/test-plz.el
+++ b/tests/test-plz.el
@@ -508,10 +508,13 @@
 ;; TODO: Test that limit is enforced (though it seems to work fine).
 
 (plz-deftest plz-queue ()
-  (let ((queue (make-plz-queue :limit 2))
-        (urls '("https://httpbin.org/get?foo=0";
-                "https://httpbin.org/get?foo=1";))
-        completed-urls)
+  (let* ((finally-called nil)
+         (queue (make-plz-queue :limit 2
+                                :finally (lambda ()
+                                           (setf finally-called t))))
+         (urls '("https://httpbin.org/get?foo=0";
+                 "https://httpbin.org/get?foo=1";))
+         completed-urls)
     (dolist (url urls)
       (plz-queue queue
         'get url :then (lambda (_)
@@ -523,7 +526,10 @@
                   (sleep-for 0.1)
                   (cl-incf waits)))
     (and (seq-set-equal-p urls completed-urls)
-         (zerop (plz-length queue)))))
+         (zerop (plz-length queue))
+         finally-called)))
+
+;; TODO: Add test for canceling queue.
 
 ;;;; Footer
 

Reply via email to