in packages/core/micro/src/adjust-tree/delete.ts [208:261]
function deleteLeafRange<T>(ctx: TreeContext<T>, node: LeafNode<T>, position: number, length: number): LeafNode<T> {
const { lengths, segments, size } = node;
const { index: startIndex, offset: startOffset } = find(node, position);
const { index: endIndex, offset: endOffset } = find(node, position + length);
if (startIndex === endIndex) {
const { retained, removed } = ctx.extractSegmentRange(segments[startIndex], startOffset, length);
segments[startIndex] = retained;
lengths[startIndex] -= length;
return singletonLeaf(ctx, length, removed);
}
const deletedLengths: number[] = initArray(ctx.leafLengthSize, EMPTY);
const deletedSegments: T[] = initArray(ctx.leafSegmentSize, ctx.emptySegment);
let deletedSize = 0;
if (startOffset !== 0) {
const len = lengths[startIndex] - startOffset;
const { retained, removed } = ctx.extractSegmentRange(segments[startIndex], startOffset, len);
segments[startIndex] = retained;
lengths[startIndex] = startOffset;
deletedLengths[0] = len;
deletedSegments[0] = removed;
deletedSize++;
}
const wholeStartIndex = startOffset === 0 ? startIndex : startIndex + 1;
const offset = wholeStartIndex - startIndex;
const toRemove = endIndex - wholeStartIndex;
if (endOffset !== 0) {
const len = endOffset;
const { retained, removed } = ctx.extractSegmentRange(segments[endIndex], 0, endOffset);
segments[endIndex] = retained;
lengths[endIndex] -= endOffset;
deletedLengths[offset + toRemove] = len;
deletedSegments[offset + toRemove] = removed;
deletedSize++;
}
if (toRemove > 0) {
const lens = deleteAndShift(lengths, wholeStartIndex, toRemove, size, EMPTY);
const removed = deleteAndShift(segments, wholeStartIndex, toRemove, size, ctx.emptySegment);
for (let i = 0; i < toRemove; i++) {
deletedLengths[i + offset] = lens[i];
deletedSegments[i + offset] = removed[i];
}
deletedSize += toRemove;
}
const removedLeaf = createLeaf(deletedSize, deletedLengths, deletedSegments, undefined, undefined);
node.size -= toRemove;
return removedLeaf;
}