diff --git a/_examples/merge/go.mod b/_examples/merge/go.mod deleted file mode 100644 index 4589bf2..0000000 --- a/_examples/merge/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module github.com/vbauerster/mpb/_examples/merge - -go 1.17 - -require github.com/vbauerster/mpb/v8 v8.4.0 - -require ( - github.com/VividCortex/ewma v1.2.0 // indirect - github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/rivo/uniseg v0.4.4 // indirect - golang.org/x/sys v0.7.0 // indirect -) diff --git a/_examples/merge/main.go b/_examples/merge/main.go deleted file mode 100644 index 20d8065..0000000 --- a/_examples/merge/main.go +++ /dev/null @@ -1,71 +0,0 @@ -package main - -import ( - "math/rand" - "strings" - "sync" - "time" - - "github.com/vbauerster/mpb/v8" - "github.com/vbauerster/mpb/v8/decor" -) - -func main() { - var wg sync.WaitGroup - // passed wg will be accounted at p.Wait() call - p := mpb.New(mpb.WithWaitGroup(&wg), mpb.WithWidth(60)) - total, numBars := 100, 3 - wg.Add(numBars) - - for i := 0; i < numBars; i++ { - var pdecorators mpb.BarOption - if i == 0 { - pdecorators = mpb.PrependDecorators( - decor.Merge( - decor.OnComplete( - newVariadicSpinner(decor.WCSyncSpace), - "done", - ), - decor.WCSyncSpace, // Placeholder - decor.WCSyncSpace, // Placeholder - ), - ) - } else { - pdecorators = mpb.PrependDecorators( - decor.CountersNoUnit("% .1d / % .1d", decor.WCSyncSpace), - decor.OnComplete(decor.Spinner(nil, decor.WCSyncSpace), "done"), - decor.OnComplete(decor.Spinner(nil, decor.WCSyncSpace), "done"), - ) - } - bar := p.AddBar(int64(total), - pdecorators, - mpb.AppendDecorators( - decor.OnComplete(decor.EwmaETA(decor.ET_STYLE_GO, 30), "done"), - ), - ) - // simulating some work - go func() { - defer wg.Done() - rng := rand.New(rand.NewSource(time.Now().UnixNano())) - max := 100 * time.Millisecond - for i := 0; i < total; i++ { - // start variable is solely for EWMA calculation - // EWMA's unit of measure is an iteration's duration - start := time.Now() - time.Sleep(time.Duration(rng.Intn(10)+1) * max / 10) - // we need to call EwmaIncrement to fulfill ewma decorator's contract - bar.EwmaIncrement(time.Since(start)) - } - }() - } - // wait for passed wg and for all bars to complete and flush - p.Wait() -} - -func newVariadicSpinner(wc decor.WC) decor.Decorator { - spinner := decor.Spinner(nil) - fn := func(s decor.Statistics) string { - return strings.Repeat(spinner.Decor(s), int(s.Current/3)) - } - return decor.Any(fn, wc) -} diff --git a/bar_option.go b/bar_option.go index 024f2e1..71ce452 100644 --- a/bar_option.go +++ b/bar_option.go @@ -14,11 +14,6 @@ for _, decorator := range decorators { if decorator == nil { continue - } - if d, ok := decorator.(interface { - PlaceHolders() []decor.Decorator - }); ok { - dest = append(dest, d.PlaceHolders()...) } dest = append(dest, decorator) } diff --git a/decor/merge.go b/decor/merge.go deleted file mode 100644 index 02b7a93..0000000 --- a/decor/merge.go +++ /dev/null @@ -1,111 +0,0 @@ -package decor - -import ( - "strings" - - "github.com/acarl005/stripansi" - "github.com/mattn/go-runewidth" -) - -var ( - _ Decorator = (*mergeDecorator)(nil) - _ Wrapper = (*mergeDecorator)(nil) - _ Decorator = (*placeHolderDecorator)(nil) -) - -// Merge wraps its decorator argument with intention to sync width -// with several decorators of another bar. Visual example: -// -// +----+--------+---------+--------+ -// | B1 | MERGE(D, P1, Pn) | -// +----+--------+---------+--------+ -// | B2 | D0 | D1 | Dn | -// +----+--------+---------+--------+ -func Merge(decorator Decorator, placeholders ...WC) Decorator { - if decorator == nil { - return nil - } - if _, ok := decorator.Sync(); !ok || len(placeholders) == 0 { - return decorator - } - md := &mergeDecorator{ - Decorator: decorator, - wc: decorator.GetConf(), - placeHolders: make([]Decorator, len(placeholders)), - } - decorator.SetConf(WC{}) - for i, wc := range placeholders { - if (wc.C & DSyncWidth) == 0 { - return decorator - } - md.placeHolders[i] = &placeHolderDecorator{wc.Init()} - } - return md -} - -type mergeDecorator struct { - Decorator - wc WC - placeHolders []Decorator -} - -func (d *mergeDecorator) GetConf() WC { - return d.wc -} - -func (d *mergeDecorator) SetConf(conf WC) { - d.wc = conf.Init() -} - -func (d *mergeDecorator) PlaceHolders() []Decorator { - return d.placeHolders -} - -func (d *mergeDecorator) Sync() (chan int, bool) { - return d.wc.Sync() -} - -func (d *mergeDecorator) Unwrap() Decorator { - return d.Decorator -} - -func (d *mergeDecorator) Decor(s Statistics) string { - msg := d.Decorator.Decor(s) - pureWidth := runewidth.StringWidth(msg) - stripWidth := runewidth.StringWidth(stripansi.Strip(msg)) - cellCount := stripWidth - if (d.wc.C & DextraSpace) != 0 { - cellCount++ - } - - total := runewidth.StringWidth(d.placeHolders[0].GetConf().FormatMsg("")) - pw := (cellCount - total) / len(d.placeHolders) - rem := (cellCount - total) % len(d.placeHolders) - - var diff int - for i := 1; i < len(d.placeHolders); i++ { - wc := d.placeHolders[i].GetConf() - width := pw - diff - if (wc.C & DextraSpace) != 0 { - width-- - if width < 0 { - width = 0 - } - } - max := runewidth.StringWidth(wc.FormatMsg(strings.Repeat(" ", width))) - total += max - diff = max - pw - } - - d.wc.wsync <- pw + rem - max := <-d.wc.wsync - return d.wc.fill(msg, max+total+(pureWidth-stripWidth)) -} - -type placeHolderDecorator struct { - WC -} - -func (d *placeHolderDecorator) Decor(Statistics) string { - return "" -}