Codebase list golang-github-vbauerster-mpb / 9d2ce5f
refactor examples and bar_test.go Vladimir Bauer 9 years ago
5 changed file(s) with 75 addition(s) and 61 deletion(s). Raw diff Collapse all Expand all
173173 return s.appendFuncs
174174 }
175175
176 func (b *Bar) NumOfAppenders() int {
177 return len(b.GetAppenders())
178 }
179
176180 // GetPrependers returns slice of prepender DecoratorFunc
177181 func (b *Bar) GetPrependers() []DecoratorFunc {
178182 s := b.getState()
179183 return s.prependFuncs
184 }
185
186 func (b *Bar) NumOfPrependers() int {
187 return len(b.GetPrependers())
180188 }
181189
182190 // GetStatistics returs *Statistics, which contains information like Tottal,
246254 if isClosed(b.done) {
247255 return b.state
248256 }
249 // ch := make(chan state, 1)
250 ch := make(chan state)
257 ch := make(chan state, 1)
251258 b.stateReqCh <- ch
252259 return <-ch
253260 }
352359 }
353360 }
354361
355 func (b *Bar) bytes(termWidth int, ws *widthSync) []byte {
362 func (b *Bar) bytes(termWidth int, prependWs, appendWs *widthSync) []byte {
356363 s := b.getState()
357 return draw(&s, termWidth, ws)
358 }
359
360 func draw(s *state, termWidth int, ws *widthSync) []byte {
361 if len(s.prependFuncs) != len(ws.listen) {
364 return draw(&s, termWidth, prependWs, appendWs)
365 }
366
367 func draw(s *state, termWidth int, prependWs, appendWs *widthSync) []byte {
368 if len(s.prependFuncs) != len(prependWs.listen) || len(s.appendFuncs) != len(appendWs.listen) {
362369 return []byte{}
363370 }
364371 if termWidth <= 0 {
366373 }
367374
368375 stat := newStatistics(s)
369
370 // render append functions to the right of the bar
371 var appendBlock []byte
372 for _, f := range s.appendFuncs {
373 appendBlock = append(appendBlock, []byte(f(stat, nil, nil))...)
374 }
375376
376377 // render prepend functions to the left of the bar
377378 var prependBlock []byte
378379 for i, f := range s.prependFuncs {
379 prependBlock = append(prependBlock, []byte(f(stat, ws.listen[i], ws.result[i]))...)
380 prependBlock = append(prependBlock,
381 []byte(f(stat, prependWs.listen[i], prependWs.result[i]))...)
382 }
383
384 // render append functions to the right of the bar
385 var appendBlock []byte
386 for i, f := range s.appendFuncs {
387 appendBlock = append(appendBlock,
388 []byte(f(stat, appendWs.listen[i], appendWs.result[i]))...)
380389 }
381390
382391 prependCount := utf8.RuneCount(prependBlock)
7070 },
7171 }
7272
73 stopWidthListen := make(chan struct{})
74 prependWs := newWidthSync(stopWidthListen, 1, 0)
75 appendWs := newWidthSync(stopWidthListen, 1, 0)
7376 for _, test := range tests {
7477 s := newTestState()
7578 s.width = test.barWidth
7881 if test.barRefill != nil {
7982 s.refill = test.barRefill
8083 }
81 got := draw(s, test.termWidth)
84 got := draw(s, test.termWidth, prependWs, appendWs)
8285 if !reflect.DeepEqual(test.want, got) {
8386 t.Errorf("Want: %q, Got: %q\n", test.want, got)
8487 }
9595 }
9696
9797 func getDecor() mpb.DecoratorFunc {
98 return func(s *mpb.Statistics) string {
98 return func(s *mpb.Statistics, myWidth chan<- int, maxWidth <-chan int) string {
9999 str := fmt.Sprintf("%d/%d", s.Current, s.Total)
100100 return fmt.Sprintf("%-7s", str)
101101 }
4646 }
4747
4848 func ExampleBar_PrependFunc() {
49 decor := func(s *mpb.Statistics) string {
49 decor := func(s *mpb.Statistics, myWidth chan<- int, maxWidth <-chan int) string {
5050 str := fmt.Sprintf("%d/%d", s.Current, s.Total)
5151 return fmt.Sprintf("%8s", str)
5252 }
6262 }
6363
6464 func ExampleBar_AppendFunc() {
65 decor := func(s *mpb.Statistics) string {
65 decor := func(s *mpb.Statistics, myWidth chan<- int, maxWidth <-chan int) string {
6666 str := fmt.Sprintf("%d/%d", s.Current, s.Total)
6767 return fmt.Sprintf("%8s", str)
6868 }
250250 }
251251 op.result <- ok
252252 }
253 if len(bars) > 0 {
254 numPrependers = len(bars[0].GetPrependers())
255 // numAppenders = len(bars[0].GetAppenders())
256 }
257253 case respCh := <-p.barCountReqCh:
258254 respCh <- len(bars)
259255 case beforeRender = <-p.brCh:
268264 beforeRender(bars)
269265 }
270266
271 prepWidthSync := &widthSync{
272 listen: make([]chan int, numPrependers),
273 result: make([]chan int, numPrependers),
274 }
275 for i := 0; i < numPrependers; i++ {
276 prepWidthSync.listen[i] = make(chan int, numBars)
277 prepWidthSync.result[i] = make(chan int, numBars)
278 }
279267 stopWidthListen := make(chan struct{})
280 for i, listenCh := range prepWidthSync.listen {
281 go func(listenCh <-chan int, resultCh chan<- int) {
282 widths := make([]int, 0, numBars)
283 loop:
284 for {
285 select {
286 case w := <-listenCh:
287 widths = append(widths, w)
288 if len(widths) == numBars {
289 break loop
290 }
291 case <-stopWidthListen:
292 return
293 }
294 }
295 result := max(widths)
296 for i := 0; i < numBars; i++ {
297 resultCh <- result
298 }
299 close(resultCh)
300 }(listenCh, prepWidthSync.result[i])
301 }
268 prependWs := newWidthSync(stopWidthListen, numBars, bars[0].NumOfPrependers())
269 appendWs := newWidthSync(stopWidthListen, numBars, bars[0].NumOfAppenders())
302270
303271 width, _, _ := cwriter.GetTermSize()
304272 ibars := iBarsGen(bars, width)
306274 wg.Add(numBars)
307275 for i := 0; i < numBars; i++ {
308276 go func() {
309 // defer recoverIfPanic()
310 defer func() {
311 wg.Done()
312 }()
313 drawer(ibars, ibbCh, prepWidthSync)
277 defer recoverIfPanic()
278 drawer(ibars, ibbCh, prependWs, appendWs)
314279 }()
315280 }
316281 go func() {
317282 wg.Wait()
318283 close(ibbCh)
319284 close(stopWidthListen)
320 for _, ch := range prepWidthSync.listen {
285 for _, ch := range prependWs.listen {
286 close(ch)
287 }
288 for _, ch := range appendWs.listen {
321289 close(ch)
322290 }
323291 }()
344312 }
345313 }
346314
347 func drawer(ibars <-chan indexedBar, ibbCh chan<- indexedBarBuffer) {
315 func newWidthSync(stopListen chan struct{}, numBars, numColumn int) *widthSync {
316 ws := &widthSync{
317 listen: make([]chan int, numColumn),
318 result: make([]chan int, numColumn),
319 }
320 for i := 0; i < numColumn; i++ {
321 ws.listen[i] = make(chan int, numBars)
322 ws.result[i] = make(chan int, numBars)
323 }
324 for i, listenCh := range ws.listen {
325 go func(listenCh <-chan int, resultCh chan<- int) {
326 widths := make([]int, 0, numBars)
327 loop:
328 for {
329 select {
330 case w := <-listenCh:
331 widths = append(widths, w)
332 if len(widths) == numBars {
333 break loop
334 }
335 case <-stopListen:
336 return
337 }
338 }
339 result := max(widths)
340 for i := 0; i < numBars; i++ {
341 resultCh <- result
342 }
343 close(resultCh)
344 }(listenCh, ws.result[i])
345 }
346 return ws
347 }
348
349 func drawer(ibars <-chan indexedBar, c chan<- indexedBarBuffer, prependWs, appendWs *widthSync) {
348350 for b := range ibars {
349 buf := b.bar.bytes(b.termWidth, ws)
351 buf := b.bar.bytes(b.termWidth, prependWs, appendWs)
350352 buf = append(buf, '\n')
351353 ibbCh <- indexedBarBuffer{b.index, buf}
352354 }