-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathexample_test.go
More file actions
120 lines (91 loc) · 2.36 KB
/
example_test.go
File metadata and controls
120 lines (91 loc) · 2.36 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package bell_test
import (
"context"
"fmt"
"github.com/nuttech/bell/v2"
"sort"
"time"
)
type CustomStruct struct {
name string
param int32
}
func Example() {
// Use via global state
event := "event_name"
event2 := "event_name_2"
// add listener on event event_name
bell.Listen(event, func(message bell.Message) {
// we extend CustomStruct in message
customStruct := message.(CustomStruct)
fmt.Println(customStruct)
})
// add listener on event event_name_2
bell.Listen(event2, func(message bell.Message) {})
// get event list
list := bell.List()
// only for test
sort.Strings(list)
fmt.Println(list)
// remove listeners on event_name_2
bell.Remove(event2)
// get event list again
fmt.Println(bell.List())
// check if exists event_name_2 event in storage
fmt.Println(bell.Has(event2))
// call event event_name
_ = bell.Ring(event, CustomStruct{name: "testName", param: 12})
// wait until the event completes its work
bell.Wait()
// Output:
// [event_name event_name_2]
// [event_name]
// false
// {testName 12}
}
func ExampleEvents() {
// Use events object (without global state)
eventName := "event_name"
// make a new events store
events := bell.New()
// add listener on event
events.Listen(eventName, func(msg bell.Message) { fmt.Println(msg) })
// call event event_name
_ = events.Ring(eventName, "Hello bell!")
// wait until the event completes its work
events.Wait()
// Output:
// Hello bell!
}
func Example_usingContext() {
// Use bell with context
// create a custom struct for pass a context
type Custom struct {
ctx context.Context
value interface{}
}
// add listener
bell.Listen("event", func(message bell.Message) {
for iterationsCount := 1; true; iterationsCount++ {
select {
case <-message.(*Custom).ctx.Done():
return
default:
fmt.Printf("Iteration #%d\n", iterationsCount)
time.Sleep(10 * time.Second)
}
}
})
// create a global context for all calls
globalCtx, cancelGlobalCtx := context.WithCancel(context.Background())
// create a children context for a call with timeout
ringCtx, ringCancel := context.WithTimeout(globalCtx, time.Minute)
defer ringCancel()
_ = bell.Ring("event", &Custom{ringCtx, "value"})
// wait a second for the handler to perform one iteration
time.Sleep(time.Second)
// interrupt all handlers
cancelGlobalCtx()
// Output:
// Iteration #1
}