-
Notifications
You must be signed in to change notification settings - Fork 0
/
profileChange.go
65 lines (52 loc) · 1.61 KB
/
profileChange.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
63
64
65
package logger
import (
"sync"
)
var globalProfileChangeSubject *profileChangeSubject
func init() {
globalProfileChangeSubject = NewProfileChangeSubject()
}
// SubscribeToProfileChange subscribes an observer
func SubscribeToProfileChange(observer ProfileChangeObserver) {
globalProfileChangeSubject.subscribe(observer)
}
// UnsubscribeFromProfileChange unsubscribes an observer
func UnsubscribeFromProfileChange(observer ProfileChangeObserver) {
globalProfileChangeSubject.unsubscribe(observer)
}
// NotifyProfileChange notifies observers about a profile change
func NotifyProfileChange() {
globalProfileChangeSubject.NotifyAll()
}
type profileChangeSubject struct {
observers []ProfileChangeObserver
mutex sync.RWMutex
}
// NewProfileChangeSubject -
func NewProfileChangeSubject() *profileChangeSubject {
return &profileChangeSubject{
observers: make([]ProfileChangeObserver, 0),
}
}
func (subject *profileChangeSubject) subscribe(observer ProfileChangeObserver) {
subject.mutex.Lock()
subject.observers = append(subject.observers, observer)
subject.mutex.Unlock()
}
func (subject *profileChangeSubject) unsubscribe(observer ProfileChangeObserver) {
subject.mutex.Lock()
defer subject.mutex.Unlock()
for i := 0; i < len(subject.observers); i++ {
if subject.observers[i] == observer {
subject.observers = append(subject.observers[0:i], subject.observers[i+1:]...)
}
}
}
// Notifies all observers that the profile changed
func (subject *profileChangeSubject) NotifyAll() {
subject.mutex.RLock()
defer subject.mutex.RUnlock()
for _, observer := range subject.observers {
observer.OnProfileChanged()
}
}