-
Notifications
You must be signed in to change notification settings - Fork 127
/
runner.go
55 lines (40 loc) · 1.09 KB
/
runner.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
// Package runner provides a Runner type that is used to define both RunCounter
// and EmbeddedRunCounter to show examples of how to use composition in Go.
package runner
import "fmt"
// A Task is a simple task that prints a message when run.
type Task struct{ Msg string }
func (t Task) Run() {
fmt.Println("running", t.Msg)
}
// END_TASK OMIT
// A Runner provides a way of running tasks.
type Runner struct{ name string }
func (r *Runner) Name() string { return r.name }
func (r *Runner) Run(t Task) {
t.Run()
}
func (r *Runner) RunAll(ts []Task) {
for _, t := range ts {
r.Run(t)
}
}
// END_RUNNER OMIT
// A RunCounter is a Runner that keeps a counter of the run tasks.
type RunCounter struct {
runner Runner // HL
count int
}
func NewRunCounter(name string) *RunCounter {
return &RunCounter{runner: Runner{name}}
}
func (r *RunCounter) Run(t Task) {
r.count++
r.runner.Run(t) // HL
}
func (r *RunCounter) RunAll(ts []Task) {
r.count += len(ts)
r.runner.RunAll(ts) // HL
}
func (r *RunCounter) Count() int { return r.count }
func (r *RunCounter) Name() string { return r.runner.Name() }