diff --git a/example/cancel/main.go b/example/cancel/main.go deleted file mode 100644 index 429eeb1..0000000 --- a/example/cancel/main.go +++ /dev/null @@ -1,66 +0,0 @@ -//+build go1.7 - -package main - -import ( - "context" - "fmt" - "math/rand" - "sync" - "time" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -const ( - maxBlockSize = 12 -) - -func main() { - - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - defer cancel() - - p := mpb.New(mpb.WithContext(ctx)) - - var wg sync.WaitGroup - total := 100 - numBars := 3 - wg.Add(numBars) - - for i := 0; i < numBars; i++ { - name := fmt.Sprintf("Bar#%d:", i) - bar := 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++ { - select { - case <-ctx.Done(): - return - default: - } - sleep(blockSize) - bar.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 - } - }() - } - - wg.Wait() - p.Stop() - fmt.Println("stop") -} - -func sleep(blockSize int) { - time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) -} diff --git a/example/gifs/cancel.gif b/example/gifs/cancel.gif deleted file mode 100644 index fd08e3a..0000000 Binary files a/example/gifs/cancel.gif and /dev/null differ diff --git a/example/gifs/io-multiple.gif b/example/gifs/io-multiple.gif deleted file mode 100644 index da21595..0000000 Binary files a/example/gifs/io-multiple.gif and /dev/null differ diff --git a/example/gifs/remove.gif b/example/gifs/remove.gif deleted file mode 100644 index 54b7d99..0000000 Binary files a/example/gifs/remove.gif and /dev/null differ diff --git a/example/gifs/resize.gif b/example/gifs/resize.gif deleted file mode 100644 index 78bef86..0000000 Binary files a/example/gifs/resize.gif and /dev/null differ diff --git a/example/gifs/simple.gif b/example/gifs/simple.gif deleted file mode 100644 index 1f547e0..0000000 Binary files a/example/gifs/simple.gif and /dev/null differ diff --git a/example/gifs/single.gif b/example/gifs/single.gif deleted file mode 100644 index ed6c4e9..0000000 Binary files a/example/gifs/single.gif and /dev/null differ diff --git a/example/gifs/sort.gif b/example/gifs/sort.gif deleted file mode 100644 index 35e8260..0000000 Binary files a/example/gifs/sort.gif and /dev/null differ diff --git a/example/io/multiple/main.go b/example/io/multiple/main.go deleted file mode 100644 index bcf86bc..0000000 --- a/example/io/multiple/main.go +++ /dev/null @@ -1,82 +0,0 @@ -package main - -import ( - "fmt" - "io" - "log" - "net/http" - "os" - "path/filepath" - "sync" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -func main() { - log.SetOutput(os.Stderr) - - url1 := "https://homebrew.bintray.com/bottles/youtube-dl-2016.12.12.sierra.bottle.tar.gz" - url2 := "https://homebrew.bintray.com/bottles/libtiff-4.0.7.sierra.bottle.tar.gz" - - var wg sync.WaitGroup - p := mpb.New(mpb.WithWidth(64)) - - for i, url := range [...]string{url1, url2} { - wg.Add(1) - name := fmt.Sprintf("url%d:", i+1) - go download(&wg, p, name, url) - } - - wg.Wait() - p.Stop() - fmt.Println("Finished") -} - -func download(wg *sync.WaitGroup, p *mpb.Progress, name, url string) { - defer wg.Done() - resp, err := http.Get(url) - if err != nil { - log.Printf("%s: %v", name, err) - return - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - err = fmt.Errorf("non-200 status: %s", resp.Status) - log.Printf("%s: %v", name, err) - return - } - - size := resp.ContentLength - - // create dest - destName := filepath.Base(url) - dest, err := os.Create(destName) - if err != nil { - err = fmt.Errorf("Can't create %s: %v", destName, err) - log.Printf("%s: %v", name, err) - return - } - - // create bar with appropriate decorators - bar := p.AddBar(size, - mpb.PrependDecorators( - decor.Name(name, 0, 0), - decor.Counters("%3s / %3s", decor.Unit_KiB, 18, 0), - ), - mpb.AppendDecorators(decor.ETA(5, decor.DwidthSync)), - ) - - // create proxy reader - reader := bar.ProxyReader(resp.Body) - // and copy from reader - _, err = io.Copy(dest, reader) - - if closeErr := dest.Close(); err == nil { - err = closeErr - } - if err != nil { - log.Printf("%s: %v", name, err) - } -} diff --git a/example/io/single/main.go b/example/io/single/main.go deleted file mode 100644 index cb7e22c..0000000 --- a/example/io/single/main.go +++ /dev/null @@ -1,54 +0,0 @@ -package main - -import ( - "fmt" - "io" - "net/http" - "os" - "path/filepath" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -func main() { - url := "https://homebrew.bintray.com/bottles/libtiff-4.0.7.sierra.bottle.tar.gz" - - resp, err := http.Get(url) - if err != nil { - panic(err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - fmt.Printf("Server return non-200 status: %s\n", resp.Status) - return - } - - size := resp.ContentLength - - // create dest - destName := filepath.Base(url) - dest, err := os.Create(destName) - if err != nil { - fmt.Printf("Can't create %s: %v\n", destName, err) - return - } - defer dest.Close() - - p := mpb.New(mpb.WithWidth(64)) - - bar := p.AddBar(size, - mpb.PrependDecorators( - decor.Counters("%3s / %3s", decor.Unit_KiB, 18, 0), - )) - - // create proxy reader - reader := bar.ProxyReader(resp.Body) - - // and copy from reader, ignoring errors - io.Copy(dest, reader) - - p.Stop() // if you omit this line, rendering bars goroutine will quit early - fmt.Println("Finished") -} diff --git a/example/prependETA/main.go b/example/prependETA/main.go deleted file mode 100644 index d91b4c2..0000000 --- a/example/prependETA/main.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "sync" - "time" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -const ( - maxBlockSize = 12 -) - -func main() { - - p := mpb.New(mpb.WithWidth(64)) - - total := 100 - numBars := 3 - var wg sync.WaitGroup - wg.Add(numBars) - - for i := 0; i < numBars; i++ { - var name string - if i != 1 { - name = fmt.Sprintf("Bar#%d:", i) - } - b := p.AddBar(int64(total), - 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 - } - }() - } - - wg.Wait() - p.Stop() - fmt.Println("stop") -} - -func sleep(blockSize int) { - time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) -} diff --git a/example/prependElapsed/main.go b/example/prependElapsed/main.go deleted file mode 100644 index 97a5562..0000000 --- a/example/prependElapsed/main.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "sync" - "time" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -const ( - maxBlockSize = 12 -) - -func main() { - - p := mpb.New(mpb.WithWidth(64)) - - total := 100 - numBars := 3 - var wg sync.WaitGroup - wg.Add(numBars) - - for i := 0; i < numBars; i++ { - var name string - if i != 1 { - name = fmt.Sprintf("Bar#%d:", i) - } - 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() - fmt.Println("stop") -} - -func sleep(blockSize int) { - time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) -} diff --git a/example/remove/main.go b/example/remove/main.go deleted file mode 100644 index 65b5090..0000000 --- a/example/remove/main.go +++ /dev/null @@ -1,62 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "sync" - "time" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -const ( - maxBlockSize = 12 -) - -func main() { - - p := mpb.New(mpb.WithWidth(64)) - - total := 100 - numBars := 3 - var wg sync.WaitGroup - wg.Add(numBars) - - for i := 0; i < numBars; i++ { - var name string - if i != 1 { - name = fmt.Sprintf("Bar#%d:", i) - } - 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 - } - } - }() - } - - wg.Wait() - p.Stop() - fmt.Println("stop") -} - -func sleep(blockSize int) { - time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) -} diff --git a/example/simple/main.go b/example/simple/main.go deleted file mode 100644 index 70275c3..0000000 --- a/example/simple/main.go +++ /dev/null @@ -1,45 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "sync" - "time" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -func main() { - p := mpb.New() - total := 100 - numBars := 3 - var wg sync.WaitGroup - wg.Add(numBars) - - for i := 0; i < numBars; i++ { - name := fmt.Sprintf("Bar#%d:", i) - 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() - for i := 0; i < total; i++ { - time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) - bar.Incr(1) - } - }() - } - wg.Wait() // Wait for goroutines to finish - p.Stop() // Stop mpb's rendering goroutine -} diff --git a/example/singleBar/main.go b/example/singleBar/main.go deleted file mode 100644 index d8e8d78..0000000 --- a/example/singleBar/main.go +++ /dev/null @@ -1,36 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "time" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -func main() { - 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, - 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 - time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) - } - - // Don't forget to stop mpb's rendering goroutine - p.Stop() - fmt.Println("Stop") -} diff --git a/example/sort/main.go b/example/sort/main.go deleted file mode 100644 index 58eb435..0000000 --- a/example/sort/main.go +++ /dev/null @@ -1,77 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "sort" - "sync" - "time" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -const ( - maxBlockSize = 12 -) - -type barSlice []*mpb.Bar - -func (bs barSlice) Len() int { return len(bs) } - -func (bs barSlice) Less(i, j int) bool { - ip := decor.CalcPercentage(bs[i].Total(), bs[i].Current(), 100) - jp := decor.CalcPercentage(bs[j].Total(), bs[j].Current(), 100) - return ip < jp -} - -func (bs barSlice) Swap(i, j int) { bs[i], bs[j] = bs[j], bs[i] } - -func sortByProgressFunc() mpb.BeforeRender { - return func(bars []*mpb.Bar) { - sort.Sort(sort.Reverse(barSlice(bars))) - } -} - -func main() { - - p := mpb.New(mpb.WithWidth(64), mpb.WithBeforeRenderFunc(sortByProgressFunc())) - - total := 100 - numBars := 3 - var wg sync.WaitGroup - wg.Add(numBars) - - for i := 0; i < numBars; i++ { - var name string - if i != 1 { - name = fmt.Sprintf("Bar#%d:", i) - } - 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() - fmt.Println("stop") -} - -func sleep(blockSize int) { - time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) -} diff --git a/example/stress/main.go b/example/stress/main.go deleted file mode 100644 index 7e1dc6d..0000000 --- a/example/stress/main.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - "sync" - "time" - - "github.com/vbauerster/mpb" - "github.com/vbauerster/mpb/decor" -) - -const ( - totalBars = 32 - maxBlockSize = 8 -) - -func main() { - - var wg sync.WaitGroup - p := mpb.New() - wg.Add(totalBars) - - for i := 0; i < totalBars; i++ { - name := fmt.Sprintf("Bar#%02d: ", i) - total := rand.Intn(120) + 10 - 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() - blockSize := rand.Intn(maxBlockSize) + 1 - for i := 0; i < total; i++ { - sleep(blockSize) - bar.Incr(1) - blockSize = rand.Intn(maxBlockSize) + 1 - } - }() - } - - wg.Wait() - p.Stop() - fmt.Println("stop") -} - -func sleep(blockSize int) { - time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) -} diff --git a/examples/cancel/main.go b/examples/cancel/main.go new file mode 100644 index 0000000..429eeb1 --- /dev/null +++ b/examples/cancel/main.go @@ -0,0 +1,66 @@ +//+build go1.7 + +package main + +import ( + "context" + "fmt" + "math/rand" + "sync" + "time" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +const ( + maxBlockSize = 12 +) + +func main() { + + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + p := mpb.New(mpb.WithContext(ctx)) + + var wg sync.WaitGroup + total := 100 + numBars := 3 + wg.Add(numBars) + + for i := 0; i < numBars; i++ { + name := fmt.Sprintf("Bar#%d:", i) + bar := 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++ { + select { + case <-ctx.Done(): + return + default: + } + sleep(blockSize) + bar.Incr(1) + blockSize = rand.Intn(maxBlockSize) + 1 + } + }() + } + + wg.Wait() + p.Stop() + fmt.Println("stop") +} + +func sleep(blockSize int) { + time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) +} diff --git a/examples/gifs/cancel.gif b/examples/gifs/cancel.gif new file mode 100644 index 0000000..fd08e3a Binary files /dev/null and b/examples/gifs/cancel.gif differ diff --git a/examples/gifs/io-multiple.gif b/examples/gifs/io-multiple.gif new file mode 100644 index 0000000..da21595 Binary files /dev/null and b/examples/gifs/io-multiple.gif differ diff --git a/examples/gifs/remove.gif b/examples/gifs/remove.gif new file mode 100644 index 0000000..54b7d99 Binary files /dev/null and b/examples/gifs/remove.gif differ diff --git a/examples/gifs/resize.gif b/examples/gifs/resize.gif new file mode 100644 index 0000000..78bef86 Binary files /dev/null and b/examples/gifs/resize.gif differ diff --git a/examples/gifs/simple.gif b/examples/gifs/simple.gif new file mode 100644 index 0000000..1f547e0 Binary files /dev/null and b/examples/gifs/simple.gif differ diff --git a/examples/gifs/single.gif b/examples/gifs/single.gif new file mode 100644 index 0000000..ed6c4e9 Binary files /dev/null and b/examples/gifs/single.gif differ diff --git a/examples/gifs/sort.gif b/examples/gifs/sort.gif new file mode 100644 index 0000000..35e8260 Binary files /dev/null and b/examples/gifs/sort.gif differ diff --git a/examples/io/multiple/main.go b/examples/io/multiple/main.go new file mode 100644 index 0000000..bcf86bc --- /dev/null +++ b/examples/io/multiple/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "fmt" + "io" + "log" + "net/http" + "os" + "path/filepath" + "sync" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +func main() { + log.SetOutput(os.Stderr) + + url1 := "https://homebrew.bintray.com/bottles/youtube-dl-2016.12.12.sierra.bottle.tar.gz" + url2 := "https://homebrew.bintray.com/bottles/libtiff-4.0.7.sierra.bottle.tar.gz" + + var wg sync.WaitGroup + p := mpb.New(mpb.WithWidth(64)) + + for i, url := range [...]string{url1, url2} { + wg.Add(1) + name := fmt.Sprintf("url%d:", i+1) + go download(&wg, p, name, url) + } + + wg.Wait() + p.Stop() + fmt.Println("Finished") +} + +func download(wg *sync.WaitGroup, p *mpb.Progress, name, url string) { + defer wg.Done() + resp, err := http.Get(url) + if err != nil { + log.Printf("%s: %v", name, err) + return + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + err = fmt.Errorf("non-200 status: %s", resp.Status) + log.Printf("%s: %v", name, err) + return + } + + size := resp.ContentLength + + // create dest + destName := filepath.Base(url) + dest, err := os.Create(destName) + if err != nil { + err = fmt.Errorf("Can't create %s: %v", destName, err) + log.Printf("%s: %v", name, err) + return + } + + // create bar with appropriate decorators + bar := p.AddBar(size, + mpb.PrependDecorators( + decor.Name(name, 0, 0), + decor.Counters("%3s / %3s", decor.Unit_KiB, 18, 0), + ), + mpb.AppendDecorators(decor.ETA(5, decor.DwidthSync)), + ) + + // create proxy reader + reader := bar.ProxyReader(resp.Body) + // and copy from reader + _, err = io.Copy(dest, reader) + + if closeErr := dest.Close(); err == nil { + err = closeErr + } + if err != nil { + log.Printf("%s: %v", name, err) + } +} diff --git a/examples/io/single/main.go b/examples/io/single/main.go new file mode 100644 index 0000000..cb7e22c --- /dev/null +++ b/examples/io/single/main.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "io" + "net/http" + "os" + "path/filepath" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +func main() { + url := "https://homebrew.bintray.com/bottles/libtiff-4.0.7.sierra.bottle.tar.gz" + + resp, err := http.Get(url) + if err != nil { + panic(err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + fmt.Printf("Server return non-200 status: %s\n", resp.Status) + return + } + + size := resp.ContentLength + + // create dest + destName := filepath.Base(url) + dest, err := os.Create(destName) + if err != nil { + fmt.Printf("Can't create %s: %v\n", destName, err) + return + } + defer dest.Close() + + p := mpb.New(mpb.WithWidth(64)) + + bar := p.AddBar(size, + mpb.PrependDecorators( + decor.Counters("%3s / %3s", decor.Unit_KiB, 18, 0), + )) + + // create proxy reader + reader := bar.ProxyReader(resp.Body) + + // and copy from reader, ignoring errors + io.Copy(dest, reader) + + p.Stop() // if you omit this line, rendering bars goroutine will quit early + fmt.Println("Finished") +} diff --git a/examples/prependETA/main.go b/examples/prependETA/main.go new file mode 100644 index 0000000..d91b4c2 --- /dev/null +++ b/examples/prependETA/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "math/rand" + "sync" + "time" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +const ( + maxBlockSize = 12 +) + +func main() { + + p := mpb.New(mpb.WithWidth(64)) + + total := 100 + numBars := 3 + var wg sync.WaitGroup + wg.Add(numBars) + + for i := 0; i < numBars; i++ { + var name string + if i != 1 { + name = fmt.Sprintf("Bar#%d:", i) + } + b := p.AddBar(int64(total), + 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 + } + }() + } + + wg.Wait() + p.Stop() + fmt.Println("stop") +} + +func sleep(blockSize int) { + time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) +} diff --git a/examples/prependElapsed/main.go b/examples/prependElapsed/main.go new file mode 100644 index 0000000..97a5562 --- /dev/null +++ b/examples/prependElapsed/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "math/rand" + "sync" + "time" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +const ( + maxBlockSize = 12 +) + +func main() { + + p := mpb.New(mpb.WithWidth(64)) + + total := 100 + numBars := 3 + var wg sync.WaitGroup + wg.Add(numBars) + + for i := 0; i < numBars; i++ { + var name string + if i != 1 { + name = fmt.Sprintf("Bar#%d:", i) + } + 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() + fmt.Println("stop") +} + +func sleep(blockSize int) { + time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) +} diff --git a/examples/remove/main.go b/examples/remove/main.go new file mode 100644 index 0000000..65b5090 --- /dev/null +++ b/examples/remove/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "fmt" + "math/rand" + "sync" + "time" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +const ( + maxBlockSize = 12 +) + +func main() { + + p := mpb.New(mpb.WithWidth(64)) + + total := 100 + numBars := 3 + var wg sync.WaitGroup + wg.Add(numBars) + + for i := 0; i < numBars; i++ { + var name string + if i != 1 { + name = fmt.Sprintf("Bar#%d:", i) + } + 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 + } + } + }() + } + + wg.Wait() + p.Stop() + fmt.Println("stop") +} + +func sleep(blockSize int) { + time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) +} diff --git a/examples/simple/main.go b/examples/simple/main.go new file mode 100644 index 0000000..70275c3 --- /dev/null +++ b/examples/simple/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + "math/rand" + "sync" + "time" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +func main() { + p := mpb.New() + total := 100 + numBars := 3 + var wg sync.WaitGroup + wg.Add(numBars) + + for i := 0; i < numBars; i++ { + name := fmt.Sprintf("Bar#%d:", i) + 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() + for i := 0; i < total; i++ { + time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) + bar.Incr(1) + } + }() + } + wg.Wait() // Wait for goroutines to finish + p.Stop() // Stop mpb's rendering goroutine +} diff --git a/examples/singleBar/main.go b/examples/singleBar/main.go new file mode 100644 index 0000000..d8e8d78 --- /dev/null +++ b/examples/singleBar/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "fmt" + "math/rand" + "time" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +func main() { + 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, + 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 + time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) + } + + // Don't forget to stop mpb's rendering goroutine + p.Stop() + fmt.Println("Stop") +} diff --git a/examples/sort/main.go b/examples/sort/main.go new file mode 100644 index 0000000..58eb435 --- /dev/null +++ b/examples/sort/main.go @@ -0,0 +1,77 @@ +package main + +import ( + "fmt" + "math/rand" + "sort" + "sync" + "time" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +const ( + maxBlockSize = 12 +) + +type barSlice []*mpb.Bar + +func (bs barSlice) Len() int { return len(bs) } + +func (bs barSlice) Less(i, j int) bool { + ip := decor.CalcPercentage(bs[i].Total(), bs[i].Current(), 100) + jp := decor.CalcPercentage(bs[j].Total(), bs[j].Current(), 100) + return ip < jp +} + +func (bs barSlice) Swap(i, j int) { bs[i], bs[j] = bs[j], bs[i] } + +func sortByProgressFunc() mpb.BeforeRender { + return func(bars []*mpb.Bar) { + sort.Sort(sort.Reverse(barSlice(bars))) + } +} + +func main() { + + p := mpb.New(mpb.WithWidth(64), mpb.WithBeforeRenderFunc(sortByProgressFunc())) + + total := 100 + numBars := 3 + var wg sync.WaitGroup + wg.Add(numBars) + + for i := 0; i < numBars; i++ { + var name string + if i != 1 { + name = fmt.Sprintf("Bar#%d:", i) + } + 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() + fmt.Println("stop") +} + +func sleep(blockSize int) { + time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) +} diff --git a/examples/stress/main.go b/examples/stress/main.go new file mode 100644 index 0000000..7e1dc6d --- /dev/null +++ b/examples/stress/main.go @@ -0,0 +1,55 @@ +package main + +import ( + "fmt" + "math/rand" + "sync" + "time" + + "github.com/vbauerster/mpb" + "github.com/vbauerster/mpb/decor" +) + +const ( + totalBars = 32 + maxBlockSize = 8 +) + +func main() { + + var wg sync.WaitGroup + p := mpb.New() + wg.Add(totalBars) + + for i := 0; i < totalBars; i++ { + name := fmt.Sprintf("Bar#%02d: ", i) + total := rand.Intn(120) + 10 + 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() + blockSize := rand.Intn(maxBlockSize) + 1 + for i := 0; i < total; i++ { + sleep(blockSize) + bar.Incr(1) + blockSize = rand.Intn(maxBlockSize) + 1 + } + }() + } + + wg.Wait() + p.Stop() + fmt.Println("stop") +} + +func sleep(blockSize int) { + time.Sleep(time.Duration(blockSize) * (50*time.Millisecond + time.Duration(rand.Intn(5*int(time.Millisecond))))) +}