diff --git a/bar.go b/bar.go index 625b72a..be5d05c 100644 --- a/bar.go +++ b/bar.go @@ -153,20 +153,22 @@ // TraverseDecorators traverses all available decorators and calls cb func on each. func (b *Bar) TraverseDecorators(cb func(decor.Decorator)) { - sync := make(chan struct{}) - select { - case b.operateState <- func(s *bState) { - defer close(sync) + iter := make(chan decor.Decorator) + select { + case b.operateState <- func(s *bState) { for _, decorators := range [][]decor.Decorator{ s.pDecorators, s.aDecorators, } { for _, d := range decorators { - cb(unwrap(d)) - } - } - }: - <-sync + iter <- d + } + } + close(iter) + }: + for d := range iter { + cb(unwrap(d)) + } case <-b.done: } }