func NewCopyProgressPrinter() *CopyProgressPrinter {
	return &CopyProgressPrinter{
		results: make(chan error),
		cancel:  make(chan struct{}),
		pbp:     &ProgressBarPrinter{PadToBeEven: true},
	}
}
NewCopyProgressPrinter returns a new CopyProgressPrinter
package progressutil
import (
	"errors"
	"fmt"
	"io"
	"sync"
	"time"
)
var (
	ErrAlreadyStarted = errors.New("cannot add copies after PrintAndWait has been called")
)
type copyReader struct {
	reader  io.Reader
	current int64
	total   int64
	pb      *ProgressBar
}
func (cr *copyReader) Read(p []byte) (int, error) {
	n, err := cr.reader.Read(p)
	cr.current += int64(n)
	err1 := cr.updateProgressBar()
	if err == nil {
		err = err1
	}
	return n, err
}
func (cr *copyReader) updateProgressBar() error {
	cr.pb.SetPrintAfter(cr.formattedProgress())
	progress := float64(cr.current) / float64(cr.total)
	if progress > 1 {
		progress = 1
	}
	return cr.pb.SetCurrentProgress(progress)
}