-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobserver.go
More file actions
73 lines (66 loc) · 1.58 KB
/
observer.go
File metadata and controls
73 lines (66 loc) · 1.58 KB
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
71
72
73
package rx
// Observer represents a group of EventHandlers.
type Observer struct {
NextHandler NextFunc
ErrorHandler ErrorFunc
CompleteHandler CompleteFunc
}
// DefaultObserver guarantees any handler won't be nil.
var DefaultObserver = Observer{
NextHandler: func(interface{}) {},
ErrorHandler: func(err error) {},
CompleteHandler: func() {},
}
// Handle registers Observer to EventHandler.
func (ob Observer) Handle(item interface{}) {
switch item := item.(type) {
case error:
ob.ErrorHandler(item)
return
default:
ob.NextHandler(item)
}
}
// NewObserver constructs a new Observer instance with default Observer and
// accept any number of EventHandler.
func NewObserver(handlers ...EventHandler) Observer {
ob := DefaultObserver
if len(handlers) > 0 {
for _, handler := range handlers {
switch handler := handler.(type) {
case NextFunc:
ob.NextHandler = handler
case ErrorFunc:
ob.ErrorHandler = handler
case CompleteFunc:
ob.CompleteHandler = handler
case Observer:
ob = handler
}
}
}
return ob
}
// Next applies Observer's NextHandler to an Item
func (ob Observer) Next(item interface{}) {
switch item := item.(type) {
case error:
return
default:
if ob.NextHandler != nil {
ob.NextHandler.Handle(item)
}
}
}
// Error applies Observer's ErrorHandler to an error
func (ob Observer) Error(err error) {
if ob.ErrorHandler != nil {
ob.ErrorHandler.Handle(err)
}
}
// Complete terminates the Observer's internal Observable
func (ob Observer) Complete() {
if ob.CompleteHandler != nil {
ob.CompleteHandler.Handle(nil)
}
}