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