Codebase list golang-github-vbauerster-mpb / 997a620
merge refactoring Vladimir Bauer 7 years ago
4 changed file(s) with 63 addition(s) and 32 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
398410 func (b *Bar) refreshNowTillShutdown() {
399411 for {
400412 select {
1010 func AppendDecorators(appenders ...decor.Decorator) BarOption {
1111 return func(s *bState) {
1212 for _, decorator := range appenders {
13 if ar, ok := decorator.(decor.AmountReceiver); ok {
14 s.amountReceivers = append(s.amountReceivers, ar)
15 }
16 if sl, ok := decorator.(decor.ShutdownListener); ok {
17 s.shutdownListeners = append(s.shutdownListeners, sl)
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()...)
1819 }
1920 s.aDecorators = append(s.aDecorators, decorator)
2021 }
2526 func PrependDecorators(prependers ...decor.Decorator) BarOption {
2627 return func(s *bState) {
2728 for _, decorator := range prependers {
28 if ar, ok := decorator.(decor.AmountReceiver); ok {
29 s.amountReceivers = append(s.amountReceivers, ar)
30 }
31 if sl, ok := decorator.(decor.ShutdownListener); ok {
32 s.shutdownListeners = append(s.shutdownListeners, sl)
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()...)
3335 }
3436 s.pDecorators = append(s.pDecorators, decorator)
3537 }
5454 // A decorator must implement this interface, in order to be used with
5555 // mpb library.
5656 type Decorator interface {
57 ConfigSetter
5758 Synchronizer
5859 Decor(*Statistics) string
5960 }
6061
6162 // Synchronizer interface.
6263 // All decorators implement this interface implicitly. Its Sync
63 // method exposes width sync channel, if sync is enabled.
64 // method exposes width sync channel, if DSyncWidth bit is set.
6465 type Synchronizer interface {
6566 Sync() (chan int, bool)
67 }
68
69 // ConfigSetter interface
70 type ConfigSetter interface {
71 SetConfig(config WC) (old WC)
6672 }
6773
6874 // OnCompleteMessenger interface.
106112
107113 // FormatMsg formats final message according to WC.W and WC.C.
108114 // Should be called by any Decorator implementation.
109 func (wc WC) FormatMsg(msg string) string {
115 func (wc *WC) FormatMsg(msg string) string {
110116 if (wc.C & DSyncWidth) != 0 {
111117 wc.wsync <- utf8.RuneCountInString(msg)
112118 max := <-wc.wsync
113 if max == 0 {
114 max = wc.W
115 }
116119 if (wc.C & DextraSpace) != 0 {
117120 max++
118121 }
138141 return wc.wsync, (wc.C & DSyncWidth) != 0
139142 }
140143
144 func (wc *WC) SetConfig(conf WC) (old WC) {
145 old = *wc
146 *wc = conf
147 wc.Init()
148 return old
149 }
150
141151 // OnComplete returns decorator, which wraps provided decorator, with
142152 // sole purpose to display provided message on complete event.
143153 //
55 "unicode/utf8"
66 )
77
8 func Merge(decorator Decorator, wcc ...WC) Decorator {
8 // Merge helper func, provides a way to synchronize width of single
9 // decorator with adjacent decorators of different bar, like so:
10 // +--------+---------+
11 // | MERGE(D) |
12 // +--------+---------+
13 // | D1 | D2 |
14 // +--------+---------+
15 //
16 func Merge(decorator Decorator, placeholders ...WC) Decorator {
917 if _, ok := decorator.Sync(); !ok {
1018 return decorator
1119 }
12 var placeHolders []*placeHolderDecorator
13 for _, wc := range wcc {
20 md := &MergeDecorator{Decorator: decorator}
21 md.wc = decorator.SetConfig(md.wc)
22 for _, wc := range placeholders {
1423 wc.Init()
15 placeHolders = append(placeHolders, &placeHolderDecorator{
24 md.placeHolders = append(md.placeHolders, &placeHolderDecorator{
1625 WC: wc,
1726 wsync: make(chan int),
1827 })
1928 }
20 md := &MergeDecorator{
21 decorator: decorator,
22 placeHolders: placeHolders,
23 }
24 md.WC = decorator.SetConfig(md.WC)
2529 return md
2630 }
2731
2832 type MergeDecorator struct {
29 WC
30 decorator Decorator
33 Decorator
34 wc WC
3135 placeHolders []*placeHolderDecorator
3236 }
3337
3943 return decorators
4044 }
4145
46 func (md *MergeDecorator) Sync() (chan int, bool) {
47 return md.wc.Sync()
48 }
49
4250 func (d *MergeDecorator) Decor(st *Statistics) string {
43 msg := d.decorator.Decor(st)
51 msg := d.Decorator.Decor(st)
4452 msgLen := utf8.RuneCountInString(msg)
4553 pWidth := msgLen / (len(d.placeHolders) + 1)
4654 mod := msgLen % (len(d.placeHolders) + 1)
47 d.wsync <- pWidth + mod
55 d.wc.wsync <- pWidth + mod
4856 for _, ph := range d.placeHolders {
4957 ph.wsync <- pWidth
5058 }
51 // fmt.Fprintln(os.Stderr, "all sent")
52 max := <-d.wsync
59 max := <-d.wc.wsync
5360 for _, ph := range d.placeHolders {
5461 max += <-ph.wsync
5562 }
56 if (d.C & DextraSpace) != 0 {
63 if (d.wc.C & DextraSpace) != 0 {
5764 max++
5865 }
59 return fmt.Sprintf(fmt.Sprintf(d.format, max), msg)
66 return fmt.Sprintf(fmt.Sprintf(d.wc.format, max), msg)
6067 }
6168
6269 type placeHolderDecorator struct {