merge-channel: init
This commit is contained in:
38
merge-channel/main.go
Normal file
38
merge-channel/main.go
Normal file
@ -0,0 +1,38 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var InsufficientChannelsErr = errors.New("channels count must be >2")
|
||||
|
||||
func merge[T any](channels ...<-chan T) (<-chan T, error) {
|
||||
out := make(chan T)
|
||||
|
||||
if len(channels) < 2 {
|
||||
close(out)
|
||||
|
||||
return out, InsufficientChannelsErr
|
||||
}
|
||||
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(len(channels))
|
||||
|
||||
for _, c := range channels {
|
||||
go func(channel <-chan T) {
|
||||
defer wg.Done()
|
||||
|
||||
for v := range channel {
|
||||
out <- v
|
||||
}
|
||||
}(c)
|
||||
}
|
||||
|
||||
go func() {
|
||||
wg.Wait()
|
||||
close(out)
|
||||
}()
|
||||
|
||||
return out, nil
|
||||
}
|
Reference in New Issue
Block a user