code: func (r *reader) Read(b []byte) (int, error) {
  	n, err := r.r.Read(b)
  	r.pos += int64(n)
  
  	if err != nil && err != io.EOF {
  		return n, err
  	}
  
  	q := readerReport{
  		t:    time.Now(),
  		pos:  r.pos,
  		size: r.size,
  		bps:  &r.bps,
  	}
  
  	select {
  	case r.ch <- q:
  	case <-r.ctx.Done():
  	}
  
  	return n, err
  }
docs: // Read calls the Read function on the underlying io.Reader. Additionally,
  // every read causes a progress report to be sent to the progress reader's
  // underlying channel.