@fluidframework/sequence 2.0.0-dev.4.4.0.162574 → 2.0.0-dev.5.3.2.178189
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 +48 -0
- package/dist/defaultMap.d.ts +3 -2
- package/dist/defaultMap.d.ts.map +1 -1
- package/dist/defaultMap.js +4 -3
- package/dist/defaultMap.js.map +1 -1
- package/dist/defaultMapInterfaces.d.ts +12 -1
- package/dist/defaultMapInterfaces.d.ts.map +1 -1
- package/dist/defaultMapInterfaces.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -3
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +240 -78
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +313 -190
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalIndex/index.d.ts +8 -0
- package/dist/intervalIndex/index.d.ts.map +1 -0
- package/dist/intervalIndex/index.js +12 -0
- package/dist/intervalIndex/index.js.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.js +103 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +33 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.js +7 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
- 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 +104 -0
- package/dist/revertibles.d.ts.map +1 -0
- package/dist/revertibles.js +414 -0
- package/dist/revertibles.js.map +1 -0
- package/dist/sequence.d.ts +4 -4
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +3 -3
- package/dist/sequence.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +3 -3
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +1 -1
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/tsdoc-metadata.json +11 -0
- package/lib/defaultMap.d.ts +3 -2
- package/lib/defaultMap.d.ts.map +1 -1
- package/lib/defaultMap.js +4 -3
- package/lib/defaultMap.js.map +1 -1
- package/lib/defaultMapInterfaces.d.ts +12 -1
- package/lib/defaultMapInterfaces.d.ts.map +1 -1
- package/lib/defaultMapInterfaces.js.map +1 -1
- package/lib/index.d.ts +4 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +240 -78
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +310 -190
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalIndex/index.d.ts +8 -0
- package/lib/intervalIndex/index.d.ts.map +1 -0
- package/lib/intervalIndex/index.js +7 -0
- package/lib/intervalIndex/index.js.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.js +98 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +29 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.js +6 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
- 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 +104 -0
- package/lib/revertibles.d.ts.map +1 -0
- package/lib/revertibles.js +404 -0
- package/lib/revertibles.js.map +1 -0
- package/lib/sequence.d.ts +4 -4
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +3 -3
- package/lib/sequence.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +3 -3
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +1 -1
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/package.json +22 -24
- package/src/defaultMap.ts +4 -1
- package/src/defaultMapInterfaces.ts +13 -1
- package/src/index.ts +27 -5
- package/src/intervalCollection.ts +660 -216
- package/src/intervalIndex/index.ts +11 -0
- package/src/intervalIndex/overlappingIntervalsIndex.ts +166 -0
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +71 -0
- package/src/intervalIndex/sequenceIntervalIndexes.ts +32 -0
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +626 -0
- package/src/sequence.ts +12 -2
- package/src/sharedIntervalCollection.ts +4 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
|
|
7
|
+
export {
|
|
8
|
+
IOverlappingIntervalsIndex,
|
|
9
|
+
createOverlappingIntervalsIndex,
|
|
10
|
+
} from "./overlappingIntervalsIndex";
|
|
11
|
+
export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex";
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Client } from "@fluidframework/merge-tree";
|
|
7
|
+
import {
|
|
8
|
+
IntervalType,
|
|
9
|
+
IIntervalHelpers,
|
|
10
|
+
IntervalIndex,
|
|
11
|
+
ISerializableInterval,
|
|
12
|
+
} from "../intervalCollection";
|
|
13
|
+
import { IntervalNode, IntervalTree } from "../intervalTree";
|
|
14
|
+
|
|
15
|
+
export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
16
|
+
extends IntervalIndex<TInterval> {
|
|
17
|
+
/**
|
|
18
|
+
* @returns an array of all intervals contained in this collection that overlap the range
|
|
19
|
+
* `[start end]`.
|
|
20
|
+
*/
|
|
21
|
+
findOverlappingIntervals(start: number, end: number): TInterval[];
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Gathers the interval results based on specified parameters.
|
|
25
|
+
*/
|
|
26
|
+
gatherIterationResults(
|
|
27
|
+
results: TInterval[],
|
|
28
|
+
iteratesForward: boolean,
|
|
29
|
+
start?: number,
|
|
30
|
+
end?: number,
|
|
31
|
+
): void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
|
|
35
|
+
implements IOverlappingIntervalsIndex<TInterval>
|
|
36
|
+
{
|
|
37
|
+
protected readonly intervalTree = new IntervalTree<TInterval>();
|
|
38
|
+
protected readonly client: Client;
|
|
39
|
+
protected readonly helpers: IIntervalHelpers<TInterval>;
|
|
40
|
+
|
|
41
|
+
constructor(client: Client, helpers: IIntervalHelpers<TInterval>) {
|
|
42
|
+
this.client = client;
|
|
43
|
+
this.helpers = helpers;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public map(fn: (interval: TInterval) => void) {
|
|
47
|
+
this.intervalTree.map(fn);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public mapUntil(fn: (interval: TInterval) => boolean) {
|
|
51
|
+
this.intervalTree.mapUntil(fn);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public gatherIterationResults(
|
|
55
|
+
results: TInterval[],
|
|
56
|
+
iteratesForward: boolean,
|
|
57
|
+
start?: number,
|
|
58
|
+
end?: number,
|
|
59
|
+
): void {
|
|
60
|
+
if (this.intervalTree.intervals.isEmpty()) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (start === undefined && end === undefined) {
|
|
65
|
+
// No start/end provided. Gather the whole tree in the specified order.
|
|
66
|
+
if (iteratesForward) {
|
|
67
|
+
this.intervalTree.map((interval: TInterval) => {
|
|
68
|
+
results.push(interval);
|
|
69
|
+
});
|
|
70
|
+
} else {
|
|
71
|
+
this.intervalTree.mapBackward((interval: TInterval) => {
|
|
72
|
+
results.push(interval);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
const transientInterval: TInterval = this.helpers.create(
|
|
77
|
+
"transient",
|
|
78
|
+
start,
|
|
79
|
+
end,
|
|
80
|
+
this.client,
|
|
81
|
+
IntervalType.Transient,
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
if (start === undefined) {
|
|
85
|
+
// Only end position provided. Since the tree is not sorted by end position,
|
|
86
|
+
// walk the whole tree in the specified order, gathering intervals that match the end.
|
|
87
|
+
if (iteratesForward) {
|
|
88
|
+
this.intervalTree.map((interval: TInterval) => {
|
|
89
|
+
if (transientInterval.compareEnd(interval) === 0) {
|
|
90
|
+
results.push(interval);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
} else {
|
|
94
|
+
this.intervalTree.mapBackward((interval: TInterval) => {
|
|
95
|
+
if (transientInterval.compareEnd(interval) === 0) {
|
|
96
|
+
results.push(interval);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
// Start and (possibly) end provided. Walk the subtrees that may contain
|
|
102
|
+
// this start position.
|
|
103
|
+
const compareFn =
|
|
104
|
+
end === undefined
|
|
105
|
+
? (node: IntervalNode<TInterval>) => {
|
|
106
|
+
return transientInterval.compareStart(node.key);
|
|
107
|
+
}
|
|
108
|
+
: (node: IntervalNode<TInterval>) => {
|
|
109
|
+
return transientInterval.compare(node.key);
|
|
110
|
+
};
|
|
111
|
+
const continueLeftFn = (cmpResult: number) => cmpResult <= 0;
|
|
112
|
+
const continueRightFn = (cmpResult: number) => cmpResult >= 0;
|
|
113
|
+
const actionFn = (node: IntervalNode<TInterval>) => {
|
|
114
|
+
results.push(node.key);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
if (iteratesForward) {
|
|
118
|
+
this.intervalTree.intervals.walkExactMatchesForward(
|
|
119
|
+
compareFn,
|
|
120
|
+
actionFn,
|
|
121
|
+
continueLeftFn,
|
|
122
|
+
continueRightFn,
|
|
123
|
+
);
|
|
124
|
+
} else {
|
|
125
|
+
this.intervalTree.intervals.walkExactMatchesBackward(
|
|
126
|
+
compareFn,
|
|
127
|
+
actionFn,
|
|
128
|
+
continueLeftFn,
|
|
129
|
+
continueRightFn,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public findOverlappingIntervals(start: number, end: number): TInterval[] {
|
|
137
|
+
if (end < start || this.intervalTree.intervals.isEmpty()) {
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
const transientInterval = this.helpers.create(
|
|
141
|
+
"transient",
|
|
142
|
+
start,
|
|
143
|
+
end,
|
|
144
|
+
this.client,
|
|
145
|
+
IntervalType.Transient,
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
const overlappingIntervalNodes = this.intervalTree.match(transientInterval);
|
|
149
|
+
return overlappingIntervalNodes.map((node) => node.key);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
public remove(interval: TInterval) {
|
|
153
|
+
this.intervalTree.removeExisting(interval);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
public add(interval: TInterval) {
|
|
157
|
+
this.intervalTree.put(interval);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function createOverlappingIntervalsIndex<TInterval extends ISerializableInterval>(
|
|
162
|
+
client: Client,
|
|
163
|
+
helpers: IIntervalHelpers<TInterval>,
|
|
164
|
+
): IOverlappingIntervalsIndex<TInterval> {
|
|
165
|
+
return new OverlappingIntervalsIndex<TInterval>(client, helpers);
|
|
166
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
Client,
|
|
8
|
+
ISegment,
|
|
9
|
+
ReferenceType,
|
|
10
|
+
compareReferencePositions,
|
|
11
|
+
reservedRangeLabelsKey,
|
|
12
|
+
} from "@fluidframework/merge-tree";
|
|
13
|
+
import {
|
|
14
|
+
sequenceIntervalHelpers,
|
|
15
|
+
IntervalType,
|
|
16
|
+
SequenceInterval,
|
|
17
|
+
createPositionReferenceFromSegoff,
|
|
18
|
+
} from "../intervalCollection";
|
|
19
|
+
import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
|
|
20
|
+
import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
|
|
21
|
+
|
|
22
|
+
class OverlappingSequenceIntervalsIndex
|
|
23
|
+
extends OverlappingIntervalsIndex<SequenceInterval>
|
|
24
|
+
implements SequenceIntervalIndexes.Overlapping
|
|
25
|
+
{
|
|
26
|
+
constructor(client: Client) {
|
|
27
|
+
super(client, sequenceIntervalHelpers);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public findOverlappingIntervalsBySegoff(
|
|
31
|
+
startSegoff: { segment: ISegment | undefined; offset: number | undefined },
|
|
32
|
+
endSegoff: { segment: ISegment | undefined; offset: number | undefined },
|
|
33
|
+
): Iterable<SequenceInterval> {
|
|
34
|
+
if (this.intervalTree.intervals.isEmpty()) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const startLref = createPositionReferenceFromSegoff(
|
|
39
|
+
this.client,
|
|
40
|
+
startSegoff,
|
|
41
|
+
ReferenceType.Transient,
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const endLref = createPositionReferenceFromSegoff(
|
|
45
|
+
this.client,
|
|
46
|
+
endSegoff,
|
|
47
|
+
ReferenceType.Transient,
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
if (compareReferencePositions(startLref, endLref) > 0) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const transientInterval = new SequenceInterval(
|
|
55
|
+
this.client,
|
|
56
|
+
startLref,
|
|
57
|
+
endLref,
|
|
58
|
+
IntervalType.Transient,
|
|
59
|
+
{ [reservedRangeLabelsKey]: ["transient"] },
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const overlappingIntervalNodes = this.intervalTree.match(transientInterval);
|
|
63
|
+
return overlappingIntervalNodes.map((node) => node.key);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function createOverlappingSequenceIntervalsIndex(
|
|
68
|
+
client: Client,
|
|
69
|
+
): SequenceIntervalIndexes.Overlapping {
|
|
70
|
+
return new OverlappingSequenceIntervalsIndex(client);
|
|
71
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ISegment } from "@fluidframework/merge-tree";
|
|
7
|
+
import { SequenceInterval } from "../intervalCollection";
|
|
8
|
+
import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This namespace contains specialiazations of indexes which support spatial queries
|
|
12
|
+
* specifically for `SequenceInterval`s.
|
|
13
|
+
*/
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
15
|
+
export namespace SequenceIntervalIndexes {
|
|
16
|
+
/**
|
|
17
|
+
* Collection of intervals.
|
|
18
|
+
*
|
|
19
|
+
* Provides additional APIs to support efficiently querying a collection of intervals based on segments and offset.
|
|
20
|
+
*/
|
|
21
|
+
export interface Overlapping extends IOverlappingIntervalsIndex<SequenceInterval> {
|
|
22
|
+
/**
|
|
23
|
+
* Finds overlapping intervals within the specified range.
|
|
24
|
+
*
|
|
25
|
+
* @returns an array of all intervals that overlap with the specified SegOff range (includes both ends)
|
|
26
|
+
*/
|
|
27
|
+
findOverlappingIntervalsBySegoff(
|
|
28
|
+
startSegoff: { segment: ISegment | undefined; offset: number | undefined },
|
|
29
|
+
endSegoff: { segment: ISegment | undefined; offset: number | undefined },
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
package/src/packageVersion.ts
CHANGED