@fluidframework/sequence 2.23.0 → 2.31.0
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 +510 -495
- package/api-report/sequence.legacy.alpha.api.md +67 -5
- package/dist/IntervalCollectionValues.d.ts +3 -51
- package/dist/IntervalCollectionValues.d.ts.map +1 -1
- package/dist/IntervalCollectionValues.js +6 -49
- package/dist/IntervalCollectionValues.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +292 -63
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +111 -193
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalCollectionMap.d.ts +11 -32
- package/dist/intervalCollectionMap.d.ts.map +1 -1
- package/dist/intervalCollectionMap.js +37 -90
- package/dist/intervalCollectionMap.js.map +1 -1
- package/dist/intervalCollectionMapInterfaces.d.ts +10 -83
- package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -1
- package/dist/intervalCollectionMapInterfaces.js.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +10 -11
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js +4 -5
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts +12 -13
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointIndex.js +4 -5
- package/dist/intervalIndex/endpointIndex.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts +6 -12
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.js +0 -3
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/index.d.ts +2 -2
- package/dist/intervalIndex/index.d.ts.map +1 -1
- package/dist/intervalIndex/index.js.map +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts +28 -1
- package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/intervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +30 -13
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +4 -5
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +10 -11
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js +4 -5
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/dist/intervals/index.d.ts +2 -3
- package/dist/intervals/index.d.ts.map +1 -1
- package/dist/intervals/index.js +1 -6
- package/dist/intervals/index.js.map +1 -1
- package/dist/intervals/intervalUtils.d.ts +3 -25
- package/dist/intervals/intervalUtils.d.ts.map +1 -1
- package/dist/intervals/intervalUtils.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts +3 -8
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +1 -9
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/legacy.d.ts +4 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/sequence.d.ts +4 -6
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +3 -5
- package/dist/sequence.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -63
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +0 -113
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +6 -6
- package/dist/sharedString.js.map +1 -1
- package/lib/IntervalCollectionValues.d.ts +3 -51
- package/lib/IntervalCollectionValues.d.ts.map +1 -1
- package/lib/IntervalCollectionValues.js +5 -47
- package/lib/IntervalCollectionValues.js.map +1 -1
- package/lib/index.d.ts +4 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -3
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +292 -63
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +113 -191
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalCollectionMap.d.ts +11 -32
- package/lib/intervalCollectionMap.d.ts.map +1 -1
- package/lib/intervalCollectionMap.js +39 -92
- package/lib/intervalCollectionMap.js.map +1 -1
- package/lib/intervalCollectionMapInterfaces.d.ts +10 -83
- package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -1
- package/lib/intervalCollectionMapInterfaces.js.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.ts +10 -11
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.js +5 -6
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/lib/intervalIndex/endpointIndex.d.ts +12 -13
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointIndex.js +5 -6
- package/lib/intervalIndex/endpointIndex.js.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.d.ts +6 -12
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.js +0 -3
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
- package/lib/intervalIndex/index.d.ts +2 -2
- package/lib/intervalIndex/index.d.ts.map +1 -1
- package/lib/intervalIndex/index.js.map +1 -1
- package/lib/intervalIndex/intervalIndex.d.ts +28 -1
- package/lib/intervalIndex/intervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/intervalIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +30 -13
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js +5 -6
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +2 -2
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.ts +10 -11
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.js +5 -6
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/lib/intervals/index.d.ts +2 -3
- package/lib/intervals/index.d.ts.map +1 -1
- package/lib/intervals/index.js +1 -2
- package/lib/intervals/index.js.map +1 -1
- package/lib/intervals/intervalUtils.d.ts +3 -25
- package/lib/intervals/intervalUtils.d.ts.map +1 -1
- package/lib/intervals/intervalUtils.js.map +1 -1
- package/lib/intervals/sequenceInterval.d.ts +3 -8
- package/lib/intervals/sequenceInterval.d.ts.map +1 -1
- package/lib/intervals/sequenceInterval.js +0 -8
- package/lib/intervals/sequenceInterval.js.map +1 -1
- package/lib/legacy.d.ts +4 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/sequence.d.ts +4 -6
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +3 -5
- package/lib/sequence.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +2 -63
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +1 -110
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +6 -6
- package/lib/sharedString.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +20 -23
- package/src/IntervalCollectionValues.ts +10 -93
- package/src/index.ts +6 -17
- package/src/intervalCollection.ts +524 -343
- package/src/intervalCollectionMap.ts +72 -140
- package/src/intervalCollectionMapInterfaces.ts +13 -104
- package/src/intervalIndex/endpointInRangeIndex.ts +17 -29
- package/src/intervalIndex/endpointIndex.ts +19 -31
- package/src/intervalIndex/idIntervalIndex.ts +15 -25
- package/src/intervalIndex/index.ts +2 -1
- package/src/intervalIndex/intervalIndex.ts +30 -1
- package/src/intervalIndex/overlappingIntervalsIndex.ts +50 -27
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +2 -3
- package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
- package/src/intervalIndex/startpointInRangeIndex.ts +17 -29
- package/src/intervals/index.ts +0 -3
- package/src/intervals/intervalUtils.ts +3 -38
- package/src/intervals/sequenceInterval.ts +2 -12
- package/src/packageVersion.ts +1 -1
- package/src/sequence.ts +8 -20
- package/src/sharedIntervalCollection.ts +5 -183
- package/src/sharedString.ts +6 -24
- package/dist/intervals/interval.d.ts +0 -76
- package/dist/intervals/interval.d.ts.map +0 -1
- package/dist/intervals/interval.js +0 -167
- package/dist/intervals/interval.js.map +0 -1
- package/lib/intervals/interval.d.ts +0 -76
- package/lib/intervals/interval.d.ts.map +0 -1
- package/lib/intervals/interval.js +0 -162
- package/lib/intervals/interval.js.map +0 -1
- package/prettier.config.cjs +0 -8
- package/src/intervals/interval.ts +0 -226
|
@@ -7,49 +7,39 @@
|
|
|
7
7
|
|
|
8
8
|
import { Client, RedBlackTree } from "@fluidframework/merge-tree/internal";
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
IIntervalHelpers,
|
|
12
|
-
ISerializableInterval,
|
|
13
|
-
IntervalType,
|
|
14
|
-
SequenceInterval,
|
|
15
|
-
sequenceIntervalHelpers,
|
|
16
|
-
} from "../intervals/index.js";
|
|
10
|
+
import { createSequenceInterval, IntervalType, SequenceInterval } from "../intervals/index.js";
|
|
17
11
|
import { ISharedString } from "../sharedString.js";
|
|
18
12
|
|
|
19
|
-
import {
|
|
13
|
+
import { type SequenceIntervalIndex } from "./intervalIndex.js";
|
|
20
14
|
|
|
21
15
|
/**
|
|
22
16
|
* @internal
|
|
23
17
|
*/
|
|
24
|
-
export interface IEndpointIndex
|
|
25
|
-
extends IntervalIndex<TInterval> {
|
|
18
|
+
export interface IEndpointIndex extends SequenceIntervalIndex {
|
|
26
19
|
/**
|
|
27
20
|
* @returns the previous interval based on the given position number.
|
|
28
21
|
* If no such interval exists in this index, returns `undefined`
|
|
29
22
|
*/
|
|
30
|
-
previousInterval(pos: number):
|
|
23
|
+
previousInterval(pos: number): SequenceInterval | undefined;
|
|
31
24
|
|
|
32
25
|
/**
|
|
33
26
|
* @returns the next interval based on the given position number.
|
|
34
27
|
* If no such interval exists in this index, returns `undefined`
|
|
35
28
|
*/
|
|
36
|
-
nextInterval(pos: number):
|
|
29
|
+
nextInterval(pos: number): SequenceInterval | undefined;
|
|
37
30
|
}
|
|
38
31
|
|
|
39
|
-
export class EndpointIndex
|
|
40
|
-
|
|
41
|
-
{
|
|
42
|
-
private readonly endIntervalTree: RedBlackTree<TInterval, TInterval>;
|
|
32
|
+
export class EndpointIndex implements IEndpointIndex {
|
|
33
|
+
private readonly endIntervalTree: RedBlackTree<SequenceInterval, SequenceInterval>;
|
|
43
34
|
|
|
44
|
-
constructor(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
this.endIntervalTree = new RedBlackTree<TInterval, TInterval>((a, b) => a.compareEnd(b));
|
|
35
|
+
constructor(private readonly client: Client) {
|
|
36
|
+
this.endIntervalTree = new RedBlackTree<SequenceInterval, SequenceInterval>((a, b) =>
|
|
37
|
+
a.compareEnd(b),
|
|
38
|
+
);
|
|
49
39
|
}
|
|
50
40
|
|
|
51
|
-
public previousInterval(pos: number):
|
|
52
|
-
const transientInterval =
|
|
41
|
+
public previousInterval(pos: number): SequenceInterval | undefined {
|
|
42
|
+
const transientInterval = createSequenceInterval(
|
|
53
43
|
"transient",
|
|
54
44
|
pos,
|
|
55
45
|
pos,
|
|
@@ -62,8 +52,8 @@ export class EndpointIndex<TInterval extends ISerializableInterval>
|
|
|
62
52
|
}
|
|
63
53
|
}
|
|
64
54
|
|
|
65
|
-
public nextInterval(pos: number):
|
|
66
|
-
const transientInterval =
|
|
55
|
+
public nextInterval(pos: number): SequenceInterval | undefined {
|
|
56
|
+
const transientInterval = createSequenceInterval(
|
|
67
57
|
"transient",
|
|
68
58
|
pos,
|
|
69
59
|
pos,
|
|
@@ -76,11 +66,11 @@ export class EndpointIndex<TInterval extends ISerializableInterval>
|
|
|
76
66
|
}
|
|
77
67
|
}
|
|
78
68
|
|
|
79
|
-
public add(interval:
|
|
69
|
+
public add(interval: SequenceInterval): void {
|
|
80
70
|
this.endIntervalTree.put(interval, interval);
|
|
81
71
|
}
|
|
82
72
|
|
|
83
|
-
public remove(interval:
|
|
73
|
+
public remove(interval: SequenceInterval): void {
|
|
84
74
|
this.endIntervalTree.remove(interval);
|
|
85
75
|
}
|
|
86
76
|
}
|
|
@@ -88,9 +78,7 @@ export class EndpointIndex<TInterval extends ISerializableInterval>
|
|
|
88
78
|
/**
|
|
89
79
|
* @internal
|
|
90
80
|
*/
|
|
91
|
-
export function createEndpointIndex(
|
|
92
|
-
sharedString: ISharedString,
|
|
93
|
-
): IEndpointIndex<SequenceInterval> {
|
|
81
|
+
export function createEndpointIndex(sharedString: ISharedString): IEndpointIndex {
|
|
94
82
|
const client = (sharedString as unknown as { client: Client }).client;
|
|
95
|
-
return new EndpointIndex
|
|
83
|
+
return new EndpointIndex(client);
|
|
96
84
|
}
|
|
@@ -6,26 +6,21 @@
|
|
|
6
6
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
7
|
|
|
8
8
|
import { reservedIntervalIdKey } from "../intervalCollection.js";
|
|
9
|
-
import {
|
|
9
|
+
import { type SequenceIntervalClass } from "../intervals/index.js";
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import { type SequenceIntervalIndex } from "./intervalIndex.js";
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
extends IntervalIndex<TInterval>,
|
|
18
|
-
Iterable<TInterval> {
|
|
19
|
-
getIntervalById(id: string): TInterval | undefined;
|
|
13
|
+
export interface IIdIntervalIndex
|
|
14
|
+
extends SequenceIntervalIndex,
|
|
15
|
+
Iterable<SequenceIntervalClass> {
|
|
16
|
+
getIntervalById(id: string): SequenceIntervalClass | undefined;
|
|
20
17
|
|
|
21
|
-
[Symbol.iterator](): Iterator<
|
|
18
|
+
[Symbol.iterator](): Iterator<SequenceIntervalClass>;
|
|
22
19
|
}
|
|
23
|
-
class IdIntervalIndex
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
private readonly intervalIdMap = new Map<string, TInterval>();
|
|
20
|
+
class IdIntervalIndex implements IIdIntervalIndex, Iterable<SequenceIntervalClass> {
|
|
21
|
+
private readonly intervalIdMap = new Map<string, SequenceIntervalClass>();
|
|
27
22
|
|
|
28
|
-
public add(interval:
|
|
23
|
+
public add(interval: SequenceIntervalClass) {
|
|
29
24
|
const id = interval.getIntervalId();
|
|
30
25
|
assert(
|
|
31
26
|
id !== undefined,
|
|
@@ -40,26 +35,21 @@ class IdIntervalIndex<TInterval extends ISerializableInterval>
|
|
|
40
35
|
this.intervalIdMap.set(id, interval);
|
|
41
36
|
}
|
|
42
37
|
|
|
43
|
-
public remove(interval:
|
|
38
|
+
public remove(interval: SequenceIntervalClass) {
|
|
44
39
|
const id = interval.getIntervalId();
|
|
45
40
|
assert(id !== undefined, 0x311 /* expected id to exist on interval */);
|
|
46
41
|
this.intervalIdMap.delete(id);
|
|
47
42
|
}
|
|
48
43
|
|
|
49
|
-
public getIntervalById(id: string):
|
|
44
|
+
public getIntervalById(id: string): SequenceIntervalClass | undefined {
|
|
50
45
|
return this.intervalIdMap.get(id);
|
|
51
46
|
}
|
|
52
47
|
|
|
53
|
-
public [Symbol.iterator](): IterableIterator<
|
|
48
|
+
public [Symbol.iterator](): IterableIterator<SequenceIntervalClass> {
|
|
54
49
|
return this.intervalIdMap.values();
|
|
55
50
|
}
|
|
56
51
|
}
|
|
57
52
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
*/
|
|
61
|
-
export function createIdIntervalIndex<
|
|
62
|
-
TInterval extends ISerializableInterval,
|
|
63
|
-
>(): IIdIntervalIndex<TInterval> {
|
|
64
|
-
return new IdIntervalIndex<TInterval>();
|
|
53
|
+
export function createIdIntervalIndex(): IIdIntervalIndex {
|
|
54
|
+
return new IdIntervalIndex();
|
|
65
55
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export { IntervalIndex } from "./intervalIndex.js";
|
|
6
|
+
export { IntervalIndex, SequenceIntervalIndex } from "./intervalIndex.js";
|
|
7
7
|
export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex.js";
|
|
8
8
|
export { IEndpointIndex, createEndpointIndex, EndpointIndex } from "./endpointIndex.js";
|
|
9
9
|
export {
|
|
@@ -21,5 +21,6 @@ export {
|
|
|
21
21
|
IOverlappingIntervalsIndex,
|
|
22
22
|
createOverlappingIntervalsIndex,
|
|
23
23
|
OverlappingIntervalsIndex,
|
|
24
|
+
ISequenceOverlappingIntervalsIndex,
|
|
24
25
|
} from "./overlappingIntervalsIndex.js";
|
|
25
26
|
export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex.js";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { ISerializableInterval } from "../intervals/index.js";
|
|
6
|
+
import { ISerializableInterval, type SequenceInterval } from "../intervals/index.js";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Collection of intervals.
|
|
@@ -15,6 +15,8 @@ import { ISerializableInterval } from "../intervals/index.js";
|
|
|
15
15
|
* etc.
|
|
16
16
|
* @legacy
|
|
17
17
|
* @alpha
|
|
18
|
+
*
|
|
19
|
+
* @remarks The generic version of this interface is no longer used and will be removed. Use {@link SequenceIntervalIndex} instead.
|
|
18
20
|
*/
|
|
19
21
|
export interface IntervalIndex<TInterval extends ISerializableInterval> {
|
|
20
22
|
/**
|
|
@@ -31,3 +33,30 @@ export interface IntervalIndex<TInterval extends ISerializableInterval> {
|
|
|
31
33
|
*/
|
|
32
34
|
remove(interval: TInterval): void;
|
|
33
35
|
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Collection of intervals.
|
|
39
|
+
*
|
|
40
|
+
* Implementers of this interface will typically implement additional APIs to support efficiently querying a collection
|
|
41
|
+
* of intervals in some manner, for example:
|
|
42
|
+
* - "find all intervals with start endpoint between these two points"
|
|
43
|
+
* - "find all intervals which overlap this range"
|
|
44
|
+
* etc.
|
|
45
|
+
* @legacy
|
|
46
|
+
* @alpha
|
|
47
|
+
*/
|
|
48
|
+
export interface SequenceIntervalIndex {
|
|
49
|
+
/**
|
|
50
|
+
* Adds an interval to the index.
|
|
51
|
+
* @remarks Application code should never need to invoke this method on their index for production scenarios:
|
|
52
|
+
* Fluid handles adding and removing intervals from an index in response to sequence or interval changes.
|
|
53
|
+
*/
|
|
54
|
+
add(interval: SequenceInterval): void;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Removes an interval from the index.
|
|
58
|
+
* @remarks Application code should never need to invoke this method on their index for production scenarios:
|
|
59
|
+
* Fluid handles adding and removing intervals from an index in response to sequence or interval changes.
|
|
60
|
+
*/
|
|
61
|
+
remove(interval: SequenceInterval): void;
|
|
62
|
+
}
|
|
@@ -13,19 +13,21 @@ import {
|
|
|
13
13
|
|
|
14
14
|
import { IntervalNode, IntervalTree } from "../intervalTree.js";
|
|
15
15
|
import {
|
|
16
|
-
IIntervalHelpers,
|
|
17
16
|
ISerializableInterval,
|
|
18
17
|
IntervalType,
|
|
19
18
|
SequenceInterval,
|
|
20
|
-
|
|
19
|
+
createSequenceInterval,
|
|
21
20
|
} from "../intervals/index.js";
|
|
22
21
|
import { ISharedString } from "../sharedString.js";
|
|
23
22
|
|
|
24
|
-
import { IntervalIndex } from "./intervalIndex.js";
|
|
23
|
+
import { IntervalIndex, type SequenceIntervalIndex } from "./intervalIndex.js";
|
|
25
24
|
|
|
26
25
|
/**
|
|
26
|
+
* The generic version of this interface is deprecated and will be removed in a future release.
|
|
27
|
+
* Use {@link ISequenceOverlappingIntervalsIndex} instead.
|
|
27
28
|
* @legacy
|
|
28
29
|
* @alpha
|
|
30
|
+
* @remarks The generic version of this interface is no longer used and will be removed. Use {@link ISequenceOverlappingIntervalsIndex} instead.
|
|
29
31
|
*/
|
|
30
32
|
export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
31
33
|
extends IntervalIndex<TInterval> {
|
|
@@ -46,28 +48,46 @@ export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInter
|
|
|
46
48
|
): void;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
/**
|
|
52
|
+
* @legacy
|
|
53
|
+
* @alpha
|
|
54
|
+
*/
|
|
55
|
+
export interface ISequenceOverlappingIntervalsIndex extends SequenceIntervalIndex {
|
|
56
|
+
/**
|
|
57
|
+
* @returns an array of all intervals contained in this collection that overlap the range
|
|
58
|
+
* `[start end]`.
|
|
59
|
+
*/
|
|
60
|
+
findOverlappingIntervals(start: SequencePlace, end: SequencePlace): SequenceInterval[];
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Gathers the interval results based on specified parameters.
|
|
64
|
+
*/
|
|
65
|
+
gatherIterationResults(
|
|
66
|
+
results: SequenceInterval[],
|
|
67
|
+
iteratesForward: boolean,
|
|
68
|
+
start?: SequencePlace,
|
|
69
|
+
end?: SequencePlace,
|
|
70
|
+
): void;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export class OverlappingIntervalsIndex implements ISequenceOverlappingIntervalsIndex {
|
|
74
|
+
protected readonly intervalTree = new IntervalTree<SequenceInterval>();
|
|
53
75
|
protected readonly client: Client;
|
|
54
|
-
protected readonly helpers: IIntervalHelpers<TInterval>;
|
|
55
76
|
|
|
56
|
-
constructor(client: Client
|
|
77
|
+
constructor(client: Client) {
|
|
57
78
|
this.client = client;
|
|
58
|
-
this.helpers = helpers;
|
|
59
79
|
}
|
|
60
80
|
|
|
61
|
-
public map(fn: (interval:
|
|
81
|
+
public map(fn: (interval: SequenceInterval) => void) {
|
|
62
82
|
this.intervalTree.map(fn);
|
|
63
83
|
}
|
|
64
84
|
|
|
65
|
-
public mapUntil(fn: (interval:
|
|
85
|
+
public mapUntil(fn: (interval: SequenceInterval) => boolean) {
|
|
66
86
|
this.intervalTree.mapUntil(fn);
|
|
67
87
|
}
|
|
68
88
|
|
|
69
89
|
public gatherIterationResults(
|
|
70
|
-
results:
|
|
90
|
+
results: SequenceInterval[],
|
|
71
91
|
iteratesForward: boolean,
|
|
72
92
|
start?: SequencePlace,
|
|
73
93
|
end?: SequencePlace,
|
|
@@ -79,16 +99,16 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
79
99
|
if (start === undefined && end === undefined) {
|
|
80
100
|
// No start/end provided. Gather the whole tree in the specified order.
|
|
81
101
|
if (iteratesForward) {
|
|
82
|
-
this.intervalTree.map((interval:
|
|
102
|
+
this.intervalTree.map((interval: SequenceInterval) => {
|
|
83
103
|
results.push(interval);
|
|
84
104
|
});
|
|
85
105
|
} else {
|
|
86
|
-
this.intervalTree.mapBackward((interval:
|
|
106
|
+
this.intervalTree.mapBackward((interval: SequenceInterval) => {
|
|
87
107
|
results.push(interval);
|
|
88
108
|
});
|
|
89
109
|
}
|
|
90
110
|
} else {
|
|
91
|
-
const transientInterval:
|
|
111
|
+
const transientInterval: SequenceInterval = createSequenceInterval(
|
|
92
112
|
"transient",
|
|
93
113
|
start ?? "start",
|
|
94
114
|
end ?? "end",
|
|
@@ -100,13 +120,13 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
100
120
|
// Only end position provided. Since the tree is not sorted by end position,
|
|
101
121
|
// walk the whole tree in the specified order, gathering intervals that match the end.
|
|
102
122
|
if (iteratesForward) {
|
|
103
|
-
this.intervalTree.map((interval:
|
|
123
|
+
this.intervalTree.map((interval: SequenceInterval) => {
|
|
104
124
|
if (transientInterval.compareEnd(interval) === 0) {
|
|
105
125
|
results.push(interval);
|
|
106
126
|
}
|
|
107
127
|
});
|
|
108
128
|
} else {
|
|
109
|
-
this.intervalTree.mapBackward((interval:
|
|
129
|
+
this.intervalTree.mapBackward((interval: SequenceInterval) => {
|
|
110
130
|
if (transientInterval.compareEnd(interval) === 0) {
|
|
111
131
|
results.push(interval);
|
|
112
132
|
}
|
|
@@ -117,15 +137,15 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
117
137
|
// this start position.
|
|
118
138
|
const compareFn =
|
|
119
139
|
end === undefined
|
|
120
|
-
? (node: IntervalNode<
|
|
140
|
+
? (node: IntervalNode<SequenceInterval>) => {
|
|
121
141
|
return transientInterval.compareStart(node.key);
|
|
122
142
|
}
|
|
123
|
-
: (node: IntervalNode<
|
|
143
|
+
: (node: IntervalNode<SequenceInterval>) => {
|
|
124
144
|
return transientInterval.compare(node.key);
|
|
125
145
|
};
|
|
126
146
|
const continueLeftFn = (cmpResult: number) => cmpResult <= 0;
|
|
127
147
|
const continueRightFn = (cmpResult: number) => cmpResult >= 0;
|
|
128
|
-
const actionFn = (node: IntervalNode<
|
|
148
|
+
const actionFn = (node: IntervalNode<SequenceInterval>) => {
|
|
129
149
|
results.push(node.key);
|
|
130
150
|
};
|
|
131
151
|
|
|
@@ -148,7 +168,10 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
148
168
|
}
|
|
149
169
|
}
|
|
150
170
|
|
|
151
|
-
public findOverlappingIntervals(
|
|
171
|
+
public findOverlappingIntervals(
|
|
172
|
+
start: SequencePlace,
|
|
173
|
+
end: SequencePlace,
|
|
174
|
+
): SequenceInterval[] {
|
|
152
175
|
const { startPos, endPos } = endpointPosAndSide(start, end);
|
|
153
176
|
|
|
154
177
|
if (
|
|
@@ -161,7 +184,7 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
161
184
|
) {
|
|
162
185
|
return [];
|
|
163
186
|
}
|
|
164
|
-
const transientInterval =
|
|
187
|
+
const transientInterval = createSequenceInterval(
|
|
165
188
|
"transient",
|
|
166
189
|
start,
|
|
167
190
|
end,
|
|
@@ -173,11 +196,11 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
173
196
|
return overlappingIntervalNodes.map((node) => node.key);
|
|
174
197
|
}
|
|
175
198
|
|
|
176
|
-
public remove(interval:
|
|
199
|
+
public remove(interval: SequenceInterval) {
|
|
177
200
|
this.intervalTree.removeExisting(interval);
|
|
178
201
|
}
|
|
179
202
|
|
|
180
|
-
public add(interval:
|
|
203
|
+
public add(interval: SequenceInterval) {
|
|
181
204
|
this.intervalTree.put(interval);
|
|
182
205
|
}
|
|
183
206
|
}
|
|
@@ -188,7 +211,7 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
|
188
211
|
*/
|
|
189
212
|
export function createOverlappingIntervalsIndex(
|
|
190
213
|
sharedString: ISharedString,
|
|
191
|
-
):
|
|
214
|
+
): ISequenceOverlappingIntervalsIndex {
|
|
192
215
|
const client = (sharedString as unknown as { client: Client }).client;
|
|
193
|
-
return new OverlappingIntervalsIndex
|
|
216
|
+
return new OverlappingIntervalsIndex(client);
|
|
194
217
|
}
|
|
@@ -18,7 +18,6 @@ import {
|
|
|
18
18
|
SequenceInterval,
|
|
19
19
|
SequenceIntervalClass,
|
|
20
20
|
createPositionReferenceFromSegoff,
|
|
21
|
-
sequenceIntervalHelpers,
|
|
22
21
|
} from "../intervals/index.js";
|
|
23
22
|
import { ISharedString } from "../sharedString.js";
|
|
24
23
|
|
|
@@ -26,11 +25,11 @@ import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
|
|
|
26
25
|
import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
|
|
27
26
|
|
|
28
27
|
class OverlappingSequenceIntervalsIndex
|
|
29
|
-
extends OverlappingIntervalsIndex
|
|
28
|
+
extends OverlappingIntervalsIndex
|
|
30
29
|
implements SequenceIntervalIndexes.Overlapping
|
|
31
30
|
{
|
|
32
31
|
constructor(client: Client) {
|
|
33
|
-
super(client
|
|
32
|
+
super(client);
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
public findOverlappingIntervalsBySegoff(
|
|
@@ -7,7 +7,7 @@ import { ISegment } from "@fluidframework/merge-tree/internal";
|
|
|
7
7
|
|
|
8
8
|
import { SequenceInterval } from "../intervals/index.js";
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import { type ISequenceOverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* This namespace contains specialiazations of indexes which support spatial queries
|
|
@@ -22,7 +22,7 @@ export namespace SequenceIntervalIndexes {
|
|
|
22
22
|
* Provides additional APIs to support efficiently querying a collection of intervals based on segments and offset.
|
|
23
23
|
* @internal
|
|
24
24
|
*/
|
|
25
|
-
export interface Overlapping extends
|
|
25
|
+
export interface Overlapping extends ISequenceOverlappingIntervalsIndex {
|
|
26
26
|
/**
|
|
27
27
|
* Finds overlapping intervals within the specified range.
|
|
28
28
|
*
|
|
@@ -7,16 +7,10 @@
|
|
|
7
7
|
|
|
8
8
|
import { Client, PropertyAction, RedBlackTree } from "@fluidframework/merge-tree/internal";
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
IIntervalHelpers,
|
|
12
|
-
ISerializableInterval,
|
|
13
|
-
IntervalType,
|
|
14
|
-
SequenceInterval,
|
|
15
|
-
sequenceIntervalHelpers,
|
|
16
|
-
} from "../intervals/index.js";
|
|
10
|
+
import { IntervalType, SequenceInterval, createSequenceInterval } from "../intervals/index.js";
|
|
17
11
|
import { ISharedString } from "../sharedString.js";
|
|
18
12
|
|
|
19
|
-
import {
|
|
13
|
+
import { type SequenceIntervalIndex } from "./intervalIndex.js";
|
|
20
14
|
import {
|
|
21
15
|
HasComparisonOverride,
|
|
22
16
|
compareOverrideables,
|
|
@@ -29,25 +23,19 @@ import {
|
|
|
29
23
|
* Provide additional APIs to support efficiently querying a collection of intervals whose startpoints fall within a specified range.
|
|
30
24
|
* @internal
|
|
31
25
|
*/
|
|
32
|
-
export interface IStartpointInRangeIndex
|
|
33
|
-
extends IntervalIndex<TInterval> {
|
|
26
|
+
export interface IStartpointInRangeIndex extends SequenceIntervalIndex {
|
|
34
27
|
/**
|
|
35
28
|
* @returns an array of all intervals contained in this collection whose startpoints locate in the range [start, end] (includes both ends)
|
|
36
29
|
*/
|
|
37
|
-
findIntervalsWithStartpointInRange(start: number, end: number):
|
|
30
|
+
findIntervalsWithStartpointInRange(start: number, end: number): SequenceInterval[];
|
|
38
31
|
}
|
|
39
32
|
|
|
40
|
-
export class StartpointInRangeIndex
|
|
41
|
-
implements IStartpointInRangeIndex<TInterval>
|
|
42
|
-
{
|
|
33
|
+
export class StartpointInRangeIndex implements IStartpointInRangeIndex {
|
|
43
34
|
private readonly intervalTree;
|
|
44
35
|
|
|
45
|
-
constructor(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
) {
|
|
49
|
-
this.intervalTree = new RedBlackTree<TInterval, TInterval>(
|
|
50
|
-
(a: TInterval, b: TInterval) => {
|
|
36
|
+
constructor(private readonly client: Client) {
|
|
37
|
+
this.intervalTree = new RedBlackTree<SequenceInterval, SequenceInterval>(
|
|
38
|
+
(a: SequenceInterval, b: SequenceInterval) => {
|
|
51
39
|
const compareStartsResult = a.compareStart(b);
|
|
52
40
|
if (compareStartsResult !== 0) {
|
|
53
41
|
return compareStartsResult;
|
|
@@ -70,25 +58,25 @@ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
|
70
58
|
);
|
|
71
59
|
}
|
|
72
60
|
|
|
73
|
-
public add(interval:
|
|
61
|
+
public add(interval: SequenceInterval): void {
|
|
74
62
|
this.intervalTree.put(interval, interval);
|
|
75
63
|
}
|
|
76
64
|
|
|
77
|
-
public remove(interval:
|
|
65
|
+
public remove(interval: SequenceInterval): void {
|
|
78
66
|
this.intervalTree.remove(interval);
|
|
79
67
|
}
|
|
80
68
|
|
|
81
|
-
public findIntervalsWithStartpointInRange(start: number, end: number):
|
|
69
|
+
public findIntervalsWithStartpointInRange(start: number, end: number): SequenceInterval[] {
|
|
82
70
|
if (start <= 0 || start > end || this.intervalTree.isEmpty()) {
|
|
83
71
|
return [];
|
|
84
72
|
}
|
|
85
|
-
const results:
|
|
86
|
-
const action: PropertyAction<
|
|
73
|
+
const results: SequenceInterval[] = [];
|
|
74
|
+
const action: PropertyAction<SequenceInterval, SequenceInterval> = (node) => {
|
|
87
75
|
results.push(node.data);
|
|
88
76
|
return true;
|
|
89
77
|
};
|
|
90
78
|
|
|
91
|
-
const transientStartInterval =
|
|
79
|
+
const transientStartInterval = createSequenceInterval(
|
|
92
80
|
"transient",
|
|
93
81
|
start,
|
|
94
82
|
start,
|
|
@@ -96,7 +84,7 @@ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
|
96
84
|
IntervalType.Transient,
|
|
97
85
|
);
|
|
98
86
|
|
|
99
|
-
const transientEndInterval =
|
|
87
|
+
const transientEndInterval = createSequenceInterval(
|
|
100
88
|
"transient",
|
|
101
89
|
end,
|
|
102
90
|
end,
|
|
@@ -117,7 +105,7 @@ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
|
|
|
117
105
|
*/
|
|
118
106
|
export function createStartpointInRangeIndex(
|
|
119
107
|
sharedString: ISharedString,
|
|
120
|
-
): IStartpointInRangeIndex
|
|
108
|
+
): IStartpointInRangeIndex {
|
|
121
109
|
const client = (sharedString as unknown as { client: Client }).client;
|
|
122
|
-
return new StartpointInRangeIndex
|
|
110
|
+
return new StartpointInRangeIndex(client);
|
|
123
111
|
}
|
package/src/intervals/index.ts
CHANGED
|
@@ -10,7 +10,6 @@ export {
|
|
|
10
10
|
IntervalOpType,
|
|
11
11
|
IntervalType,
|
|
12
12
|
IntervalDeltaOpType,
|
|
13
|
-
IIntervalHelpers,
|
|
14
13
|
IntervalStickiness,
|
|
15
14
|
ISerializableIntervalPrivate,
|
|
16
15
|
SerializedIntervalDelta,
|
|
@@ -18,11 +17,9 @@ export {
|
|
|
18
17
|
endReferenceSlidingPreference,
|
|
19
18
|
startReferenceSlidingPreference,
|
|
20
19
|
} from "./intervalUtils.js";
|
|
21
|
-
export { Interval, createInterval, intervalHelpers } from "./interval.js";
|
|
22
20
|
export {
|
|
23
21
|
SequenceInterval,
|
|
24
22
|
SequenceIntervalClass,
|
|
25
23
|
createSequenceInterval,
|
|
26
24
|
createPositionReferenceFromSegoff,
|
|
27
|
-
sequenceIntervalHelpers,
|
|
28
25
|
} from "./sequenceInterval.js";
|
|
@@ -7,9 +7,6 @@
|
|
|
7
7
|
|
|
8
8
|
import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
9
9
|
import {
|
|
10
|
-
// eslint-disable-next-line import/no-deprecated
|
|
11
|
-
Client,
|
|
12
|
-
// eslint-disable-next-line import/no-deprecated
|
|
13
10
|
PropertiesManager,
|
|
14
11
|
PropertySet,
|
|
15
12
|
SlidingPreference,
|
|
@@ -17,6 +14,8 @@ import {
|
|
|
17
14
|
Side,
|
|
18
15
|
} from "@fluidframework/merge-tree/internal";
|
|
19
16
|
|
|
17
|
+
import type { SequenceIntervalClass } from "./sequenceInterval.js";
|
|
18
|
+
|
|
20
19
|
/**
|
|
21
20
|
* Basic interval abstraction
|
|
22
21
|
* @legacy
|
|
@@ -172,7 +171,7 @@ export interface ISerializableInterval extends IInterval {
|
|
|
172
171
|
getIntervalId(): string;
|
|
173
172
|
}
|
|
174
173
|
|
|
175
|
-
export type ISerializableIntervalPrivate
|
|
174
|
+
export type ISerializableIntervalPrivate = SequenceIntervalClass & {
|
|
176
175
|
propertyManager?: PropertiesManager;
|
|
177
176
|
};
|
|
178
177
|
|
|
@@ -215,40 +214,6 @@ export type CompressedSerializedInterval =
|
|
|
215
214
|
]
|
|
216
215
|
| [number | "start" | "end", number | "start" | "end", number, IntervalType, PropertySet];
|
|
217
216
|
|
|
218
|
-
/**
|
|
219
|
-
* @sealed
|
|
220
|
-
* @deprecated The methods within have substitutions
|
|
221
|
-
* @internal
|
|
222
|
-
*/
|
|
223
|
-
export interface IIntervalHelpers<TInterval extends ISerializableInterval> {
|
|
224
|
-
/**
|
|
225
|
-
*
|
|
226
|
-
* @param label - label of the interval collection this interval is being added to. This parameter is
|
|
227
|
-
* irrelevant for transient intervals.
|
|
228
|
-
* @param start - numerical start position of the interval
|
|
229
|
-
* @param end - numerical end position of the interval
|
|
230
|
-
* @param client - client creating the interval
|
|
231
|
-
* @param intervalType - Type of interval to create. Default is SlideOnRemove
|
|
232
|
-
* @param op - If this create came from a remote client, op that created it. Default is undefined (i.e. local)
|
|
233
|
-
* @param fromSnapshot - If this create came from loading a snapshot. Default is false.
|
|
234
|
-
* @param startSide - The side on which the start position lays. See
|
|
235
|
-
* {@link @fluidframework/merge-tree#SequencePlace} for additional context
|
|
236
|
-
* @param endSide - The side on which the end position lays. See
|
|
237
|
-
* {@link @fluidframework/merge-tree#SequencePlace} for additional context
|
|
238
|
-
*/
|
|
239
|
-
create(
|
|
240
|
-
label: string,
|
|
241
|
-
start: SequencePlace | undefined,
|
|
242
|
-
end: SequencePlace | undefined,
|
|
243
|
-
// eslint-disable-next-line import/no-deprecated
|
|
244
|
-
client: Client | undefined,
|
|
245
|
-
intervalType: IntervalType,
|
|
246
|
-
op?: ISequencedDocumentMessage,
|
|
247
|
-
fromSnapshot?: boolean,
|
|
248
|
-
useNewSlidingBehavior?: boolean,
|
|
249
|
-
): TInterval;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
217
|
/**
|
|
253
218
|
* Determines how an interval should expand when segments are inserted adjacent
|
|
254
219
|
* to the range it spans
|