updateProcessingState = function( groupFieldState, stateIndex ) {
          var fieldValue = grid.getCellValue(row, groupFieldState.col);

          // look for change of value - and insert a header
          if ( !groupFieldState.initialised || rowSorter.getSortFn(groupFieldState.col)(fieldValue, groupFieldState.currentValue) !== 0 ) {
            service.insertGroupHeader( grid, renderableRows, i, processingState, stateIndex );
            i++;
          }
        }
@ngdoc function
@name groupRows
@methodOf  ui.grid.grouping.service:uiGridGroupingService
@description The rowProcessor that creates the groupHeaders (i.e. does
the actual grouping).

Assumes it is always called after the sorting processor, guaranteed by the priority setting

Processes all the rows in order, inserting a groupHeader row whenever there is a change
in value of a grouped row, based on the sortAlgorithm used for the column.  The group header row
is looked up in the groupHeaderCache, and used from there if there is one. The entity is reset
to {} if one is found.

As it processes it maintains a `processingState` array. This records, for each level of grouping we're
working with, the following information:
```
  {
    fieldName: name,
    col: col,
    initialised: boolean,
    currentValue: value,
    currentRow: gridRow,
  }
```
We look for changes in the currentValue at any of the levels.  Where we find a change we:

- create a new groupHeader row in the array

@param {array} renderableRows the rows we want to process, usually the output from the previous rowProcessor
@returns {array} the updated rows, including our new group rows