-
Notifications
You must be signed in to change notification settings - Fork 0
/
signals.go
executable file
·70 lines (55 loc) · 1.18 KB
/
signals.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
66
67
68
69
70
package lbricks
type Event chan interface{}
type Predicate func(interface{}) bool
type Mapper func(interface{}) interface{}
type MultiMapper func(...interface{}) interface{}
type Reducer func(memo interface{}, element interface{}) interface{}
type Subscriber func(interface{})
type Signal struct {
event Event
}
func (s Signal) Map(fn Mapper) Signal {
signal := Signal{make(Event)}
go func() {
for el := range s.event {
signal.event <- fn(el)
}
close(signal.event)
}()
return signal
}
func (s Signal) Filter(pred Predicate) Signal {
signal := Signal{make(Event)}
go func() {
for el := range s.event {
if keep := pred(el); keep {
signal.event <- el
}
}
close(signal.event)
}()
return signal
}
func (s Signal) Reduce(red Reducer, memo interface{}) interface{} {
for el := range s.event {
memo = red(memo, el)
}
return memo
}
func (s Signal) Subscribe(fn Subscriber) {
go func() {
for el := range s.event {
fn(el)
}
}()
}
func FromValues(els ... interface{}) Signal {
c := make(Event)
go func() {
for _, el := range els {
c <- el
}
close(c)
}()
return Signal{c}
}