315
public readonly replaceRange: OffsetRange,
316
) { }
318
>
public abstract getNewLength(): number;
319
>
320
>
/**
321
>
* Precondition: TEdit.range.endExclusive === other.range.start
322
>
*/
323
>
public abstract tryJoinTouching(other: TSelf): TSelf | undefined;
324
>
325
>
public abstract slice(newReplaceRange: OffsetRange, rangeInReplacement?: OffsetRange): TSelf;
326
>
327
>
public delta(offset: number): TSelf {
328
return this.slice(this.replaceRange.delta(offset), new OffsetRange(0, this.getNewLength()));
329
}
331
>
public getLengthDelta(): number {
332
return this.getNewLength() - this.replaceRange.length;
333
}
335
>
abstract equals(other: TSelf): boolean;
336
>
337
>
toString(): string {
338
return `{ ${this.replaceRange.toString()} -> ${this.getNewLength()} }`;
339
}
341
>
get isEmpty() {
342
return this.getNewLength() === 0 && this.replaceRange.length === 0;
343
}
345
>
getRangeAfterReplace(): OffsetRange {
346
return new OffsetRange(this.replaceRange.start, this.replaceRange.start + this.getNewLength());
347
}
349
>
350
>
export type AnyEdit = BaseEdit<AnyReplacement, AnyEdit>;
351
>
export type AnyReplacement = BaseReplacement<AnyReplacement>;
352
>
353
>
export class Edit<T extends BaseReplacement<T>> extends BaseEdit<T, Edit<T>> {
354
>
/**
355
>
* Represents a set of edits to a string.
356
>
* All these edits are applied at once.
357
>
*/
358
>
public static readonly empty = new Edit<never>([]);
359
>
360
>
public static create<T extends BaseReplacement<T>>(replacements: readonly T[]): Edit<T> {
361
return new Edit(replacements);
362
}
364
>
public static single<T extends BaseReplacement<T>>(replacement: T): Edit<T> {
365
return new Edit([replacement]);
366
}
368
>
protected override _createNew(replacements: readonly T[]): Edit<T> {
369
return new Edit(replacements);
370
}
372
>
373
>
export class AnnotationReplacement<TAnnotation> extends BaseReplacement<AnnotationReplacement<TAnnotation>> {
374
>
constructor(
375
range: OffsetRange,
376
public readonly newLength: number,