code: function(protoIRs) {
        var newPIRs = [];
        while (protoIRs.length) {
          var pir = protoIRs.shift();
          newPIRs.push(pir);
  
          // Only consider Responses for now.
          if (pir.irType !== ProtoIR.RESPONSE_TYPE)
            continue;
  
          for (var i = 0; i < protoIRs.length; ++i) {
            var otherPIR = protoIRs[i];
  
            if (otherPIR.irType !== pir.irType)
              continue;
  
            if (!otherPIR.intersects(pir))
              continue;
  
            // Don't merge together Responses of the same type.
            // If handleTouchEvents wanted two of its Responses to be merged, then
            // it would have made them that way to begin with.
            var typeNames = pir.associatedEvents.map(function(event) {
              return event.typeName;
            });
            if (otherPIR.containsTypeNames(typeNames))
              continue;
  
            pir.merge(otherPIR);
            protoIRs.splice(i, 1);
            // Don't skip the next otherPIR!
            --i;
          }
        }
        return newPIRs;
      }
docs: TouchStarts happen at the same time as ScrollBegins. It's easier to let multiple handlers create multiple overlapping Responses and then merge them, rather than make the handlers aware of the other handlers' PIRs.  For example: RR RRR  -> RRRRR RR  protoIRs is input only. Returns a modified set of ProtoIRs.