projects
/
8sync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Allow sending messages to put to-actor as an actual actor instance.
[8sync.git]
/
8sync
/
repl.scm
diff --git
a/8sync/repl.scm
b/8sync/repl.scm
index 16e246699fe1af49573ddb221ba7bbce839cdda3..4cf60b255df6b4b85031a6bed9b3e0d670b609fa 100644
(file)
--- a/
8sync/repl.scm
+++ b/
8sync/repl.scm
@@
-1,5
+1,5
@@
;;; 8sync --- Asynchronous programming for Guile
;;; 8sync --- Asynchronous programming for Guile
-;;; Copyright
(C) 2015
Christopher Allan Webber <cwebber@dustycloud.org>
+;;; Copyright
© 2015, 2016, 2017
Christopher Allan Webber <cwebber@dustycloud.org>
;;;
;;; This file is part of 8sync.
;;;
;;;
;;; This file is part of 8sync.
;;;
@@
-19,40
+19,63
@@
(define-module (8sync repl)
#:use-module (oop goops)
#:use-module (8sync)
(define-module (8sync repl)
#:use-module (oop goops)
#:use-module (8sync)
+ #:use-module (8sync daydream)
+ #:use-module (srfi srfi-1)
#:use-module (system repl server)
#:use-module (system repl coop-server)
#:export (<repl-manager>))
#:use-module (system repl server)
#:use-module (system repl coop-server)
#:export (<repl-manager>))
-(define-class <repl-manager> (<actor>)
+(define-actor <repl-manager> (<actor>)
+ ((add-subscriber repl-manager-add-subscriber)
+ (remove-subscriber repl-manager-remove-subscriber)
+ (main-loop repl-manager-main-loop))
(path #:init-keyword #:path
#:init-value "/tmp/8sync-socket"
(path #:init-keyword #:path
#:init-value "/tmp/8sync-socket"
- #:getter
repl-manager-
path)
+ #:getter
.
path)
(socket #:init-value #f
(socket #:init-value #f
- #:accessor
repl-manager-
socket)
+ #:accessor
.
socket)
(poll-every #:init-keyword #:poll-every
#:init-value (/ 1 30)
(poll-every #:init-keyword #:poll-every
#:init-value (/ 1 30)
- #:getter repl-manager-poll-every)
- (actions #:allocation #:each-subclass
- ;; @@: Should we add a stop action?
- #:init-value (build-actions
- (*cleanup* repl-manager-cleanup)
- (init repl-manager-init))))
+ #:getter .poll-every)
+ (subscribers #:init-keyword #:subscribers
+ #:init-value '()
+ #:accessor .subscribers))
-(define
(repl-manager-cleanup repl-manager message
)
+(define
-method (actor-cleanup! (repl-manager <repl-manager>)
)
;; Close the socket, if open
;; Close the socket, if open
- (and=> (
repl-manager-
socket repl-manager)
+ (and=> (
.
socket repl-manager)
close)
;; Delete the file, if it exists
close)
;; Delete the file, if it exists
- (when (file-exists? (
repl-manager-
path repl-manager))
- (delete-file (
repl-manager-
path repl-manager))))
+ (when (file-exists? (
.
path repl-manager))
+ (delete-file (
.
path repl-manager))))
-(define (repl-manager-init repl-manager message)
+(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
(define socket
- (make-unix-domain-server-socket #:path (
repl-manager-
path repl-manager)))
+ (make-unix-domain-server-socket #:path (
.
path repl-manager)))
(define server
(spawn-coop-repl-server socket))
(define server
(spawn-coop-repl-server socket))
- (set! (repl-manager-socket repl-manager) socket)
- (while (actor-am-i-alive? repl-manager)
+ (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)
(poll-coop-repl-server server)
- (8sleep (repl-manager-poll-every repl-manager))))
+ (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))))