@fluidframework/sequence 2.0.0-dev.6.4.0.192049 → 2.0.0-dev.7.2.0.204906
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +95 -0
- package/README.md +130 -0
- package/api-extractor.json +1 -1
- package/api-report/sequence.api.md +717 -0
- package/dist/defaultMap.d.ts +1 -1
- package/dist/defaultMap.d.ts.map +1 -1
- package/dist/defaultMap.js +6 -6
- package/dist/defaultMap.js.map +1 -1
- package/dist/defaultMapInterfaces.d.ts +22 -2
- package/dist/defaultMapInterfaces.d.ts.map +1 -1
- package/dist/defaultMapInterfaces.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +164 -16
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +174 -54
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +17 -3
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js +12 -6
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts +19 -2
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointIndex.js +10 -5
- package/dist/intervalIndex/endpointIndex.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts +6 -0
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.js +3 -0
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/index.d.ts +4 -4
- package/dist/intervalIndex/index.d.ts.map +1 -1
- package/dist/intervalIndex/index.js +5 -1
- package/dist/intervalIndex/index.js.map +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts +1 -0
- package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/intervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +17 -6
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +17 -4
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +5 -2
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +9 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +17 -3
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js +12 -8
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/dist/intervalTree.d.ts +1 -1
- package/dist/intervalTree.d.ts.map +1 -1
- package/dist/intervals/interval.d.ts +4 -2
- package/dist/intervals/interval.d.ts.map +1 -1
- package/dist/intervals/interval.js +14 -5
- package/dist/intervals/interval.js.map +1 -1
- package/dist/intervals/intervalUtils.d.ts +51 -18
- package/dist/intervals/intervalUtils.d.ts.map +1 -1
- package/dist/intervals/intervalUtils.js +18 -10
- package/dist/intervals/intervalUtils.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts +28 -13
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +124 -43
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/localValues.d.ts.map +1 -1
- package/dist/localValues.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/revertibles.d.ts +3 -15
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +11 -19
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence-alpha.d.ts +1587 -0
- package/dist/sequence-beta.d.ts +1507 -0
- package/dist/sequence-public.d.ts +1507 -0
- package/dist/sequence-untrimmed.d.ts +1759 -0
- package/dist/sequence.d.ts +8 -4
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +53 -48
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceDeltaEvent.d.ts +4 -0
- package/dist/sequenceDeltaEvent.d.ts.map +1 -1
- package/dist/sequenceDeltaEvent.js +3 -0
- package/dist/sequenceDeltaEvent.js.map +1 -1
- package/dist/sequenceFactory.d.ts +3 -0
- package/dist/sequenceFactory.d.ts.map +1 -1
- package/dist/sequenceFactory.js +4 -1
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +5 -0
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +11 -9
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +6 -3
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js +10 -8
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts +17 -2
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +21 -7
- package/dist/sharedString.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/defaultMap.d.ts +1 -1
- package/lib/defaultMap.d.ts.map +1 -1
- package/lib/defaultMap.js +6 -6
- package/lib/defaultMap.js.map +1 -1
- package/lib/defaultMapInterfaces.d.ts +22 -2
- package/lib/defaultMapInterfaces.d.ts.map +1 -1
- package/lib/defaultMapInterfaces.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +164 -16
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +172 -55
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.ts +17 -3
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.js +12 -7
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/lib/intervalIndex/endpointIndex.d.ts +19 -2
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointIndex.js +10 -6
- package/lib/intervalIndex/endpointIndex.js.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.d.ts +6 -0
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.js +3 -0
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
- package/lib/intervalIndex/index.d.ts +4 -4
- package/lib/intervalIndex/index.d.ts.map +1 -1
- package/lib/intervalIndex/index.js +4 -4
- package/lib/intervalIndex/index.js.map +1 -1
- package/lib/intervalIndex/intervalIndex.d.ts +1 -0
- package/lib/intervalIndex/intervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/intervalIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +17 -6
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js +18 -5
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +5 -2
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +9 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +2 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.ts +17 -3
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.js +12 -9
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/lib/intervalTree.d.ts +1 -1
- package/lib/intervalTree.d.ts.map +1 -1
- package/lib/intervals/interval.d.ts +4 -2
- package/lib/intervals/interval.d.ts.map +1 -1
- package/lib/intervals/interval.js +14 -5
- package/lib/intervals/interval.js.map +1 -1
- package/lib/intervals/intervalUtils.d.ts +51 -18
- package/lib/intervals/intervalUtils.d.ts.map +1 -1
- package/lib/intervals/intervalUtils.js +14 -6
- package/lib/intervals/intervalUtils.js.map +1 -1
- package/lib/intervals/sequenceInterval.d.ts +28 -13
- package/lib/intervals/sequenceInterval.d.ts.map +1 -1
- package/lib/intervals/sequenceInterval.js +125 -42
- package/lib/intervals/sequenceInterval.js.map +1 -1
- package/lib/localValues.d.ts.map +1 -1
- package/lib/localValues.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/revertibles.d.ts +3 -15
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +11 -19
- package/lib/revertibles.js.map +1 -1
- package/lib/sequence.d.ts +8 -4
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +56 -49
- package/lib/sequence.js.map +1 -1
- package/lib/sequenceDeltaEvent.d.ts +4 -0
- package/lib/sequenceDeltaEvent.d.ts.map +1 -1
- package/lib/sequenceDeltaEvent.js +3 -0
- package/lib/sequenceDeltaEvent.js.map +1 -1
- package/lib/sequenceFactory.d.ts +3 -0
- package/lib/sequenceFactory.d.ts.map +1 -1
- package/lib/sequenceFactory.js +4 -1
- package/lib/sequenceFactory.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +5 -0
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +11 -9
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedSequence.d.ts +6 -3
- package/lib/sharedSequence.d.ts.map +1 -1
- package/lib/sharedSequence.js +10 -8
- package/lib/sharedSequence.js.map +1 -1
- package/lib/sharedString.d.ts +17 -2
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +21 -7
- package/lib/sharedString.js.map +1 -1
- package/package.json +31 -30
- package/src/defaultMapInterfaces.ts +22 -2
- package/src/index.ts +4 -1
- package/src/intervalCollection.ts +423 -82
- package/src/intervalIndex/endpointInRangeIndex.ts +23 -11
- package/src/intervalIndex/endpointIndex.ts +22 -9
- package/src/intervalIndex/idIntervalIndex.ts +7 -1
- package/src/intervalIndex/index.ts +12 -3
- package/src/intervalIndex/intervalIndex.ts +1 -0
- package/src/intervalIndex/overlappingIntervalsIndex.ts +40 -15
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +10 -1
- package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -1
- package/src/intervalIndex/startpointInRangeIndex.ts +23 -18
- package/src/intervals/interval.ts +35 -8
- package/src/intervals/intervalUtils.ts +61 -27
- package/src/intervals/sequenceInterval.ts +197 -47
- package/src/localValues.ts +4 -1
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +14 -36
- package/src/sequence.ts +14 -5
- package/src/sequenceDeltaEvent.ts +4 -0
- package/src/sequenceFactory.ts +4 -1
- package/src/sharedIntervalCollection.ts +5 -0
- package/src/sharedSequence.ts +6 -3
- package/src/sharedString.ts +25 -2
|
@@ -2,9 +2,17 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/* eslint-disable import/no-deprecated */
|
|
5
6
|
|
|
6
7
|
import { Client, PropertyAction, RedBlackTree } from "@fluidframework/merge-tree";
|
|
7
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
IIntervalHelpers,
|
|
10
|
+
ISerializableInterval,
|
|
11
|
+
IntervalType,
|
|
12
|
+
SequenceInterval,
|
|
13
|
+
sequenceIntervalHelpers,
|
|
14
|
+
} from "../intervals";
|
|
15
|
+
import { SharedString } from "../sharedString";
|
|
8
16
|
import { IntervalIndex } from "./intervalIndex";
|
|
9
17
|
import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils";
|
|
10
18
|
|
|
@@ -12,26 +20,27 @@ import { HasComparisonOverride, compareOverrideables, forceCompare } from "./int
|
|
|
12
20
|
* Collection of intervals.
|
|
13
21
|
*
|
|
14
22
|
* Provide additional APIs to support efficiently querying a collection of intervals whose endpoints fall within a specified range.
|
|
23
|
+
* @public
|
|
15
24
|
*/
|
|
16
25
|
export interface IEndpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
17
26
|
extends IntervalIndex<TInterval> {
|
|
18
27
|
/**
|
|
19
28
|
* @returns an array of all intervals contained in this collection whose endpoints locate in the range [start, end] (includes both ends)
|
|
20
29
|
*/
|
|
21
|
-
findIntervalsWithEndpointInRange(start: number, end: number);
|
|
30
|
+
findIntervalsWithEndpointInRange(start: number, end: number): TInterval[];
|
|
22
31
|
}
|
|
23
32
|
|
|
24
|
-
class EndpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
33
|
+
export class EndpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
25
34
|
implements IEndpointInRangeIndex<TInterval>
|
|
26
35
|
{
|
|
27
36
|
private readonly intervalTree;
|
|
28
37
|
|
|
29
38
|
constructor(
|
|
30
|
-
private readonly helpers: IIntervalHelpers<TInterval>,
|
|
31
39
|
private readonly client: Client,
|
|
40
|
+
private readonly helpers: IIntervalHelpers<TInterval>,
|
|
32
41
|
) {
|
|
33
42
|
this.intervalTree = new RedBlackTree<TInterval, TInterval>((a: TInterval, b: TInterval) => {
|
|
34
|
-
const compareEndsResult =
|
|
43
|
+
const compareEndsResult = a.compareEnd(b);
|
|
35
44
|
if (compareEndsResult !== 0) {
|
|
36
45
|
return compareEndsResult;
|
|
37
46
|
}
|
|
@@ -61,7 +70,7 @@ class EndpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
|
61
70
|
this.intervalTree.remove(interval);
|
|
62
71
|
}
|
|
63
72
|
|
|
64
|
-
public findIntervalsWithEndpointInRange(start: number, end: number) {
|
|
73
|
+
public findIntervalsWithEndpointInRange(start: number, end: number): TInterval[] {
|
|
65
74
|
if (start <= 0 || start > end || this.intervalTree.isEmpty()) {
|
|
66
75
|
return [];
|
|
67
76
|
}
|
|
@@ -96,9 +105,12 @@ class EndpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
|
96
105
|
}
|
|
97
106
|
}
|
|
98
107
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
108
|
+
/**
|
|
109
|
+
* @public
|
|
110
|
+
*/
|
|
111
|
+
export function createEndpointInRangeIndex(
|
|
112
|
+
sharedString: SharedString,
|
|
113
|
+
): IEndpointInRangeIndex<SequenceInterval> {
|
|
114
|
+
const client = (sharedString as unknown as { client: Client }).client;
|
|
115
|
+
return new EndpointInRangeIndex<SequenceInterval>(client, sequenceIntervalHelpers);
|
|
104
116
|
}
|
|
@@ -2,11 +2,22 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/* eslint-disable import/no-deprecated */
|
|
5
6
|
|
|
6
7
|
import { Client, RedBlackTree } from "@fluidframework/merge-tree";
|
|
7
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
IIntervalHelpers,
|
|
10
|
+
ISerializableInterval,
|
|
11
|
+
IntervalType,
|
|
12
|
+
SequenceInterval,
|
|
13
|
+
sequenceIntervalHelpers,
|
|
14
|
+
} from "../intervals";
|
|
15
|
+
import { SharedString } from "../sharedString";
|
|
8
16
|
import { IntervalIndex } from "./intervalIndex";
|
|
9
17
|
|
|
18
|
+
/**
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
10
21
|
export interface IEndpointIndex<TInterval extends ISerializableInterval>
|
|
11
22
|
extends IntervalIndex<TInterval> {
|
|
12
23
|
/**
|
|
@@ -22,15 +33,16 @@ export interface IEndpointIndex<TInterval extends ISerializableInterval>
|
|
|
22
33
|
nextInterval(pos: number): TInterval | undefined;
|
|
23
34
|
}
|
|
24
35
|
|
|
25
|
-
class EndpointIndex<TInterval extends ISerializableInterval>
|
|
36
|
+
export class EndpointIndex<TInterval extends ISerializableInterval>
|
|
37
|
+
implements IEndpointIndex<TInterval>
|
|
38
|
+
{
|
|
26
39
|
private readonly endIntervalTree: RedBlackTree<TInterval, TInterval>;
|
|
27
40
|
|
|
28
41
|
constructor(
|
|
29
42
|
private readonly client: Client,
|
|
30
43
|
private readonly helpers: IIntervalHelpers<TInterval>,
|
|
31
44
|
) {
|
|
32
|
-
|
|
33
|
-
this.endIntervalTree = new RedBlackTree<TInterval, TInterval>(helpers.compareEnds);
|
|
45
|
+
this.endIntervalTree = new RedBlackTree<TInterval, TInterval>((a, b) => a.compareEnd(b));
|
|
34
46
|
}
|
|
35
47
|
|
|
36
48
|
public previousInterval(pos: number): TInterval | undefined {
|
|
@@ -70,9 +82,10 @@ class EndpointIndex<TInterval extends ISerializableInterval> implements IEndpoin
|
|
|
70
82
|
}
|
|
71
83
|
}
|
|
72
84
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
): IEndpointIndex<
|
|
77
|
-
|
|
85
|
+
/**
|
|
86
|
+
* @public
|
|
87
|
+
*/
|
|
88
|
+
export function createEndpointIndex(sharedString: SharedString): IEndpointIndex<SequenceInterval> {
|
|
89
|
+
const client = (sharedString as unknown as { client: Client }).client;
|
|
90
|
+
return new EndpointIndex<SequenceInterval>(client, sequenceIntervalHelpers);
|
|
78
91
|
}
|
|
@@ -9,6 +9,9 @@ import { IntervalIndex } from "./intervalIndex";
|
|
|
9
9
|
|
|
10
10
|
const reservedIntervalIdKey = "intervalId";
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
12
15
|
export interface IIdIntervalIndex<TInterval extends ISerializableInterval>
|
|
13
16
|
extends IntervalIndex<TInterval>,
|
|
14
17
|
Iterable<TInterval> {
|
|
@@ -19,7 +22,7 @@ export interface IIdIntervalIndex<TInterval extends ISerializableInterval>
|
|
|
19
22
|
class IdIntervalIndex<TInterval extends ISerializableInterval>
|
|
20
23
|
implements IIdIntervalIndex<TInterval>, Iterable<TInterval>
|
|
21
24
|
{
|
|
22
|
-
private readonly intervalIdMap
|
|
25
|
+
private readonly intervalIdMap = new Map<string, TInterval>();
|
|
23
26
|
|
|
24
27
|
public add(interval: TInterval) {
|
|
25
28
|
const id = interval.getIntervalId();
|
|
@@ -51,6 +54,9 @@ class IdIntervalIndex<TInterval extends ISerializableInterval>
|
|
|
51
54
|
}
|
|
52
55
|
}
|
|
53
56
|
|
|
57
|
+
/**
|
|
58
|
+
* @public
|
|
59
|
+
*/
|
|
54
60
|
export function createIdIntervalIndex<
|
|
55
61
|
TInterval extends ISerializableInterval,
|
|
56
62
|
>(): IIdIntervalIndex<TInterval> {
|
|
@@ -5,12 +5,21 @@
|
|
|
5
5
|
|
|
6
6
|
export { IntervalIndex } from "./intervalIndex";
|
|
7
7
|
export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex";
|
|
8
|
-
export { IEndpointIndex, createEndpointIndex } from "./endpointIndex";
|
|
9
|
-
export {
|
|
10
|
-
|
|
8
|
+
export { IEndpointIndex, createEndpointIndex, EndpointIndex } from "./endpointIndex";
|
|
9
|
+
export {
|
|
10
|
+
IEndpointInRangeIndex,
|
|
11
|
+
createEndpointInRangeIndex,
|
|
12
|
+
EndpointInRangeIndex,
|
|
13
|
+
} from "./endpointInRangeIndex";
|
|
14
|
+
export {
|
|
15
|
+
IStartpointInRangeIndex,
|
|
16
|
+
createStartpointInRangeIndex,
|
|
17
|
+
StartpointInRangeIndex,
|
|
18
|
+
} from "./startpointInRangeIndex";
|
|
11
19
|
export { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
|
|
12
20
|
export {
|
|
13
21
|
IOverlappingIntervalsIndex,
|
|
14
22
|
createOverlappingIntervalsIndex,
|
|
23
|
+
OverlappingIntervalsIndex,
|
|
15
24
|
} from "./overlappingIntervalsIndex";
|
|
16
25
|
export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex";
|
|
@@ -13,6 +13,7 @@ import { ISerializableInterval } from "../intervals";
|
|
|
13
13
|
* - "find all intervals with start endpoint between these two points"
|
|
14
14
|
* - "find all intervals which overlap this range"
|
|
15
15
|
* etc.
|
|
16
|
+
* @public
|
|
16
17
|
*/
|
|
17
18
|
export interface IntervalIndex<TInterval extends ISerializableInterval> {
|
|
18
19
|
/**
|
|
@@ -2,19 +2,31 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/* eslint-disable import/no-deprecated */
|
|
5
6
|
|
|
6
7
|
import { Client } from "@fluidframework/merge-tree";
|
|
7
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
IntervalType,
|
|
10
|
+
IIntervalHelpers,
|
|
11
|
+
ISerializableInterval,
|
|
12
|
+
sequenceIntervalHelpers,
|
|
13
|
+
SequenceInterval,
|
|
14
|
+
} from "../intervals";
|
|
8
15
|
import { IntervalNode, IntervalTree } from "../intervalTree";
|
|
16
|
+
import { SharedString } from "../sharedString";
|
|
17
|
+
import { SequencePlace, endpointPosAndSide } from "../intervalCollection";
|
|
9
18
|
import { IntervalIndex } from "./intervalIndex";
|
|
10
19
|
|
|
20
|
+
/**
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
11
23
|
export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
12
24
|
extends IntervalIndex<TInterval> {
|
|
13
25
|
/**
|
|
14
26
|
* @returns an array of all intervals contained in this collection that overlap the range
|
|
15
27
|
* `[start end]`.
|
|
16
28
|
*/
|
|
17
|
-
findOverlappingIntervals(start:
|
|
29
|
+
findOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[];
|
|
18
30
|
|
|
19
31
|
/**
|
|
20
32
|
* Gathers the interval results based on specified parameters.
|
|
@@ -22,11 +34,14 @@ export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInter
|
|
|
22
34
|
gatherIterationResults(
|
|
23
35
|
results: TInterval[],
|
|
24
36
|
iteratesForward: boolean,
|
|
25
|
-
start?:
|
|
26
|
-
end?:
|
|
37
|
+
start?: SequencePlace,
|
|
38
|
+
end?: SequencePlace,
|
|
27
39
|
): void;
|
|
28
40
|
}
|
|
29
41
|
|
|
42
|
+
/**
|
|
43
|
+
* @public
|
|
44
|
+
*/
|
|
30
45
|
export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
31
46
|
implements IOverlappingIntervalsIndex<TInterval>
|
|
32
47
|
{
|
|
@@ -50,8 +65,8 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
50
65
|
public gatherIterationResults(
|
|
51
66
|
results: TInterval[],
|
|
52
67
|
iteratesForward: boolean,
|
|
53
|
-
start?:
|
|
54
|
-
end?:
|
|
68
|
+
start?: SequencePlace,
|
|
69
|
+
end?: SequencePlace,
|
|
55
70
|
): void {
|
|
56
71
|
if (this.intervalTree.intervals.isEmpty()) {
|
|
57
72
|
return;
|
|
@@ -71,8 +86,8 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
71
86
|
} else {
|
|
72
87
|
const transientInterval: TInterval = this.helpers.create(
|
|
73
88
|
"transient",
|
|
74
|
-
start,
|
|
75
|
-
end,
|
|
89
|
+
start ?? "start",
|
|
90
|
+
end ?? "end",
|
|
76
91
|
this.client,
|
|
77
92
|
IntervalType.Transient,
|
|
78
93
|
);
|
|
@@ -129,8 +144,15 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
129
144
|
}
|
|
130
145
|
}
|
|
131
146
|
|
|
132
|
-
public findOverlappingIntervals(start:
|
|
133
|
-
|
|
147
|
+
public findOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[] {
|
|
148
|
+
const { startPos, endPos } = endpointPosAndSide(start, end);
|
|
149
|
+
|
|
150
|
+
if (
|
|
151
|
+
startPos === undefined ||
|
|
152
|
+
endPos === undefined ||
|
|
153
|
+
endPos < startPos ||
|
|
154
|
+
this.intervalTree.intervals.isEmpty()
|
|
155
|
+
) {
|
|
134
156
|
return [];
|
|
135
157
|
}
|
|
136
158
|
const transientInterval = this.helpers.create(
|
|
@@ -154,9 +176,12 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
154
176
|
}
|
|
155
177
|
}
|
|
156
178
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
179
|
+
/**
|
|
180
|
+
* @public
|
|
181
|
+
*/
|
|
182
|
+
export function createOverlappingIntervalsIndex(
|
|
183
|
+
sharedString: SharedString,
|
|
184
|
+
): IOverlappingIntervalsIndex<SequenceInterval> {
|
|
185
|
+
const client = (sharedString as unknown as { client: Client }).client;
|
|
186
|
+
return new OverlappingIntervalsIndex<SequenceInterval>(client, sequenceIntervalHelpers);
|
|
162
187
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/* eslint-disable import/no-deprecated */
|
|
5
6
|
|
|
6
7
|
import {
|
|
7
8
|
Client,
|
|
@@ -16,9 +17,13 @@ import {
|
|
|
16
17
|
SequenceInterval,
|
|
17
18
|
createPositionReferenceFromSegoff,
|
|
18
19
|
} from "../intervals";
|
|
20
|
+
import { SharedString } from "../sharedString";
|
|
19
21
|
import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
|
|
20
22
|
import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
|
|
21
23
|
|
|
24
|
+
/**
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
22
27
|
class OverlappingSequenceIntervalsIndex
|
|
23
28
|
extends OverlappingIntervalsIndex<SequenceInterval>
|
|
24
29
|
implements SequenceIntervalIndexes.Overlapping
|
|
@@ -64,8 +69,12 @@ class OverlappingSequenceIntervalsIndex
|
|
|
64
69
|
}
|
|
65
70
|
}
|
|
66
71
|
|
|
72
|
+
/**
|
|
73
|
+
* @public
|
|
74
|
+
*/
|
|
67
75
|
export function createOverlappingSequenceIntervalsIndex(
|
|
68
|
-
|
|
76
|
+
sharedString: SharedString,
|
|
69
77
|
): SequenceIntervalIndexes.Overlapping {
|
|
78
|
+
const client = (sharedString as unknown as { client: Client }).client;
|
|
70
79
|
return new OverlappingSequenceIntervalsIndex(client);
|
|
71
80
|
}
|
|
@@ -10,6 +10,7 @@ import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
|
|
|
10
10
|
/**
|
|
11
11
|
* This namespace contains specialiazations of indexes which support spatial queries
|
|
12
12
|
* specifically for `SequenceInterval`s.
|
|
13
|
+
* @public
|
|
13
14
|
*/
|
|
14
15
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
15
16
|
export namespace SequenceIntervalIndexes {
|
|
@@ -27,6 +28,6 @@ export namespace SequenceIntervalIndexes {
|
|
|
27
28
|
findOverlappingIntervalsBySegoff(
|
|
28
29
|
startSegoff: { segment: ISegment | undefined; offset: number | undefined },
|
|
29
30
|
endSegoff: { segment: ISegment | undefined; offset: number | undefined },
|
|
30
|
-
)
|
|
31
|
+
): Iterable<SequenceInterval>;
|
|
31
32
|
}
|
|
32
33
|
}
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/* eslint-disable import/no-deprecated */
|
|
5
6
|
|
|
6
7
|
import { Client, PropertyAction, RedBlackTree } from "@fluidframework/merge-tree";
|
|
7
|
-
import {
|
|
8
|
-
|
|
8
|
+
import {
|
|
9
|
+
IIntervalHelpers,
|
|
10
|
+
ISerializableInterval,
|
|
11
|
+
IntervalType,
|
|
12
|
+
SequenceInterval,
|
|
13
|
+
sequenceIntervalHelpers,
|
|
14
|
+
} from "../intervals";
|
|
15
|
+
import { SharedString } from "../sharedString";
|
|
9
16
|
import { IntervalIndex } from "./intervalIndex";
|
|
10
17
|
import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils";
|
|
11
18
|
|
|
@@ -13,31 +20,27 @@ import { HasComparisonOverride, compareOverrideables, forceCompare } from "./int
|
|
|
13
20
|
* Collection of intervals.
|
|
14
21
|
*
|
|
15
22
|
* Provide additional APIs to support efficiently querying a collection of intervals whose startpoints fall within a specified range.
|
|
23
|
+
* @public
|
|
16
24
|
*/
|
|
17
25
|
export interface IStartpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
18
26
|
extends IntervalIndex<TInterval> {
|
|
19
27
|
/**
|
|
20
28
|
* @returns an array of all intervals contained in this collection whose startpoints locate in the range [start, end] (includes both ends)
|
|
21
29
|
*/
|
|
22
|
-
findIntervalsWithStartpointInRange(start: number, end: number);
|
|
30
|
+
findIntervalsWithStartpointInRange(start: number, end: number): TInterval[];
|
|
23
31
|
}
|
|
24
32
|
|
|
25
|
-
class StartpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
33
|
+
export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
26
34
|
implements IStartpointInRangeIndex<TInterval>
|
|
27
35
|
{
|
|
28
36
|
private readonly intervalTree;
|
|
29
37
|
|
|
30
38
|
constructor(
|
|
31
|
-
private readonly helpers: IIntervalHelpers<TInterval>,
|
|
32
39
|
private readonly client: Client,
|
|
40
|
+
private readonly helpers: IIntervalHelpers<TInterval>,
|
|
33
41
|
) {
|
|
34
42
|
this.intervalTree = new RedBlackTree<TInterval, TInterval>((a: TInterval, b: TInterval) => {
|
|
35
|
-
|
|
36
|
-
typeof helpers.compareStarts === "function",
|
|
37
|
-
0x6d1 /* compareStarts does not exist in the helpers */,
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
const compareStartsResult = helpers.compareStarts(a, b);
|
|
43
|
+
const compareStartsResult = a.compareStart(b);
|
|
41
44
|
if (compareStartsResult !== 0) {
|
|
42
45
|
return compareStartsResult;
|
|
43
46
|
}
|
|
@@ -66,7 +69,7 @@ class StartpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
|
66
69
|
this.intervalTree.remove(interval);
|
|
67
70
|
}
|
|
68
71
|
|
|
69
|
-
public findIntervalsWithStartpointInRange(start: number, end: number) {
|
|
72
|
+
public findIntervalsWithStartpointInRange(start: number, end: number): TInterval[] {
|
|
70
73
|
if (start <= 0 || start > end || this.intervalTree.isEmpty()) {
|
|
71
74
|
return [];
|
|
72
75
|
}
|
|
@@ -100,10 +103,12 @@ class StartpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
|
100
103
|
return results;
|
|
101
104
|
}
|
|
102
105
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
/**
|
|
107
|
+
* @public
|
|
108
|
+
*/
|
|
109
|
+
export function createStartpointInRangeIndex(
|
|
110
|
+
sharedString: SharedString,
|
|
111
|
+
): IStartpointInRangeIndex<SequenceInterval> {
|
|
112
|
+
const client = (sharedString as unknown as { client: Client }).client;
|
|
113
|
+
return new StartpointInRangeIndex<SequenceInterval>(client, sequenceIntervalHelpers);
|
|
109
114
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/* eslint-disable import/no-deprecated */
|
|
5
6
|
|
|
6
7
|
import {
|
|
7
8
|
ICombiningOp,
|
|
@@ -12,12 +13,15 @@ import {
|
|
|
12
13
|
} from "@fluidframework/merge-tree";
|
|
13
14
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
14
15
|
import { assert } from "@fluidframework/core-utils";
|
|
16
|
+
import { UsageError } from "@fluidframework/telemetry-utils";
|
|
17
|
+
import { SequencePlace } from "../intervalCollection";
|
|
15
18
|
import { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from "./intervalUtils";
|
|
16
19
|
|
|
17
20
|
const reservedIntervalIdKey = "intervalId";
|
|
18
21
|
|
|
19
22
|
/**
|
|
20
23
|
* Serializable interval whose endpoints are plain-old numbers.
|
|
24
|
+
* @public
|
|
21
25
|
*/
|
|
22
26
|
export class Interval implements ISerializableInterval {
|
|
23
27
|
/**
|
|
@@ -31,7 +35,11 @@ export class Interval implements ISerializableInterval {
|
|
|
31
35
|
* @internal
|
|
32
36
|
*/
|
|
33
37
|
public propertyManager: PropertiesManager;
|
|
34
|
-
constructor(
|
|
38
|
+
constructor(
|
|
39
|
+
public start: number,
|
|
40
|
+
public end: number,
|
|
41
|
+
props?: PropertySet,
|
|
42
|
+
) {
|
|
35
43
|
this.propertyManager = new PropertiesManager();
|
|
36
44
|
this.properties = {};
|
|
37
45
|
|
|
@@ -184,9 +192,21 @@ export class Interval implements ISerializableInterval {
|
|
|
184
192
|
* {@inheritDoc IInterval.modify}
|
|
185
193
|
* @internal
|
|
186
194
|
*/
|
|
187
|
-
public modify(
|
|
188
|
-
|
|
189
|
-
|
|
195
|
+
public modify(
|
|
196
|
+
label: string,
|
|
197
|
+
start?: SequencePlace,
|
|
198
|
+
end?: SequencePlace,
|
|
199
|
+
op?: ISequencedDocumentMessage,
|
|
200
|
+
) {
|
|
201
|
+
if (typeof start === "string" || typeof end === "string") {
|
|
202
|
+
throw new UsageError(
|
|
203
|
+
"The start and end positions of a plain interval may not be on the special endpoint segments.",
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const startPos = typeof start === "number" ? start : start?.pos ?? this.start;
|
|
208
|
+
const endPos = typeof end === "number" ? end : end?.pos ?? this.end;
|
|
209
|
+
|
|
190
210
|
if (this.start === startPos && this.end === endPos) {
|
|
191
211
|
// Return undefined to indicate that no change is necessary.
|
|
192
212
|
return;
|
|
@@ -213,18 +233,25 @@ export class Interval implements ISerializableInterval {
|
|
|
213
233
|
}
|
|
214
234
|
}
|
|
215
235
|
|
|
216
|
-
export function createInterval(label: string, start:
|
|
236
|
+
export function createInterval(label: string, start: SequencePlace, end: SequencePlace): Interval {
|
|
237
|
+
if (typeof start === "string" || typeof end === "string") {
|
|
238
|
+
throw new UsageError(
|
|
239
|
+
"The start and end positions of a plain interval may not be on the special endpoint segments.",
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
217
243
|
const rangeProp: PropertySet = {};
|
|
218
244
|
|
|
219
245
|
if (label && label.length > 0) {
|
|
220
246
|
rangeProp[reservedRangeLabelsKey] = [label];
|
|
221
247
|
}
|
|
222
248
|
|
|
223
|
-
|
|
249
|
+
const startPos = typeof start === "number" ? start : start.pos;
|
|
250
|
+
const endPos = typeof end === "number" ? end : end.pos;
|
|
251
|
+
|
|
252
|
+
return new Interval(startPos, endPos, rangeProp);
|
|
224
253
|
}
|
|
225
254
|
|
|
226
255
|
export const intervalHelpers: IIntervalHelpers<Interval> = {
|
|
227
|
-
compareEnds: (a: Interval, b: Interval) => a.end - b.end,
|
|
228
|
-
compareStarts: (a: Interval, b: Interval) => a.start - b.start,
|
|
229
256
|
create: createInterval,
|
|
230
257
|
};
|