package main import ( "fmt" "sync" "github.com/Shugyousha/stasher/work" ) type Input interface { Start() chan *work.Work } type Filter interface { Filter(*work.Work) *work.Work } type Output interface { Output(*work.Work) } type Manager struct { Input Input Filter Filter Output Output } func (m *Manager) Run() { var wg sync.WaitGroup ic := m.Input.Start() for w := range ic { wg.Add(1) go func(w *work.Work) { nw := m.Filter.Filter(w) err := nw.Error() if err != nil { fmt.Printf("Got an error when processing Work: %q\n", err) } m.Output.Output(nw) wg.Done() }(w) } wg.Wait() }