code: func (r *Reader) Read(p []byte) (int, error) {
  	// If we haven't drawn before, initialize the progress bar
  	if r.lastDraw.IsZero() {
  		r.initProgress()
  	}
  
  	// Read from the underlying source
  	n, err := r.Reader.Read(p)
  
  	// Always increment the progress even if there was an error
  	r.progress += int64(n)
  
  	// If we don't have any errors, then draw the progress. If we are
  	// at the end of the data, then finish the progress.
  	if err == nil {
  		// Only draw if we read data or we've never read data before (to
  		// initialize the progress bar).
  		if n > 0 {
  			r.drawProgress()
  		}
  	}
  	if err == io.EOF {
  		r.finishProgress()
  	}
  
  	return n, err
  }
docs: // Read reads from the underlying reader and invokes the DrawFunc if
  // appropriate. The DrawFunc is executed when there is data that is
  // read (progress is made) and at least DrawInterval time has passed.