package mpb import ( "errors" "io" "time" ) // errInvalidWrite means that a write returned an impossible count. var errInvalidWrite = errors.New("invalid write result") // copyBuffer is a shameless copy paste of the same function from std lib's io.go with necessary // changes to track ewma counters. func copyBuffer(bar *Bar, dst io.Writer, src io.Reader, buf []byte) (written int64, err error) { if buf == nil { size := 32 * 1024 if l, ok := src.(*io.LimitedReader); ok && int64(size) > l.N { if l.N < 1 { size = 1 } else { size = int(l.N) } } buf = make([]byte, size) } for { start := time.Now() nr, er := src.Read(buf) if nr > 0 { nw, ew := dst.Write(buf[0:nr]) if nw < 0 || nr < nw { nw = 0 if ew == nil { ew = errInvalidWrite } } written += int64(nw) bar.EwmaIncrBy(nw, time.Since(start)) if ew != nil { err = ew break } if nr != nw { err = io.ErrShortWrite break } } else { bar.EwmaIncrBy(0, time.Since(start)) } if er != nil { if er != io.EOF { err = er } break } } return written, err }