experimental/job_group.go (27 lines of code) (raw):
package experimental
import "sync"
type jobGroup struct {
ch jobsData
wg sync.WaitGroup
err error
lock sync.Mutex
}
func (g *jobGroup) dispatch(fn func() error) {
g.wg.Add(1)
g.ch <- func() {
var err error
defer func() {
if err != nil {
g.lock.Lock()
g.err = err
g.lock.Unlock()
}
}()
defer g.wg.Done()
err = fn()
}
}
func (g *jobGroup) finish() error {
g.wg.Wait()
return g.err
}