|
|
|
|
@ -9,19 +9,16 @@
|
|
|
|
|
|
|
|
|
|
;; TODO: Needs to be updated to support captp disconnects |
|
|
|
|
(define (^pubsub bcom [subscribers (seteq)]) |
|
|
|
|
(methods |
|
|
|
|
[(subscribe subscriber) |
|
|
|
|
(bcom (^pubsub bcom (set-add subscribers subscriber)))] |
|
|
|
|
[(unsubscribe subscriber) |
|
|
|
|
(bcom (^pubsub bcom (set-remove subscribers subscriber)))] |
|
|
|
|
[(subscribers) subscribers] |
|
|
|
|
[publish |
|
|
|
|
(define (subscribe subscriber) |
|
|
|
|
(bcom (^pubsub bcom (set-add subscribers subscriber)))) |
|
|
|
|
(define (unsubscribe subscriber) |
|
|
|
|
(bcom (^pubsub bcom (set-remove subscribers subscriber)))) |
|
|
|
|
(define publish |
|
|
|
|
(make-keyword-procedure |
|
|
|
|
(lambda (kws kw-vals . args) |
|
|
|
|
(for ([subscriber subscribers]) |
|
|
|
|
(keyword-apply <-np kws kw-vals subscriber args))))] |
|
|
|
|
|
|
|
|
|
[publish-except |
|
|
|
|
(keyword-apply <-np kws kw-vals subscriber args))))) |
|
|
|
|
(define publish-except |
|
|
|
|
(make-keyword-procedure |
|
|
|
|
(lambda (kws kw-vals excluding . args) |
|
|
|
|
(define subscriber-subset |
|
|
|
|
@ -31,7 +28,18 @@
|
|
|
|
|
[(? list?) |
|
|
|
|
(set-subtract subscribers (list->seteq excluding))])) |
|
|
|
|
(for ([subscriber subscriber-subset]) |
|
|
|
|
(keyword-apply <-np kws kw-vals subscriber args))))])) |
|
|
|
|
(keyword-apply <-np kws kw-vals subscriber args))))) |
|
|
|
|
(methods |
|
|
|
|
[subscribe subscribe] |
|
|
|
|
[unsubscribe unsubscribe] |
|
|
|
|
[publish publish] |
|
|
|
|
[publish-except publish-except] |
|
|
|
|
;; shorthands |
|
|
|
|
[sub subscribe] |
|
|
|
|
[unsub unsubscribe] |
|
|
|
|
[pub publish] |
|
|
|
|
[pub-except publish-except] |
|
|
|
|
[(subscribers) subscribers])) |
|
|
|
|
|
|
|
|
|
(module+ test |
|
|
|
|
(require "../vat.rkt" |
|
|
|
|
|