@Override
  protected void createUpcomingSelection() {
    if (!rightSubSelectionIterator.hasNext()) {
      if (!leftSubSelectionIterator.hasNext()) {
        upcomingSelection = null;
        return;
      }
      leftSubSelection = leftSubSelectionIterator.next();

      if (!leftEqualsRight) {
        rightSubSelectionIterator = rightSubSelector.listIterator();
        if (!rightSubSelectionIterator.hasNext()) {
          upcomingSelection = null;
          return;
        }
      } else {
        // Select A-B, A-C, B-C. Do not select B-A, C-A, C-B. Do not select A-A, B-B, C-C.
        if (!leftSubSelectionIterator.hasNext()) {
          upcomingSelection = null;
          return;
        }
        rightSubSelectionIterator =
            rightSubSelector.listIterator(leftSubSelectionIterator.nextIndex());
        // rightEntityIterator's first hasNext() always returns true because of the nextIndex()
      }
    }
    SubS rightSubSelection = rightSubSelectionIterator.next();
    upcomingSelection = newSwapSelection(leftSubSelection, rightSubSelection);
  }
 public AbstractOriginalSwapIterator(
     ListIterable<SubS> leftSubSelector, ListIterable<SubS> rightSubSelector) {
   this.leftSubSelector = leftSubSelector;
   this.rightSubSelector = rightSubSelector;
   leftEqualsRight = (leftSubSelector == rightSubSelector);
   leftSubSelectionIterator = leftSubSelector.listIterator();
   rightSubSelectionIterator = IteratorUtils.emptyListIterator();
   createUpcomingSelection();
 }