code: func (f *fragment) rows(start uint64, filters ...rowFilter) []uint64 {
  	startKey := rowToKey(start)
  	i, _ := f.storage.Containers.Iterator(startKey)
  	rows := make([]uint64, 0)
  	var lastRow uint64 = math.MaxUint64
  
  	// Loop over the existing containers.
  	for i.Next() {
  		key, c := i.Value()
  
  		// virtual row for the current container
  		vRow := key >> shardVsContainerExponent
  
  		// skip dups
  		if vRow == lastRow {
  			continue
  		}
  
  		// apply filters
  		addRow, done := true, false
  		for _, filter := range filters {
  			var d bool
  			addRow, d = filter(vRow, key, c)
  			done = done || d
  			if !addRow {
  				break
  			}
  		}
  		if addRow {
  			lastRow = vRow
  			rows = append(rows, vRow)
  		}
  		if done {
  			return rows
  		}
  	}
  	return rows
  }
docs: // rows returns all rows starting from 'start'. Filters will be applied in
  // order. All filters must return true to include the row. Once a row is
  // included, further containers in that row will be skipped. So, for a row to be
  // included, there must be one container in that row where all filters return
  // true. For a row to be skipped, at least one filter must return false for each
  // container in that row (it need not be the same filter for each). Any filter
  // returning done == true will cause processing to stop after all filters for
  // this container have been processed. The rows accumulated up to this point
  // (including this row if all filters passed) will be returned.