forked from gopaws/go.events
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dispatcher.go
62 lines (52 loc) · 1.53 KB
/
dispatcher.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package events
var value = struct{}{}
type Dispatcherer interface {
AddSubscriber(handler Listener)
AddSubscribers([]Listener)
RemoveSubscriber(handler Listener)
Dispatch(Event) error
}
// NewDispatcher creates new dispatcher
func NewDispatcher(strategy DispatchStrategy) *Dispatcher {
dispatcher := new(Dispatcher)
dispatcher.strategy = strategy
dispatcher.idm = make(map[string]Listener)
dispatcher.subscribers = make(map[Listener]struct{})
return dispatcher
}
// Dispatcher stores event listeners of concrete event
type Dispatcher struct {
strategy DispatchStrategy
idm map[string]Listener
subscribers map[Listener]struct{}
}
// AddSubscriber adds one listener
func (dispatcher *Dispatcher) AddSubscriber(handler Listener) {
dispatcher.add(handler)
}
func (dispatcher *Dispatcher) add(handler Listener) {
if idi, ok := handler.(ID); ok {
id := idi.ID()
if len(id) > 0 {
if h, y := dispatcher.idm[id]; y {
dispatcher.RemoveSubscriber(h)
}
dispatcher.idm[id] = handler
}
}
dispatcher.subscribers[handler] = value
}
// AddSubscribers adds slice of listeners
func (dispatcher *Dispatcher) AddSubscribers(handlers []Listener) {
for _, handler := range handlers {
dispatcher.add(handler)
}
}
// RemoveSubscriber removes listener
func (dispatcher *Dispatcher) RemoveSubscriber(handler Listener) {
delete(dispatcher.subscribers, handler)
}
// Dispatch deliver event to listeners using strategy
func (dispatcher *Dispatcher) Dispatch(event Event) error {
return dispatcher.strategy(event, dispatcher.subscribers)
}