code: func (p *PeekingSource) Peek() (interface{}, error) {
  	p.mu.RLock()
  	var err error
  
  	if p.rec != nil {
  		defer p.mu.RUnlock()
  		return p.rec, nil
  	} else {
  		// Exchange read lock for write lock and recheck p.rec
  		p.mu.RUnlock()
  		p.mu.Lock()
  		if p.rec != nil {
  			p.mu.Unlock()
  			return p.Peek()
  		}
  		p.rec, err = p.Source.Record()
  		defer p.mu.Unlock()
  		if err != nil {
  			return nil, errors.Wrap(err, "getting next record for peeking")
  		} else {
  			return p.rec, nil
  		}
  	}
  }
docs: // Peek returns a copy of the next record in the underlying source, without
  // discarding it, so the following call to Record() will return the same data
  // as if Peek had not been called.