-(define* (spawn-and-queue-repl-server! agenda #:optional port)
- (let ((coop-server
- (if port
- (spawn-coop-repl-server port)
- (spawn-coop-repl-server))))
- (enq! (agenda-queue agenda)
- (make-coop-server-handler coop-server))))
+(define-method (actor-cleanup! (repl-manager <repl-manager>))
+ ;; Close the socket, if open
+ (and=> (.socket repl-manager)
+ close)
+ ;; Delete the file, if it exists
+ (when (file-exists? (.path repl-manager))
+ (delete-file (.path repl-manager))))
+
+(define-method (actor-init! (repl-manager <repl-manager>))
+ (<- (actor-id repl-manager) 'main-loop))
+
+(define-method (repl-manager-main-loop repl-manager message)
+ (define socket
+ (make-unix-domain-server-socket #:path (.path repl-manager)))
+ (define server
+ (spawn-coop-repl-server socket))
+ (define (inform-subscribers)
+ (for-each
+ (lambda (subscriber)
+ (<- subscriber 'repl-update))
+ (.subscribers repl-manager)))
+ (set! (.socket repl-manager) socket)
+ (while #t
+ (daydream (.poll-every repl-manager))
+ (poll-coop-repl-server server)
+ (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))))