Skip to content

Commit 80ee561

Browse files
author
tensor-programming
committed
add generator and observer
1 parent 16ea47d commit 80ee561

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed

generator/main.go

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func fib(n int) chan int {
6+
out := make(chan int)
7+
8+
go func() {
9+
defer close(out)
10+
for i, j := 0, 1; i < n; i, j = i+j, i {
11+
out <- i
12+
}
13+
14+
}()
15+
16+
return out
17+
}
18+
19+
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
20+
21+
func main() {
22+
for x := range fib(10000000) {
23+
fmt.Println(x)
24+
}
25+
}

observer/main.go

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
"time"
7+
)
8+
9+
type (
10+
Event struct {
11+
data int
12+
}
13+
14+
Observer interface {
15+
NotifyCallback(Event)
16+
}
17+
18+
Subject interface {
19+
AddListener(Observer)
20+
RemoveListener(Observer)
21+
Notify(Event)
22+
}
23+
24+
eventObserver struct {
25+
id int
26+
time time.Time
27+
}
28+
29+
eventSubject struct {
30+
observers sync.Map
31+
}
32+
)
33+
34+
func (e *eventObserver) NotifyCallback(event Event) {
35+
fmt.Printf("Observer: %d Recieved: %d after %v\n", e.id, event.data, time.Since(e.time))
36+
}
37+
38+
func (s *eventSubject) AddListener(obs Observer) {
39+
s.observers.Store(obs, struct{}{})
40+
}
41+
42+
func (s *eventSubject) RemoveListener(obs Observer) {
43+
s.observers.Delete(obs)
44+
}
45+
46+
func (s *eventSubject) Notify(event Event) {
47+
s.observers.Range(func(key interface{}, value interface{}) bool {
48+
if key == nil || value == nil {
49+
return false
50+
}
51+
52+
key.(Observer).NotifyCallback(event)
53+
return true
54+
})
55+
56+
}
57+
58+
func fib(n int) chan int {
59+
out := make(chan int)
60+
61+
go func() {
62+
defer close(out)
63+
for i, j := 0, 1; i < n; i, j = i+j, i {
64+
out <- i
65+
}
66+
67+
}()
68+
69+
return out
70+
}
71+
72+
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
73+
74+
func main() {
75+
n := eventSubject{
76+
observers: sync.Map{},
77+
}
78+
79+
t := time.Now()
80+
81+
var obs1 = eventObserver{id: 1, time: t}
82+
var obs2 = eventObserver{id: 2, time: t}
83+
n.AddListener(&obs1)
84+
n.AddListener(&obs2)
85+
86+
go func() {
87+
select {
88+
case <-time.After(time.Millisecond * 10):
89+
n.RemoveListener(&obs1)
90+
}
91+
}()
92+
93+
for x := range fib(100000) {
94+
n.Notify(Event{data: x})
95+
}
96+
97+
}

0 commit comments

Comments
 (0)