Codebase list golang-github-vbauerster-mpb / ac88c5b
Unpublic MergeDecorator to mergeDecorator Vladimir Bauer 7 years ago
3 changed file(s) with 44 addition(s) and 43 deletion(s). Raw diff Collapse all Expand all
395395 return table
396396 }
397397
398 func (s *bState) appendAmountReceiver(d decor.Decorator) {
399 if ar, ok := d.(decor.AmountReceiver); ok {
400 s.amountReceivers = append(s.amountReceivers, ar)
401 }
402 }
403
404 func (s *bState) appendShutdownListener(d decor.Decorator) {
405 if sl, ok := d.(decor.ShutdownListener); ok {
406 s.shutdownListeners = append(s.shutdownListeners, sl)
407 }
408 }
409
410398 func (b *Bar) refreshNowTillShutdown() {
411399 for {
412400 select {
66 // BarOption is a function option which changes the default behavior of a bar.
77 type BarOption func(*bState)
88
9 type merger interface {
10 CompoundDecorators() []decor.Decorator
11 }
12
13 func (s *bState) appendAmountReceiver(d decor.Decorator) {
14 if ar, ok := d.(decor.AmountReceiver); ok {
15 s.amountReceivers = append(s.amountReceivers, ar)
16 }
17 }
18
19 func (s *bState) appendShutdownListener(d decor.Decorator) {
20 if sl, ok := d.(decor.ShutdownListener); ok {
21 s.shutdownListeners = append(s.shutdownListeners, sl)
22 }
23 }
24
25 func (s *bState) addDecorators(dest *[]decor.Decorator, decorators ...decor.Decorator) {
26 for _, decorator := range decorators {
27 s.appendAmountReceiver(decorator)
28 s.appendShutdownListener(decorator)
29 if m, ok := decorator.(merger); ok {
30 dd := m.CompoundDecorators()
31 s.appendAmountReceiver(dd[0])
32 s.appendShutdownListener(dd[0])
33 *dest = append(*dest, dd[1:]...)
34 }
35 *dest = append(*dest, decorator)
36 }
37 }
38
939 // AppendDecorators let you inject decorators to the bar's right side.
10 func AppendDecorators(appenders ...decor.Decorator) BarOption {
11 return func(s *bState) {
12 for _, decorator := range appenders {
13 s.appendAmountReceiver(decorator)
14 s.appendShutdownListener(decorator)
15 if md, ok := decorator.(*decor.MergeDecorator); ok {
16 s.appendAmountReceiver(md.Decorator)
17 s.appendShutdownListener(md.Decorator)
18 s.aDecorators = append(s.aDecorators, md.PlaceHolders()...)
19 }
20 s.aDecorators = append(s.aDecorators, decorator)
21 }
40 func AppendDecorators(decorators ...decor.Decorator) BarOption {
41 return func(s *bState) {
42 s.addDecorators(&s.aDecorators, decorators...)
2243 }
2344 }
2445
2546 // PrependDecorators let you inject decorators to the bar's left side.
26 func PrependDecorators(prependers ...decor.Decorator) BarOption {
27 return func(s *bState) {
28 for _, decorator := range prependers {
29 s.appendAmountReceiver(decorator)
30 s.appendShutdownListener(decorator)
31 if md, ok := decorator.(*decor.MergeDecorator); ok {
32 s.appendAmountReceiver(md.Decorator)
33 s.appendShutdownListener(md.Decorator)
34 s.pDecorators = append(s.pDecorators, md.PlaceHolders()...)
35 }
36 s.pDecorators = append(s.pDecorators, decorator)
37 }
47 func PrependDecorators(decorators ...decor.Decorator) BarOption {
48 return func(s *bState) {
49 s.addDecorators(&s.pDecorators, decorators...)
3850 }
3951 }
4052
1717 if _, ok := decorator.Sync(); !ok || len(placeholders) == 0 {
1818 return decorator
1919 }
20 md := &MergeDecorator{
20 md := &mergeDecorator{
2121 Decorator: decorator,
2222 placeHolders: make([]*placeHolderDecorator, len(placeholders)),
2323 }
3232 return md
3333 }
3434
35 type MergeDecorator struct {
35 type mergeDecorator struct {
3636 Decorator
3737 wc WC
3838 placeHolders []*placeHolderDecorator
3939 }
4040
41 func (d *MergeDecorator) PlaceHolders() []Decorator {
42 decorators := make([]Decorator, len(d.placeHolders))
41 func (d *mergeDecorator) CompoundDecorators() []Decorator {
42 decorators := make([]Decorator, len(d.placeHolders)+1)
43 decorators[0] = d.Decorator
4344 for i, ph := range d.placeHolders {
44 decorators[i] = ph
45 decorators[i+1] = ph
4546 }
4647 return decorators
4748 }
4849
49 func (md *MergeDecorator) Sync() (chan int, bool) {
50 func (md *mergeDecorator) Sync() (chan int, bool) {
5051 return md.wc.Sync()
5152 }
5253
53 func (d *MergeDecorator) Decor(st *Statistics) string {
54 func (d *mergeDecorator) Decor(st *Statistics) string {
5455 msg := d.Decorator.Decor(st)
5556 msgLen := utf8.RuneCountInString(msg)
5657 pWidth := msgLen / (len(d.placeHolders) + 1)