agenda: Permit a post-run-hook in start-agenda.
[8sync.git] / 8sync / agenda.scm
index 195b23a300354bd183ffe4d2e8b3251b908c27d9..05a999617db1d29173678e6217af0a406a3ebd45 100644 (file)
@@ -1,5 +1,5 @@
 ;;; 8sync --- Asynchronous programming for Guile
-;;; Copyright (C) 2015 Christopher Allan Webber <cwebber@dustycloud.org>
+;;; Copyright (C) 2015, 2016 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;;
 ;;; This file is part of 8sync.
 ;;;
@@ -71,6 +71,7 @@
             8sync 8sync-delay
             8sync-run 8sync-run-at 8sync-run-delay
             8sync-port 8sync-port-remove
+            8sync-nowait
             
             catch-8sync
 
@@ -593,7 +594,7 @@ Possibly specify WHEN as the second argument."
 
 ;; TODO: Write (%run-immediately)
 
-(define-syntax-rule (8sync-immediate body)
+(define-syntax-rule (8sync-nowait body)
   "Run body asynchronously but ignore its result...
 forge ahead in our current function!"
   (8sync-abort-to-prompt
@@ -602,7 +603,7 @@ forge ahead in our current function!"
       (list (make-run-request
              ;; See comment in 8sync-port
              (wrap (kont #f)) #f)
-            (make-run-request body #f))))))
+            (make-run-request (lambda () body) #f))))))
 
 (define-syntax-rule (catch-8sync exp (handler-key handler) ...)
   (catch '8sync-caught-error
@@ -744,7 +745,9 @@ Also handles sleeping when all we have to do is wait on the schedule."
                        ;;   the default stop-condition?
                        (stop-condition stop-on-nothing-to-do)
                        (get-time gettimeofday)
-                       (handle-ports update-agenda-from-select!))
+                       (handle-ports update-agenda-from-select!)
+                       ;; For live hacking madness, etc
+                       (post-run-hook #f))
   ;; TODO: Document fields
   "Start up the AGENDA"
   (let loop ((agenda agenda))
@@ -753,6 +756,11 @@ Also handles sleeping when all we have to do is wait on the schedule."
            ;;   select'ing on ports.
            ;;   We could compose over agenda-run-once and agenda-read-ports
            (agenda-run-once agenda)))
+      ;; @@: This relies on mutation at present on the queue, in the rare
+      ;;   event it's used.  If we ever switch to something more immutable,
+      ;;   it should return a new modified agenda instead.
+      (if post-run-hook
+          (post-run-hook agenda))
       (if (and stop-condition (stop-condition agenda))
           'done
           (let* ((agenda