+ (inform-subscribers)))
+
+(define (repl-manager-add-subscriber repl-manager message)
+ (define from (message-from message))
+ (unless (member from (.subscribers repl-manager))
+ (set! (.subscribers repl-manager)
+ (cons from (.subscribers repl-manager)))))
+
+(define (repl-manager-remove-subscriber repl-manager message)
+ (define from (message-from message))
+ (set! (.subscribers repl-manager)
+ (remove (lambda (x) (equal? x (message-from message)))
+ (.subscribers repl-manager))))
+
+\f
+
+(define* (spawn-repl #:key (path "/tmp/8sync-socket")
+ (socket (make-unix-domain-server-socket #:path path))
+ (poll-every 1/30)
+ (stop? (make-atomic-box #f))
+ (on-update #f))
+ "Spawn a cooperative REPL in a new fiber."
+ (define server
+ (spawn-coop-repl-server socket))
+ (spawn-fiber
+ (lambda ()
+ (while (not (atomic-box-ref stop?))
+ ;; Poll the server
+ (poll-coop-repl-server server)
+ ;; Call update hook, if any
+ (and on-update (on-update))
+ ;; Take a break!
+ (sleep poll-every))
+ (close socket))))