in packages/web-components/fast-element/src/observation/array-change-records.ts [222:319]
export function calcSplices(
current: any[],
currentStart: number,
currentEnd: number,
old: any[],
oldStart: number,
oldEnd: number
): ReadonlyArray<never> | Splice[] {
let prefixCount = 0;
let suffixCount = 0;
const minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
if (currentStart === 0 && oldStart === 0) {
prefixCount = sharedPrefix(current, old, minLength);
}
if (currentEnd === current.length && oldEnd === old.length) {
suffixCount = sharedSuffix(current, old, minLength - prefixCount);
}
currentStart += prefixCount;
oldStart += prefixCount;
currentEnd -= suffixCount;
oldEnd -= suffixCount;
if (currentEnd - currentStart === 0 && oldEnd - oldStart === 0) {
return emptyArray;
}
if (currentStart === currentEnd) {
const splice = newSplice(currentStart, [], 0);
while (oldStart < oldEnd) {
splice.removed.push(old[oldStart++]);
}
return [splice];
} else if (oldStart === oldEnd) {
return [newSplice(currentStart, [], currentEnd - currentStart)];
}
const ops = spliceOperationsFromEditDistances(
calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd)
);
const splices: Splice[] = [];
let splice: Splice | undefined = void 0;
let index = currentStart;
let oldIndex = oldStart;
for (let i = 0; i < ops.length; ++i) {
switch (ops[i]) {
case EDIT_LEAVE:
if (splice !== void 0) {
splices.push(splice);
splice = void 0;
}
index++;
oldIndex++;
break;
case EDIT_UPDATE:
if (splice === void 0) {
splice = newSplice(index, [], 0);
}
splice.addedCount++;
index++;
splice.removed.push(old[oldIndex]);
oldIndex++;
break;
case EDIT_ADD:
if (splice === void 0) {
splice = newSplice(index, [], 0);
}
splice.addedCount++;
index++;
break;
case EDIT_DELETE:
if (splice === void 0) {
splice = newSplice(index, [], 0);
}
splice.removed.push(old[oldIndex]);
oldIndex++;
break;
// no default
}
}
if (splice !== void 0) {
splices.push(splice);
}
return splices;
}