v0.2.0
[8sync.git] / 8sync / agenda.scm
index f20fffe889507a936a1e13df3d70f51c82c5a2ac..e747899a93f054865a319fdd4eef55d267e29b52 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.
 ;;;
@@ -72,6 +72,7 @@
             8sync-run 8sync-run-at 8sync-run-delay
             8sync-port 8sync-port-remove
             8sync-nowait
+            8sleep
             
             catch-8sync
 
@@ -617,6 +618,11 @@ forge ahead in our current function!"
        (else (raise '8sync-caught-error
                     orig-key orig-args orig-stacks))))))
 
+;; This is sugar... and could probably be considerably
+;; simplified and optimized.  But whatever.
+(define-syntax-rule (8sleep time)
+  (8sync-delay 'no-op time))
+
 
 \f
 ;;; Execution of agenda, and current agenda
@@ -745,7 +751,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))
@@ -754,6 +762,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