diff --git a/bar.go b/bar.go index e3901be..ac1b9c1 100644 --- a/bar.go +++ b/bar.go @@ -159,25 +159,21 @@ // TraverseDecorators traverses all available decorators and calls cb func on each. func (b *Bar) TraverseDecorators(cb func(decor.Decorator)) { - var wg sync.WaitGroup - iter := make(chan decor.Decorator) - select { - case b.operateState <- func(s *bState) { + select { + case b.operateState <- func(s *bState) { + var wg sync.WaitGroup for _, decorators := range s.decorators { + wg.Add(len(decorators)) for _, d := range decorators { - iter <- d + d := d + go func() { + cb(unwrap(d)) + wg.Done() + }() } } - close(iter) wg.Wait() }: - for d := range iter { - d := d - go func() { - cb(unwrap(d)) - wg.Done() - }() - } case <-b.ctx.Done(): } } @@ -281,29 +277,24 @@ // EwmaIncrInt64 increments progress by amount of n and updates EWMA based // decorators by dur of a single iteration. func (b *Bar) EwmaIncrInt64(n int64, iterDur time.Duration) { - var wg sync.WaitGroup - iter := make(chan decor.EwmaDecorator) - select { - case b.operateState <- func(s *bState) { + select { + case b.operateState <- func(s *bState) { + var wg sync.WaitGroup wg.Add(len(s.ewmaDecorators)) for _, d := range s.ewmaDecorators { - iter <- d - } - close(iter) - s.current += n - if s.triggerComplete && s.current >= s.total { - s.current = s.total - s.triggerCompletion(b) - } - wg.Wait() - }: - for d := range iter { d := d go func() { d.EwmaUpdate(n, iterDur) wg.Done() }() } + s.current += n + if s.triggerComplete && s.current >= s.total { + s.current = s.total + s.triggerCompletion(b) + } + wg.Wait() + }: case <-b.ctx.Done(): } } @@ -314,20 +305,18 @@ if current < 0 { return } - type item struct { - decor.EwmaDecorator - n int64 - } - var wg sync.WaitGroup - iter := make(chan item) select { case b.operateState <- func(s *bState) { n := current - s.current + var wg sync.WaitGroup wg.Add(len(s.ewmaDecorators)) for _, d := range s.ewmaDecorators { - iter <- item{d, n} - } - close(iter) + d := d + go func() { + d.EwmaUpdate(n, iterDur) + wg.Done() + }() + } s.current = current if s.triggerComplete && s.current >= s.total { s.current = s.total @@ -335,13 +324,6 @@ } wg.Wait() }: - for d := range iter { - d := d - go func() { - d.EwmaUpdate(d.n, iterDur) - wg.Done() - }() - } case <-b.ctx.Done(): } }