From edb74a66fd43dc8cd4d3c7d5af748b0acc294af5 Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Sat, 7 Nov 2020 12:19:00 +0100 Subject: [PATCH] added dispatcher.go --- dispatcher/dispatcher.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dispatcher/dispatcher.go diff --git a/dispatcher/dispatcher.go b/dispatcher/dispatcher.go new file mode 100644 index 0000000..bcfcba5 --- /dev/null +++ b/dispatcher/dispatcher.go @@ -0,0 +1,39 @@ +package dispatcher + +import "errors" + +type Dispatcher struct { + listeners map[int16]chan string + counter int16 +} + +func New() Dispatcher { + return Dispatcher{ + listeners: map[int16]chan string{}, + counter: 0, + } +} + +func (d *Dispatcher) Publish(message string) { + for _, ch := range d.listeners { + ch <- message + } +} + +func (d *Dispatcher) Subscribe() (id int16, receiver <-chan string) { + key := d.counter + d.counter++ + rec := make(chan string) + d.listeners[key] = rec + return key, rec +} + +func (d *Dispatcher) Unsubscribe(id int16) error { + receiver, ok := d.listeners[id] + if !ok { + return errors.New("no subscription with id") + } + delete(d.listeners, id) + close(receiver) + return nil +}