add true-after-n-times to tests file
[8sync.git] / loopy.scm
index 70d2d08ba7e2b42083452a3d5f30e8fe8f93f508..2f733c01d4fe32afa21641bc456c37efc4f0f171 100644 (file)
--- a/loopy.scm
+++ b/loopy.scm
@@ -90,7 +90,7 @@
 
 ;;; This is where we handle timed events for the future
 
-;; This section totally borrows from SICP
+;; This section totally borrows from the ideas in SICP
 ;; <3 <3 <3
 
 ;; NOTE: time is a cons of (seconds . microseconds)
 ;;   mutates AND is worst case of O(n) in both space and time :(
 ;;   but at least it'll be reasonably easy to refactor to
 ;;   a more functional setup?
-(define (schedule-add! time proc schedule)
+(define (schedule-add! schedule time proc)
   (let ((time (time-segment-right-format time)))
     (define (new-time-segment)
       (let ((new-segment
@@ -336,11 +336,21 @@ based on the results"
              (proc-result (call-proc proc))
              (enqueue
               (lambda (run-request)
-                (cond
-                 ((run-request-when run-request)
-                  (error "TODO"))
-                 (else
-                  (enq! next-queue (run-request-proc run-request)))))))
+                (define (schedule-at! time proc)
+                  (schedule-add! (agenda-schedule agenda) time proc))
+                (let ((request-time (run-request-when run-request)))
+                  (match request-time
+                    ((? time-delta? time-delta)
+                     (let ((time (time-+ (agenda-time agenda)
+                                         time-delta)))
+                       (schedule-at! time (run-request-proc proc))))
+                    ((? integer? sec)
+                     (let ((time (cons sec 0)))
+                       (schedule-at! time (run-request-proc proc))))
+                    (((? integer? sec) . (? integer? usec))
+                     (schedule-at! request-time (run-request-proc proc)))
+                    (#f
+                     (enq! next-queue (run-request-proc run-request))))))))
         ;; @@: We might support delay-wrapped procedures here
         (match proc-result
           ;; TODO: replace procedure with something that indicates
@@ -354,6 +364,7 @@ based on the results"
             new-procs))
           ;; do nothing
           (_ #f))))
-    ;; TODO: Selecting on ports would happen here?
+    ;; TODO: Alternately, we could return the next-queue
+    ;;   along with changes to be added to the schedule here?
     ;; Return new agenda, with next queue set
     (set-field agenda (agenda-queue) next-queue)))