in lib/src/algorithms.dart [349:393]
void _merge<E, K>(
K Function(E element) keyOf,
int Function(K, K) compare,
List<E> firstList,
int firstStart,
int firstEnd,
List<E> secondList,
int secondStart,
int secondEnd,
List<E> target,
int targetOffset) {
// No empty lists reaches here.
assert(firstStart < firstEnd);
assert(secondStart < secondEnd);
var cursor1 = firstStart;
var cursor2 = secondStart;
var firstElement = firstList[cursor1++];
var firstKey = keyOf(firstElement);
var secondElement = secondList[cursor2++];
var secondKey = keyOf(secondElement);
while (true) {
if (compare(firstKey, secondKey) <= 0) {
target[targetOffset++] = firstElement;
if (cursor1 == firstEnd) break; // Flushing second list after loop.
firstElement = firstList[cursor1++];
firstKey = keyOf(firstElement);
} else {
target[targetOffset++] = secondElement;
if (cursor2 != secondEnd) {
secondElement = secondList[cursor2++];
secondKey = keyOf(secondElement);
continue;
}
// Second list empties first. Flushing first list here.
target[targetOffset++] = firstElement;
target.setRange(targetOffset, targetOffset + (firstEnd - cursor1),
firstList, cursor1);
return;
}
}
// First list empties first. Reached by break above.
target[targetOffset++] = secondElement;
target.setRange(
targetOffset, targetOffset + (secondEnd - cursor2), secondList, cursor2);
}