function deleteLeafRange()

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;
}