216
*/
217
export function sortedDiff<T>(before: ReadonlyArray<T>, after: ReadonlyArray<T>, compare: (a: T, b: T) => number): ISplice<T>[] {
218
>
const result: IMutableSplice<T>[] = [];
arrays.ts
219
>
220
>
function pushSplice(start: number, deleteCount: number, toInsert: T[]): void {
221
>
if (deleteCount === 0 && toInsert.length === 0) {
222
>
return;
223
>
}
224
>
225
>
const latest = result[result.length - 1];
226
>
227
>
if (latest && latest.start + latest.deleteCount === start) {
228
>
latest.deleteCount += deleteCount;
229
>
latest.toInsert.push(...toInsert);
230
>
} else {
231
>
result.push({ start, deleteCount, toInsert });
232
>
}
233
>
}
234
>
235
>
let beforeIdx = 0;
236
>
let afterIdx = 0;
237
>
238
>
while (true) {
239
>
if (beforeIdx === before.length) {
240
>
pushSplice(beforeIdx, 0, after.slice(afterIdx));
241
>
break;
242
>
}
243
>
if (afterIdx === after.length) {
244
>
pushSplice(beforeIdx, before.length - beforeIdx, []);
245
>
break;
246
>
}
247
>
248
>
const beforeElement = before[beforeIdx];
249
>
const afterElement = after[afterIdx];
250
>
const n = compare(beforeElement, afterElement);
251
>
if (n === 0) {
252
>
// equal
253
>
beforeIdx += 1;
254
>
afterIdx += 1;
255
>
} else if (n < 0) {
256
>
// beforeElement is smaller -> before element removed
257
>
pushSplice(beforeIdx, 1, []);
258
>
beforeIdx += 1;
259
>
} else if (n > 0) {
260
>
// beforeElement is greater -> after element added
261
>
pushSplice(beforeIdx, 0, [afterElement]);
262
>
afterIdx += 1;
263
>
}
264
>
}
265
>
266
>
return result;
267
>
}
268
269
/**