-
Notifications
You must be signed in to change notification settings - Fork 0
/
action_examples.go
111 lines (97 loc) · 1.88 KB
/
action_examples.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
100
101
102
103
104
105
106
107
108
109
110
111
package main
import (
"context"
"fmt"
"time"
"golang.org/x/sync/errgroup"
)
// SimpleAction is an action that runs a function
type SimpleAction struct {
Func func(ctx context.Context) error
}
// Run runs the function
func (sa *SimpleAction) Run(ctx context.Context) error {
return sa.Func(ctx)
}
type User struct {
ID int
Name string
Email string
Error error
}
type (
Users []User
UsersParallel []User
)
func getUsersParalel() UsersParallel {
return []User(getUsers())
}
func getUsers() Users {
return []User{
{
ID: 1,
Name: "John Doe",
Email: "[email protected]",
},
{
ID: 2,
Name: "Jane Smith",
Email: "[email protected]",
},
{
ID: 3,
Name: "Alex Brown",
Email: "[email protected]",
// Error: errors.New("this is test error for user Alex Brown"),
},
{
ID: 4,
Name: "Emily Johnson",
Email: "[email protected]",
},
{
ID: 5,
Name: "Michael Davis",
Email: "[email protected]",
},
}
}
func (u *User) Run(ctx context.Context) error {
fmt.Println(u)
return nil
}
func (u Users) Run(ctx context.Context) error {
for _, user := range u {
fmt.Printf("Sequential user: %v\n", user)
}
return nil
}
func (u UsersParallel) Run(ctx context.Context) error {
g, ctx := errgroup.WithContext(ctx)
for _, user := range u {
currUser := user
g.Go(func() error {
// Check if context is done
select {
case <-ctx.Done():
return ctx.Err() // Return the error from the context, e.g., context.Canceled
case <-time.After(time.Second * 1):
fmt.Printf("Parallel user: %v\n", currUser)
return currUser.Error
}
})
}
return g.Wait()
}
type Loop struct {
Count int
}
func NewLoop(count int) *Loop {
return &Loop{Count: count}
}
func (l *Loop) Run(ctx context.Context) error {
for i := 0; i < l.Count; i++ {
fmt.Printf("Loop: %d\n", i)
}
return nil
}