diff --git a/example/cancel/main.go b/example/cancel/main.go index 9feea1e..429eeb1 100644 --- a/example/cancel/main.go +++ b/example/cancel/main.go @@ -41,10 +41,7 @@ ), ) go func() { - defer func() { - // fmt.Printf("%s done\n", name) - wg.Done() - }() + defer wg.Done() blockSize := rand.Intn(maxBlockSize) + 1 for i := 0; i < total; i++ { select { diff --git a/example/prependElapsed/main.go b/example/prependElapsed/main.go index e39e387..97a5562 100644 --- a/example/prependElapsed/main.go +++ b/example/prependElapsed/main.go @@ -7,6 +7,7 @@ "time" "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" ) const ( @@ -15,61 +16,40 @@ func main() { + p := mpb.New(mpb.WithWidth(64)) + + total := 100 + numBars := 3 var wg sync.WaitGroup - p := mpb.New().SetWidth(64) + wg.Add(numBars) - name1 := "Bar#1:" - bar1 := p.AddBar(50). - PrependName(name1, 0, mpb.DwidthSync|mpb.DidentRight). - PrependElapsed(3, mpb.DwidthSync|mpb.DextraSpace). - AppendPercentage(5, 0) - - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 50; i++ { - sleep(blockSize) - bar1.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 + for i := 0; i < numBars; i++ { + var name string + if i != 1 { + name = fmt.Sprintf("Bar#%d:", i) } - }() - - bar2 := p.AddBar(100). - PrependName("", 0, mpb.DwidthSync). - PrependElapsed(3, mpb.DwidthSync|mpb.DextraSpace). - AppendPercentage(5, 0) - - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 100; i++ { - sleep(blockSize) - bar2.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 - } - }() - - bar3 := p.AddBar(80). - PrependName("Bar#3:", 0, mpb.DwidthSync|mpb.DidentRight). - PrependElapsed(3, mpb.DwidthSync|mpb.DextraSpace). - AppendPercentage(5, 0) - - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 80; i++ { - sleep(blockSize) - bar3.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 - } - }() + b := p.AddBar(int64(total), + mpb.PrependDecorators( + decor.Name(name, 0, decor.DwidthSync|decor.DidentRight), + decor.Elapsed(3, decor.DSyncSpace), + ), + mpb.AppendDecorators( + decor.Percentage(5, 0), + ), + ) + go func() { + defer wg.Done() + blockSize := rand.Intn(maxBlockSize) + 1 + for i := 0; i < total; i++ { + sleep(blockSize) + b.Incr(1) + blockSize = rand.Intn(maxBlockSize) + 1 + } + }() + } wg.Wait() p.Stop() - // p.AddBar(1) // panic: you cannot reuse p, create new one! fmt.Println("stop") } diff --git a/example/remove/main.go b/example/remove/main.go index 9d7ff0f..65b5090 100644 --- a/example/remove/main.go +++ b/example/remove/main.go @@ -7,6 +7,7 @@ "time" "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" ) const ( @@ -15,62 +16,44 @@ func main() { + p := mpb.New(mpb.WithWidth(64)) + + total := 100 + numBars := 3 var wg sync.WaitGroup - p := mpb.New().SetWidth(64) + wg.Add(numBars) - name1 := "Bar#1:" - bar1 := p.AddBar(50). - PrependName(name1, 0, mpb.DwidthSync|mpb.DidentRight). - PrependETA(4, mpb.DwidthSync|mpb.DextraSpace). - AppendPercentage(5, 0) - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 50; i++ { - sleep(blockSize) - bar1.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 + for i := 0; i < numBars; i++ { + var name string + if i != 1 { + name = fmt.Sprintf("Bar#%d:", i) } - }() - - bar2 := p.AddBar(100). - PrependName("", 0, mpb.DwidthSync). - PrependETA(4, mpb.DwidthSync|mpb.DextraSpace). - AppendPercentage(5, 0) - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 100; i++ { - sleep(blockSize) - bar2.Incr(1) - stat := bar2.GetStatistics() - if stat.Current > 42 && p.RemoveBar(bar2) { - break + b := p.AddBar(int64(total), mpb.BarID(i), + mpb.PrependDecorators( + decor.Name(name, 0, decor.DwidthSync|decor.DidentRight), + decor.ETA(4, decor.DSyncSpace), + ), + mpb.AppendDecorators( + decor.Percentage(5, 0), + ), + ) + go func() { + defer wg.Done() + blockSize := rand.Intn(maxBlockSize) + 1 + for i := 0; i < total; i++ { + sleep(blockSize) + b.Incr(1) + blockSize = rand.Intn(maxBlockSize) + 1 + if b.ID() == 1 && i >= 42 { + p.RemoveBar(b) + return + } } - blockSize = rand.Intn(maxBlockSize) + 1 - } - }() - - bar3 := p.AddBar(80). - PrependName("Bar#3:", 0, mpb.DwidthSync|mpb.DidentRight). - PrependETA(4, mpb.DwidthSync|mpb.DextraSpace). - AppendPercentage(5, 0) - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 80; i++ { - sleep(blockSize) - bar3.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 - } - }() + }() + } wg.Wait() p.Stop() - // p.AddBar(2) // panic: you cannot reuse p, create new one! fmt.Println("stop") } diff --git a/example/simple/main.go b/example/simple/main.go index 74eab83..70275c3 100644 --- a/example/simple/main.go +++ b/example/simple/main.go @@ -7,26 +7,34 @@ "time" "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" ) func main() { + p := mpb.New() + total := 100 + numBars := 3 var wg sync.WaitGroup - p := mpb.New() - wg.Add(3) // add wg delta - for i := 0; i < 3; i++ { + wg.Add(numBars) + + for i := 0; i < numBars; i++ { name := fmt.Sprintf("Bar#%d:", i) - bar := p.AddBar(100). - PrependName(name, len(name), 0). - // Prepend Percentage decorator and sync width - PrependPercentage(3, mpb.DwidthSync|mpb.DextraSpace). - // Append ETA and don't sync width - AppendETA(2, 0) + bar := p.AddBar(int64(total), + mpb.PrependDecorators( + // Name decorator with minWidth and no width sync + decor.Name(name, len(name), 0), + // Percentage decorator with DwidthSync and DextraSpace + decor.Percentage(3, decor.DSyncSpace), + ), + mpb.AppendDecorators( + // ETA decorator, with no width sync + decor.ETA(2, 0), + ), + ) + go func() { defer wg.Done() - // you can p.AddBar() here, but ordering will be non deterministic - // if you still need p.AddBar() here and maintain ordering, use - // (*mpb.Progress).BeforeRenderFunc(f mpb.BeforeRender) - for i := 0; i < 100; i++ { + for i := 0; i < total; i++ { time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) bar.Incr(1) } diff --git a/example/singleBar/main.go b/example/singleBar/main.go index 7af4672..d8e8d78 100644 --- a/example/singleBar/main.go +++ b/example/singleBar/main.go @@ -6,21 +6,24 @@ "time" "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" ) func main() { - // Star mpb's rendering goroutine. - p := mpb.New() - // Set custom width for every bar, which mpb will render - // The default one in 80 - p.SetWidth(100) - // Set custom format for every bar, the default one is "[=>-]" - p.Format("╢▌▌░╟") - // Set custom refresh rate, the default one is 100 ms - p.RefreshRate(120 * time.Millisecond) + p := mpb.New( + // Override default (80) width + mpb.WithWidth(100), + // Override default "[=>-]" format + mpb.WithFormat("╢▌▌░╟"), + // Override default 100ms refresh rate + mpb.WithRefreshRate(120*time.Millisecond), + ) // Add a bar. You're not limited to just one bar, add many if you need. - bar := p.AddBar(100).PrependName("Single Bar:", 0, 0).AppendPercentage(5, 0) + bar := p.AddBar(100, + mpb.PrependDecorators(decor.Name("Single Bar:", 0, 0)), + mpb.AppendDecorators(decor.Percentage(5, 0)), + ) for i := 0; i < 100; i++ { bar.Incr(1) // increment progress bar diff --git a/example/sort/main.go b/example/sort/main.go index 449f1ca..58eb435 100644 --- a/example/sort/main.go +++ b/example/sort/main.go @@ -8,6 +8,7 @@ "time" "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" ) const ( @@ -19,10 +20,8 @@ func (bs barSlice) Len() int { return len(bs) } func (bs barSlice) Less(i, j int) bool { - is := bs[i].GetStatistics() - js := bs[j].GetStatistics() - ip := percentage(is.Total, is.Current, 100) - jp := percentage(js.Total, js.Current, 100) + ip := decor.CalcPercentage(bs[i].Total(), bs[i].Current(), 100) + jp := decor.CalcPercentage(bs[j].Total(), bs[j].Current(), 100) return ip < jp } @@ -34,67 +33,42 @@ } } -func percentage(total, current int64, ratio int) int { - if total == 0 || current > total { - return 0 - } - return int(float64(ratio) * float64(current) / float64(total)) -} - func main() { + p := mpb.New(mpb.WithWidth(64), mpb.WithBeforeRenderFunc(sortByProgressFunc())) + + total := 100 + numBars := 3 var wg sync.WaitGroup - p := mpb.New().SetWidth(60).BeforeRenderFunc(sortByProgressFunc()) + wg.Add(numBars) - name1 := "Bar#1:" - bar1 := p.AddBar(100). - PrependName(name1, 0, mpb.DwidthSync). - PrependCounters("%3s/%3s", 0, 10, mpb.DwidthSync|mpb.DextraSpace). - AppendETA(3, 0) - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 100; i++ { - sleep(blockSize) - bar1.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 + for i := 0; i < numBars; i++ { + var name string + if i != 1 { + name = fmt.Sprintf("Bar#%d:", i) } - }() - - bar2 := p.AddBar(60). - PrependName("", 0, mpb.DwidthSync). - PrependCounters("%3s/%3s", 0, 10, mpb.DwidthSync|mpb.DextraSpace). - AppendETA(3, 0) - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 60; i++ { - sleep(blockSize) - bar2.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 - } - }() - - bar3 := p.AddBar(80). - PrependName("Bar#3:", 0, mpb.DwidthSync). - PrependCounters("%3s/%3s", 0, 10, mpb.DwidthSync|mpb.DextraSpace). - AppendETA(3, 0) - wg.Add(1) - go func() { - defer wg.Done() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < 80; i++ { - sleep(blockSize) - bar3.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 - } - }() + b := p.AddBar(int64(total), + mpb.PrependDecorators( + decor.Name(name, 0, decor.DwidthSync), + decor.Counters("%3s/%3s", 0, 10, decor.DSyncSpace), + ), + mpb.AppendDecorators( + decor.ETA(3, 0), + ), + ) + go func() { + defer wg.Done() + blockSize := rand.Intn(maxBlockSize) + 1 + for i := 0; i < total; i++ { + sleep(blockSize) + b.Incr(1) + blockSize = rand.Intn(maxBlockSize) + 1 + } + }() + } wg.Wait() p.Stop() - // p.AddBar(1) // panic: you cannot reuse p, create new one! fmt.Println("stop") } diff --git a/example/stress/main.go b/example/stress/main.go index 028730d..7e1dc6d 100644 --- a/example/stress/main.go +++ b/example/stress/main.go @@ -7,6 +7,7 @@ "time" "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" ) const ( @@ -23,10 +24,15 @@ for i := 0; i < totalBars; i++ { name := fmt.Sprintf("Bar#%02d: ", i) total := rand.Intn(120) + 10 - bar := p.AddBar(int64(total)). - PrependName(name, len(name), 0). - PrependETA(4, mpb.DwidthSync|mpb.DextraSpace). - AppendPercentage(5, 0) + bar := p.AddBar(int64(total), + mpb.PrependDecorators( + decor.Name(name, len(name), 0), + decor.ETA(4, decor.DSyncSpace), + ), + mpb.AppendDecorators( + decor.Percentage(5, 0), + ), + ) go func() { defer wg.Done() @@ -41,7 +47,6 @@ wg.Wait() p.Stop() - // p.AddBar(1) // panic: you cannot reuse p, create new one! fmt.Println("stop") }