function receiveTouches(eventTopLevelType, touches, changedIndices) {
  var changedTouches =
    eventTopLevelType === "topTouchEnd" ||
    eventTopLevelType === "topTouchCancel"
      ? removeTouchesAtIndices(touches, changedIndices)
      : touchSubsequence(touches, changedIndices);

  for (var jj = 0; jj < changedTouches.length; jj++) {
    var touch = changedTouches[jj];
    // Touch objects can fulfill the role of `DOM` `Event` objects if we set
    // the `changedTouches`/`touches`. This saves allocations.
    touch.changedTouches = changedTouches;
    touch.touches = touches;
    var nativeEvent = touch;
    var rootNodeID = null;
    var target = nativeEvent.target;
    if (target !== null && target !== undefined) {
      if (target < ReactNativeTagHandles.tagsStartAt) {
        {
          warning(
            false,
            "A view is reporting that a touch occurred on tag zero."
          );
        }
      } else {
        rootNodeID = target;
      }
    }
    // $FlowFixMe Shouldn't we *not* call it if rootNodeID is null?
    _receiveRootNodeIDEvent(rootNodeID, eventTopLevelType, nativeEvent);
  }
}
Simple multi-wrapper around `receiveEvent` that is intended to receive an
efficient representation of `Touch` objects, and other information that
can be used to construct W3C compliant `Event` and `Touch` lists.

This may create dispatch behavior that differs than web touch handling. We
loop through each of the changed touches and receive it as a single event.
So two `touchStart`/`touchMove`s that occur simultaneously are received as
two separate touch event dispatches - when they arguably should be one.

This implementation reuses the `Touch` objects themselves as the `Event`s
since we dispatch an event for each touch (though that might not be spec
compliant). The main purpose of reusing them is to save allocations.

TODO: Dispatch multiple changed touches in one event. The bubble path
could be the first common ancestor of all the `changedTouches`.

One difference between this behavior and W3C spec: cancelled touches will
not appear in `.touches`, or in any future `.touches`, though they may
still be "actively touching the surface".

Web desktop polyfills only need to construct a fake touch event with
identifier 0, also abandoning traditional click handlers.