@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.
Files changed (107) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/defaultMap.d.ts +3 -2
  3. package/dist/defaultMap.d.ts.map +1 -1
  4. package/dist/defaultMap.js +4 -3
  5. package/dist/defaultMap.js.map +1 -1
  6. package/dist/defaultMapInterfaces.d.ts +12 -1
  7. package/dist/defaultMapInterfaces.d.ts.map +1 -1
  8. package/dist/defaultMapInterfaces.js.map +1 -1
  9. package/dist/index.d.ts +4 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +17 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/intervalCollection.d.ts +240 -78
  14. package/dist/intervalCollection.d.ts.map +1 -1
  15. package/dist/intervalCollection.js +313 -190
  16. package/dist/intervalCollection.js.map +1 -1
  17. package/dist/intervalIndex/index.d.ts +8 -0
  18. package/dist/intervalIndex/index.d.ts.map +1 -0
  19. package/dist/intervalIndex/index.js +12 -0
  20. package/dist/intervalIndex/index.js.map +1 -0
  21. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
  22. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  23. package/dist/intervalIndex/overlappingIntervalsIndex.js +103 -0
  24. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  25. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
  26. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  27. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +33 -0
  28. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  29. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
  30. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  31. package/dist/intervalIndex/sequenceIntervalIndexes.js +7 -0
  32. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  33. package/dist/packageVersion.d.ts +1 -1
  34. package/dist/packageVersion.js +1 -1
  35. package/dist/packageVersion.js.map +1 -1
  36. package/dist/revertibles.d.ts +104 -0
  37. package/dist/revertibles.d.ts.map +1 -0
  38. package/dist/revertibles.js +414 -0
  39. package/dist/revertibles.js.map +1 -0
  40. package/dist/sequence.d.ts +4 -4
  41. package/dist/sequence.d.ts.map +1 -1
  42. package/dist/sequence.js +3 -3
  43. package/dist/sequence.js.map +1 -1
  44. package/dist/sharedIntervalCollection.d.ts +3 -3
  45. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  46. package/dist/sharedIntervalCollection.js +1 -1
  47. package/dist/sharedIntervalCollection.js.map +1 -1
  48. package/dist/tsdoc-metadata.json +11 -0
  49. package/lib/defaultMap.d.ts +3 -2
  50. package/lib/defaultMap.d.ts.map +1 -1
  51. package/lib/defaultMap.js +4 -3
  52. package/lib/defaultMap.js.map +1 -1
  53. package/lib/defaultMapInterfaces.d.ts +12 -1
  54. package/lib/defaultMapInterfaces.d.ts.map +1 -1
  55. package/lib/defaultMapInterfaces.js.map +1 -1
  56. package/lib/index.d.ts +4 -2
  57. package/lib/index.d.ts.map +1 -1
  58. package/lib/index.js +3 -1
  59. package/lib/index.js.map +1 -1
  60. package/lib/intervalCollection.d.ts +240 -78
  61. package/lib/intervalCollection.d.ts.map +1 -1
  62. package/lib/intervalCollection.js +310 -190
  63. package/lib/intervalCollection.js.map +1 -1
  64. package/lib/intervalIndex/index.d.ts +8 -0
  65. package/lib/intervalIndex/index.d.ts.map +1 -0
  66. package/lib/intervalIndex/index.js +7 -0
  67. package/lib/intervalIndex/index.js.map +1 -0
  68. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
  69. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  70. package/lib/intervalIndex/overlappingIntervalsIndex.js +98 -0
  71. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  72. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
  73. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  74. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +29 -0
  75. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  76. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
  77. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  78. package/lib/intervalIndex/sequenceIntervalIndexes.js +6 -0
  79. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  80. package/lib/packageVersion.d.ts +1 -1
  81. package/lib/packageVersion.js +1 -1
  82. package/lib/packageVersion.js.map +1 -1
  83. package/lib/revertibles.d.ts +104 -0
  84. package/lib/revertibles.d.ts.map +1 -0
  85. package/lib/revertibles.js +404 -0
  86. package/lib/revertibles.js.map +1 -0
  87. package/lib/sequence.d.ts +4 -4
  88. package/lib/sequence.d.ts.map +1 -1
  89. package/lib/sequence.js +3 -3
  90. package/lib/sequence.js.map +1 -1
  91. package/lib/sharedIntervalCollection.d.ts +3 -3
  92. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  93. package/lib/sharedIntervalCollection.js +1 -1
  94. package/lib/sharedIntervalCollection.js.map +1 -1
  95. package/package.json +22 -24
  96. package/src/defaultMap.ts +4 -1
  97. package/src/defaultMapInterfaces.ts +13 -1
  98. package/src/index.ts +27 -5
  99. package/src/intervalCollection.ts +660 -216
  100. package/src/intervalIndex/index.ts +11 -0
  101. package/src/intervalIndex/overlappingIntervalsIndex.ts +166 -0
  102. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +71 -0
  103. package/src/intervalIndex/sequenceIntervalIndexes.ts +32 -0
  104. package/src/packageVersion.ts +1 -1
  105. package/src/revertibles.ts +626 -0
  106. package/src/sequence.ts +12 -2
  107. 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
+ }
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/sequence";
9
- export const pkgVersion = "2.0.0-dev.4.4.0.162574";
9
+ export const pkgVersion = "2.0.0-dev.5.3.2.178189";