code: func SplitFileLines(f *os.File, numParts int64) ([]*FileFragment, error) {
  	stats, err := f.Stat()
  	if err != nil {
  		return nil, err
  	}
  	splitSize := stats.Size() / numParts
  
  	ret := make([]*FileFragment, 0)
  	var startLoc int64
  	for {
  		endLoc, errSeek := seekAndSearch(f, splitSize, '\n')
  		if errSeek != nil && errSeek != io.EOF {
  			return nil, errors.Wrap(errSeek, "searching for next split location")
  		}
  		ff, err := NewFileFragment(f, startLoc, endLoc)
  		if err != nil {
  			return nil, errors.Wrap(err, "creating new file fragment")
  		}
  		ret = append(ret, ff)
  		if errSeek == io.EOF {
  			break
  		}
  		startLoc = endLoc
  	}
  	return ret, nil
  }
docs: // SplitFileLines returns a slice of file fragments which is numParts in length.
  // Each FileFragment will read a different section of the file, but the split
  // points are guaranteed to be on line breaks.