forked from denbeigh2000/goi3bar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
multiproducer.go
44 lines (37 loc) · 874 Bytes
/
multiproducer.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
package goi3bar
import "sync"
// MultiProducer is a simple Producer that groups multiple Producers.
type MultiProducer struct {
producers map[string]Producer
}
// NewMultiProducer creates a new MultiProducer
func NewMultiProducer(m map[string]Producer) MultiProducer {
return MultiProducer{m}
}
// Produce implements Producer
func (m MultiProducer) Produce(kill <-chan struct{}) <-chan []Output {
out := make(chan []Output)
wg := sync.WaitGroup{}
for _, p := range m.producers {
wg.Add(1)
go func(p Producer) {
defer wg.Done()
ch := p.Produce(kill)
for x := range ch {
out <- x
}
}(p)
}
go func() {
wg.Wait()
close(out)
}()
return out
}
// MultiRegister takes a registerer and uses it to register all of its'
// Producers
func (m MultiProducer) MultiRegister(r registerer) {
for k, p := range m.producers {
r.Register(k, p)
}
}