Skip to content

Instantly share code, notes, and snippets.

@dyoo
Last active December 10, 2015 07:18
Show Gist options
  • Save dyoo/4400660 to your computer and use it in GitHub Desktop.
Save dyoo/4400660 to your computer and use it in GitHub Desktop.
multicast
#lang racket/base
(require racket/async-channel)
(provide multicast?
(rename-out (new-multicast multicast))
multicast-put
multicast-get-evt)
;; multicast event
(struct multicast (listeners))
(define (new-multicast)
(multicast (make-weak-hash)))
(define (multicast-put m v)
(for ([listener (in-hash-keys (multicast-listeners m))])
(async-channel-put listener v)))
(define (multicast-get-evt m)
(define fresh-listener (make-async-channel))
(hash-set! (multicast-listeners m) fresh-listener #t)
fresh-listener)
(module* test racket/base
(require (submod ".."))
(define mc (multicast))
(define N 10)
(define evts (for/list ([i N]) (multicast-get-evt mc)))
(define threads (for/list ([evt evts]
[i (in-naturals)])
(thread (lambda ()
(log-info "~a waiting" i)
(log-info "~a ~s" i (sync evt))))))
(set! evts '())
(multicast-put mc "hi"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment