Created
July 19, 2021 06:43
-
-
Save praveen4g0/b66e757880a33bd743bf0e4f9220f5cc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"sync" | |
"time" | |
) | |
type ( | |
Event struct { | |
data int | |
} | |
Observer interface { | |
NotifyCallBack(Event) | |
} | |
Subject interface { | |
AddListener(Observer) | |
RemoveListener(Observer) | |
Notify(Event) | |
} | |
eventObserver struct { | |
id int | |
time time.Time | |
} | |
eventSubject struct { | |
observers sync.Map | |
} | |
) | |
func (e *eventObserver) NotifyCallBack(event Event) { | |
fmt.Printf("observer id: %d, Received %d , after %v \n", e.id, event.data, time.Since(e.time)) | |
} | |
func (s *eventSubject) AddListener(obs Observer) { | |
s.observers.Store(obs, struct{}{}) | |
} | |
func (s *eventSubject) RemoveListener(obs Observer) { | |
s.observers.Delete(obs) | |
} | |
func (s *eventSubject) Notify(event Event) { | |
s.observers.Range(func(key, value interface{}) bool { | |
if key == nil || value == nil { | |
return false | |
} | |
key.(Observer).NotifyCallBack(event) | |
return true | |
}) | |
} | |
// fib generator concept | |
func fib(n int) <-chan int { | |
out := make(chan int) | |
go func() { | |
defer close(out) | |
for i, j := 0, 1; i < n; i, j = i+j, i { | |
out <- i | |
} | |
}() | |
return out | |
} | |
func main() { | |
event_sub := eventSubject{ | |
observers: sync.Map{}, | |
} | |
obs_1 := eventObserver{id: 1, time: time.Now()} | |
obs_2 := eventObserver{id: 2, time: time.Now()} | |
event_sub.AddListener(&obs_1) | |
event_sub.AddListener(&obs_2) | |
go func() { | |
select { | |
case <-time.After(time.Microsecond * 10): | |
event_sub.RemoveListener(&obs_1) | |
} | |
}() | |
for x := range fib(1000) { | |
event_sub.Notify(Event{data: x}) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment