projects
/
8sync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
maybe use pfds instead??
[8sync.git]
/
loopy.scm
diff --git
a/loopy.scm
b/loopy.scm
index 0f6edc569d5f3a02768096ab05c666816815d4d2..a77b7927d835886527c999168a6d5dfd1b87a195 100644
(file)
--- a/
loopy.scm
+++ b/
loopy.scm
@@
-4,35
+4,52
@@
(ice-9 match))
;; @@: Using immutable agendas here, so wouldn't it make sense to
(ice-9 match))
;; @@: Using immutable agendas here, so wouldn't it make sense to
-;; replace this
+;; replace this
queue stuff with using pfds based immutable queues?
(define-immutable-record-type <agenda>
(define-immutable-record-type <agenda>
- (make-agenda-intern queue)
+ (make-agenda-intern queue
prompt-tag
)
agenda?
agenda?
- (queue agenda-queue))
+ (queue agenda-queue)
+ (prompt-tag agenda-prompt-tag))
-(define* (make-agenda #:key (queue (make-q)))
- (make-agenda-intern queue))
+(define (make-async-prompt-tag)
+ (make-prompt-tag "prompt"))
+
+(define* (make-agenda #:key
+ (queue (make-q))
+ (prompt (make-prompt-tag)))
+ (make-agenda-intern queue prompt))
(define %current-agenda (make-parameter #f))
(define* (start-agenda agenda #:optional stop-condition)
(let loop ((agenda agenda))
(define %current-agenda (make-parameter #f))
(define* (start-agenda agenda #:optional stop-condition)
(let loop ((agenda agenda))
- (let ((new-agenda
+ (let ((new-agenda
+ ;; @@: Hm, maybe here would be a great place to handle
+ ;; select'ing on ports.
+ ;; We could compose over agenda-run-once and agenda-read-ports
(parameterize ((%current-agenda agenda))
(agenda-run-once agenda))))
(parameterize ((%current-agenda agenda))
(agenda-run-once agenda))))
- (if (and stop-condition (stop-condition))
+ (if (and stop-condition (stop-condition
agenda
))
'done
(loop new-agenda)))))
(define (agenda-run-once agenda)
"Run once through the agenda, and produce a new agenda
based on the results"
'done
(loop new-agenda)))))
(define (agenda-run-once agenda)
"Run once through the agenda, and produce a new agenda
based on the results"
+ (define (call-proc proc)
+ (call-with-prompt
+ (agenda-prompt-tag agenda)
+ (lambda ()
+ (proc))
+ ;; TODO
+ (lambda (k) k)))
+
(let ((queue (agenda-queue agenda))
(next-queue (make-q)))
(while (not (q-empty? queue))
(let* ((proc (q-pop! queue))
(let ((queue (agenda-queue agenda))
(next-queue (make-q)))
(while (not (q-empty? queue))
(let* ((proc (q-pop! queue))
- (proc-result (proc))
+ (proc-result (
call-proc
proc))
(enqueue
(lambda (new-proc)
(enq! next-queue new-proc))))
(enqueue
(lambda (new-proc)
(enq! next-queue new-proc))))