docs: public static void mergeSort(int fromIndex, int toIndex, IntComparator c, Swapper swapper) {
  	/*
  		We retain the same method signature as quickSort.
  		Given only a comparator and swapper we do not know how to copy and move elements from/to temporary arrays.
  		Hence, in contrast to the JDK mergesorts this is an "in-place" mergesort, i.e. does not allocate any temporary arrays.
  		A non-inplace mergesort would perhaps be faster in most cases, but would require non-intuitive delegate objects...
  	*/
  	int length = toIndex - fromIndex;
  
  	// Insertion sort on smallest arrays
  	if (length < SMALL) {
  		for (int i = fromIndex; i < toIndex; i++) {
  			for (int j = i; j > fromIndex && (c.compare(j - 1, j) > 0); j--) {
  				swapper.swap(j, j - 1);
  			}
  		}
  		return;
  	}
  
  	// Recursively sort halves
  	int mid = (fromIndex + toIndex) / 2;
  	mergeSort(fromIndex, mid, c, swapper);
  	mergeSort(mid, toIndex, c, swapper);
  
  	// If list is already sorted, nothing left to do.  This is an
  	// optimization that results in faster sorts for nearly ordered lists.
  	if (c.compare(mid - 1, mid) <= 0) return;
  
  	// Merge sorted halves 
  	inplace_merge(fromIndex, mid, toIndex, c, swapper);
  }