mirror of
https://github.com/tmrts/go-patterns.git
synced 2024-11-22 21:16:10 +03:00
34 lines
651 B
Go
34 lines
651 B
Go
|
package fan
|
||
|
|
||
|
import "sync"
|
||
|
|
||
|
// In implements fan.In messaging pattern
|
||
|
// Merges different channels in one channel
|
||
|
func In(cs ...<-chan int) <-chan int {
|
||
|
var wg sync.WaitGroup
|
||
|
|
||
|
out := make(chan int)
|
||
|
|
||
|
// Start an send goroutine for each input channel in cs. send
|
||
|
// copies values from c to out until c is closed, then calls wg.Done.
|
||
|
send := func(c <-chan int) {
|
||
|
for n := range c {
|
||
|
out <- n
|
||
|
}
|
||
|
wg.Done()
|
||
|
}
|
||
|
|
||
|
wg.Add(len(cs))
|
||
|
for _, c := range cs {
|
||
|
go send(c)
|
||
|
}
|
||
|
|
||
|
// Start a goroutine to close out once all the send goroutines are
|
||
|
// done. This must start after the wg.Add call.
|
||
|
go func() {
|
||
|
wg.Wait()
|
||
|
close(out)
|
||
|
}()
|
||
|
return out
|
||
|
}
|