@@ -4,112 +4,94 @@ import (
4
4
"context"
5
5
)
6
6
7
- type Awaiter [ T any ] interface {
8
- // Add add a task
9
- Add (task func (context. Context ) ( T , error ) )
10
- // Wait wail for all tasks to completed
11
- Wait (context.Context ) ([]T , [] error , error )
12
- // WaitAny wait for any task to completed without error, can cancel other tasks
13
- WaitAny (context.Context ) (T , []error , error )
14
- // WaitN wait for N tasks to completed without error
15
- WaitN (context.Context , int ) ([]T , [] error , error )
7
+ type Awaiter interface {
8
+ // Add add an action
9
+ Add (action Action )
10
+ // Wait wail for all actions to completed
11
+ Wait (context.Context ) ([]error , error )
12
+ // WaitAny wait for any action to completed without error, can cancel other tasks
13
+ WaitAny (context.Context ) ([]error , error )
14
+ // WaitN wait for N actions to completed without error
15
+ WaitN (context.Context , int ) ([]error , error )
16
16
}
17
17
18
- type awaiter [ T any ] struct {
19
- tasks []func (context. Context ) ( T , error )
18
+ type awaiter struct {
19
+ actions []Action
20
20
}
21
21
22
- func (a * awaiter [ T ] ) Add (task func ( ctx context. Context ) ( T , error ) ) {
23
- a .tasks = append (a .tasks , task )
22
+ func (a * awaiter ) Add (action Action ) {
23
+ a .actions = append (a .actions , action )
24
24
}
25
25
26
- func (a * awaiter [ T ] ) Wait (ctx context.Context ) ([] T , []error , error ) {
27
- wait := make (chan Result [ T ] )
26
+ func (a * awaiter ) Wait (ctx context.Context ) ([]error , error ) {
27
+ wait := make (chan error )
28
28
29
- for _ , task := range a .tasks {
30
- go func (task func (context.Context ) (T , error )) {
31
- r , err := task (ctx )
32
- wait <- Result [T ]{
33
- Data : r ,
34
- Error : err ,
35
- }
36
- }(task )
29
+ for _ , action := range a .actions {
30
+ go func (action Action ) {
31
+
32
+ wait <- action (ctx )
33
+ }(action )
37
34
}
38
35
39
- var r Result [T ]
40
36
var taskErrs []error
41
- var items []T
42
37
43
- tt := len (a .tasks )
38
+ tt := len (a .actions )
44
39
for i := 0 ; i < tt ; i ++ {
45
40
select {
46
- case r = <- wait :
47
- if r .Error != nil {
48
- taskErrs = append (taskErrs , r .Error )
49
- } else {
50
- items = append (items , r .Data )
41
+ case err := <- wait :
42
+ if err != nil {
43
+ taskErrs = append (taskErrs , err )
51
44
}
52
45
case <- ctx .Done ():
53
- return items , taskErrs , ctx .Err ()
46
+ return taskErrs , ctx .Err ()
54
47
}
55
48
}
56
49
57
- if len (items ) == tt {
58
- return items , taskErrs , nil
50
+ if len (taskErrs ) > 0 {
51
+ return taskErrs , ErrTooLessDone
59
52
}
60
53
61
- return items , taskErrs , ErrTooLessDone
54
+ return taskErrs , nil
62
55
}
63
56
64
- func (a * awaiter [ T ] ) WaitN (ctx context.Context , n int ) ([] T , []error , error ) {
65
- wait := make (chan Result [ T ] )
57
+ func (a * awaiter ) WaitN (ctx context.Context , n int ) ([]error , error ) {
58
+ wait := make (chan error )
66
59
67
60
cancelCtx , cancel := context .WithCancel (ctx )
68
61
defer cancel ()
69
62
70
- for _ , task := range a .tasks {
71
- go func (task func (context.Context ) (T , error )) {
72
- r , err := task (cancelCtx )
73
- wait <- Result [T ]{
74
- Data : r ,
75
- Error : err ,
76
- }
77
- }(task )
63
+ for _ , action := range a .actions {
64
+ go func (action Action ) {
65
+ wait <- action (cancelCtx )
66
+
67
+ }(action )
78
68
}
79
69
80
- var r Result [T ]
81
70
var taskErrs []error
82
- var items [] T
83
- tt := len ( a . tasks )
71
+ tt := len ( a . actions )
72
+
84
73
var done int
85
74
for i := 0 ; i < tt ; i ++ {
86
75
select {
87
- case r = <- wait :
88
- if r . Error != nil {
89
- taskErrs = append (taskErrs , r . Error )
76
+ case err : = <- wait :
77
+ if err != nil {
78
+ taskErrs = append (taskErrs , err )
90
79
} else {
91
- items = append ( items , r . Data )
80
+
92
81
done ++
93
82
if done == n {
94
- return items , taskErrs , nil
83
+ return taskErrs , nil
95
84
}
96
85
}
97
86
case <- ctx .Done ():
98
- return items , taskErrs , ctx .Err ()
87
+ return taskErrs , ctx .Err ()
99
88
}
100
89
101
90
}
102
91
103
- return items , taskErrs , ErrTooLessDone
92
+ return taskErrs , ErrTooLessDone
104
93
}
105
94
106
- func (a * awaiter [T ]) WaitAny (ctx context.Context ) (T , []error , error ) {
107
- var t T
108
- result , err , taskErrs := a .WaitN (ctx , 1 )
109
-
110
- if len (result ) == 1 {
111
- t = result [0 ]
112
- }
113
-
114
- return t , err , taskErrs
95
+ func (a * awaiter ) WaitAny (ctx context.Context ) ([]error , error ) {
96
+ return a .WaitN (ctx , 1 )
115
97
}
0 commit comments