-
Notifications
You must be signed in to change notification settings - Fork 0
/
timer.go
99 lines (74 loc) · 1.42 KB
/
timer.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
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
package timer
import (
"fmt"
"log"
"time"
)
type TimingCallback func(t Timing)
type TimingConstructor func(d time.Duration) Timing
type Timing interface {
String() string
Duration() time.Duration
}
type DefaultTiming struct {
Timing
duration time.Duration
}
func NewDefaultTiming(d time.Duration) Timing {
t := DefaultTiming{
duration: d,
}
return &t
}
func (dt *DefaultTiming) String() string {
return fmt.Sprintf("TIMER %v", dt.duration)
}
func (dt *DefaultTiming) Duration() time.Duration {
return dt.duration
}
func NewDefaultCallback(t Timing) {
log.Println(t.String())
}
type Timer struct {
Start time.Time
Timings chan Timing
Constructor TimingConstructor
Callback TimingCallback
Done chan bool
}
func NewDefaultTimer() (*Timer, error) {
ch := make(chan Timing)
con := NewDefaultTiming
cb := NewDefaultCallback
return NewTimer(ch, con, cb)
}
func NewTimer(ch chan Timing, con TimingConstructor, cb TimingCallback) (*Timer, error) {
t1 := time.Now()
done := make(chan bool)
t := Timer{
Start: t1,
Timings: ch,
Callback: cb,
Constructor: con,
Done: done,
}
go t.poll()
return &t, nil
}
func (tm *Timer) Stop() {
t2 := time.Since(tm.Start)
tm.Timings <- tm.Constructor(t2)
tm.Done <- true
}
func (tm *Timer) poll() {
for {
select {
case t := <-tm.Timings:
go tm.Callback(t)
case <-tm.Done:
return
default:
// pass
}
}
}