X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=loopy.scm;h=01c0b52110d1615648242b9672259479bf7ef350;hb=1b92ec2ba2bcb0aed0e519c558cd2d0a848d8701;hp=68dc0c1a843abd83c602668512413b7f5d66d8af;hpb=38f30fa607340ea204900f022ee606feca5f12cb;p=8sync.git diff --git a/loopy.scm b/loopy.scm index 68dc0c1..01c0b52 100644 --- a/loopy.scm +++ b/loopy.scm @@ -1,4 +1,4 @@ -(define-module (loopy agenda) +(define-module (eightsync agenda) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-9 gnu) @@ -33,10 +33,17 @@ schedule-segments-split schedule-extract-until! add-segments-contents-to-queue! + %sync 8sync %sync-at 8sync-at %sync-delay 8sync-delay + make-run-request run-request? run-request-proc run-request-when + + make-port-request port-request? + port-request-port + port-request-read port-request-write port-request-except + run-it wrap run run-at run-delay %current-agenda @@ -325,7 +332,7 @@ Will produce (0 . 0) instead of a negative number, if needed." ;;; Request to run stuff ;;; ==================== -(define-immutable-record-type +(define-record-type (make-run-request proc when) run-request? (proc run-request-proc) @@ -357,6 +364,23 @@ Will produce (0 . 0) instead of a negative number, if needed." (make-run-request (wrap body ...) (tdelta delay-time))) +;; A request to set up a port with at least one of read, write, except +;; handling processes + +(define-record-type + (make-port-request-intern port read write except) + port-request? + (port port-request-port) + (read port-request-read) + (write port-request-write) + (except port-request-except)) + +(define* (make-port-request port #:key read write except) + (if (not (or read write except)) + (throw 'no-port-handler-given "No port handler given.\n")) + (make-port-request-intern port read write except)) + + ;;; Asynchronous escape to run things ;;; ================================= @@ -394,9 +418,12 @@ Will produce (0 . 0) instead of a negative number, if needed." Pronounced `async' despite the spelling. -8sync was chosen because (async) was already taken and could lead to +%sync was chosen because (async) was already taken and could lead to errors, and this version of asynchronous code uses a prompt, so the `a' -character becomes a `%' prompt :)" +character becomes a `%' prompt! :) + +The % and 8 characters kind of look similar... hence this library's +name! (There are 8sync aliases if you prefer that name.)" (abort-to-prompt (current-agenda-prompt) (wrap body) args ...)) @@ -413,6 +440,19 @@ character becomes a `%' prompt :)" #:when (tdelta delay-time) args ...)) +(define-syntax-rule (8sync args ...) + "Alias for %sync" + (%sync args ...)) + +(define-syntax-rule (8sync-at args ...) + "Alias for %sync-at" + (%sync-at args ...)) + +(define-syntax-rule (8sync-delay args ...) + "Alias for %sync-delay" + (8sync-delay args ...)) + + ;;; Execution of agenda, and current agenda ;;; ======================================= @@ -494,6 +534,17 @@ character becomes a `%' prompt :)" (update-agenda) agenda)) +(define (agenda-handle-port-request! agenda port-request) + "Update an agenda for a port-request" + (define (handle-selector request-selector port-map-selector) + (if (request-selector port-request) + (hash-set! (port-map-selector agenda) + (port-request-port port-request) + (request-selector port-request)))) + (handle-selector port-request-read agenda-read-port-map) + (handle-selector port-request-write agenda-write-port-map) + (handle-selector port-request-except agenda-except-port-map)) + (define* (start-agenda agenda #:key stop-condition @@ -561,19 +612,21 @@ based on the results" (schedule-at! request-time (run-request-proc run-request))) (#f (enq! next-queue (run-request-proc run-request)))))))) + (define (handle-individual result) + (match result + ((? run-request? new-proc) + (enqueue new-proc)) + ((? port-request? port-request) + (agenda-handle-port-request! agenda port-request)) + ;; do nothing + (_ #f))) ;; @@: We might support delay-wrapped procedures here (match proc-result ;; TODO: replace procedure with something that indicates ;; intent to run. Use a (run foo) procedure - ((? run-request? new-proc) - (enqueue new-proc)) - (((? run-request? new-procs) ...) - (for-each - (lambda (new-proc) - (enqueue new-proc)) - new-procs)) - ;; do nothing - (_ #f)))) + ((results ...) + (for-each handle-individual results)) + (one-result (handle-individual one-result))))) ;; 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