refactoring TraverseDecorators
Vladimir Bauer
3 years ago
| 152 | 152 | |
| 153 | 153 | // TraverseDecorators traverses all available decorators and calls cb func on each. |
| 154 | 154 | func (b *Bar) TraverseDecorators(cb func(decor.Decorator)) { |
| 155 | sync := make(chan struct{}) | |
| 156 | select { | |
| 157 | case b.operateState <- func(s *bState) { | |
| 158 | defer close(sync) | |
| 155 | iter := make(chan decor.Decorator) | |
| 156 | select { | |
| 157 | case b.operateState <- func(s *bState) { | |
| 159 | 158 | for _, decorators := range [][]decor.Decorator{ |
| 160 | 159 | s.pDecorators, |
| 161 | 160 | s.aDecorators, |
| 162 | 161 | } { |
| 163 | 162 | for _, d := range decorators { |
| 164 | cb(unwrap(d)) | |
| 165 | } | |
| 166 | } | |
| 167 | }: | |
| 168 | <-sync | |
| 163 | iter <- d | |
| 164 | } | |
| 165 | } | |
| 166 | close(iter) | |
| 167 | }: | |
| 168 | for d := range iter { | |
| 169 | cb(unwrap(d)) | |
| 170 | } | |
| 169 | 171 | case <-b.done: |
| 170 | 172 | } |
| 171 | 173 | } |