1
>
/*---------------------------------------------------------------------------------------------
arrayEdit.ts
2
>
* Copyright (c) Microsoft Corporation. All rights reserved.
3
>
* Licensed under the MIT License. See License.txt in the project root for license information.
4
>
*--------------------------------------------------------------------------------------------*/
5
>
6
>
import { OffsetRange } from '../ranges/offsetRange.js';
7
>
import { BaseEdit, BaseReplacement } from './edit.js';
8
>
9
>
/**
10
>
* Represents a set of replacements to an array.
11
>
* All these replacements are applied at once.
12
>
*/
13
>
export class ArrayEdit<T> extends BaseEdit<ArrayReplacement<T>, ArrayEdit<T>> {
14
>
public static readonly empty = new ArrayEdit<never>([]);
15
>
16
>
public static create<T>(replacements: readonly ArrayReplacement<T>[]): ArrayEdit<T> {
17
return new ArrayEdit(replacements);
18
}
20
>
public static single<T>(replacement: ArrayReplacement<T>): ArrayEdit<T> {
21
return new ArrayEdit([replacement]);
22
}
24
>
public static replace<T>(range: OffsetRange, replacement: readonly T[]): ArrayEdit<T> {
25
return new ArrayEdit([new ArrayReplacement(range, replacement)]);
26
}
28
>
public static insert<T>(offset: number, replacement: readonly T[]): ArrayEdit<T> {
29
return new ArrayEdit([new ArrayReplacement(OffsetRange.emptyAt(offset), replacement)]);
30
}
32
>
public static delete<T>(range: OffsetRange): ArrayEdit<T> {
33
return new ArrayEdit([new ArrayReplacement(range, [])]);
34
}
36
>
protected override _createNew(replacements: readonly ArrayReplacement<T>[]): ArrayEdit<T> {
37
return new ArrayEdit(replacements);
38
}
40
>
public apply(data: readonly T[]): readonly T[] {
41
const resultData: T[] = [];
42
let pos = 0;