push
github
129 of 129 new or added lines in 3 files covered. (100.0%)
14802 of 22247 relevant lines covered (66.53%)
119.39 hits per line
1 |
package chanutil
|
|
2 |
|
|
3 |
// Merge merges multiple channels together.
|
|
|
func Merge[T any](ins ...<-chan T) <-chan T { |
4✔ |
|
switch len(ins) { |
4✔ |
|
case 0: |
× |
|
return nil |
× |
|
case 1: |
1✔ |
|
return ins[0] |
1✔ |
|
case 2: |
2✔ |
|
default:
|
1✔ |
|
return Merge(
|
1✔ |
|
Merge(ins[:len(ins)/2]...), |
1✔ |
|
Merge(ins[len(ins)/2:]...), |
1✔ |
|
) |
1✔ |
16 |
} |
|
17 |
|
|
|
in1, in2 := ins[0], ins[1] |
2✔ |
|
out := make(chan T) |
2✔ |
|
go func() { |
4✔ |
|
for {
|
23✔ |
|
if in1 == nil && in2 == nil { |
23✔ |
|
close(out)
|
2✔ |
|
return
|
2✔ |
|
} |
2✔ |
26 |
|
|
|
select {
|
19✔ |
|
case item, ok := <-in1:
|
8✔ |
|
if !ok {
|
10✔ |
|
in1 = nil
|
2✔ |
|
continue
|
2✔ |
32 |
} |
|
33 |
|
|
|
out <- item |
6✔ |
|
case item, ok := <-in2:
|
11✔ |
|
if !ok {
|
13✔ |
|
in2 = nil
|
2✔ |
|
continue
|
2✔ |
39 |
} |
|
40 |
|
|
|
out <- item |
9✔ |
42 |
} |
|
43 |
} |
|
44 |
}() |
|
|
return out
|
2✔ |
46 |
} |