@fluidframework/sequence
Advanced tools
+1
-1
@@ -5,3 +5,3 @@ /*! | ||
| */ | ||
| export { DeserializeCallback, IIntervalHelpers, Interval, ISerializableInterval, ISerializedInterval, IntervalCollection, IntervalCollectionIterator, IntervalCollectionView, SequenceInterval, } from "./intervalCollection"; | ||
| export { DeserializeCallback, IIntervalHelpers, Interval, ISerializableInterval, ISerializedInterval, IntervalCollection, IntervalCollectionIterator, SequenceInterval, } from "./intervalCollection"; | ||
| export { IValueOpEmitter, } from "./mapKernelInterfaces"; | ||
@@ -8,0 +8,0 @@ export * from "./sharedString"; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,eAAe,GAClB,MAAM,uBAAuB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,eAAe,GAClB,MAAM,uBAAuB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC"} |
+1
-2
@@ -17,3 +17,3 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.SequenceInterval = exports.IntervalCollectionView = exports.IntervalCollectionIterator = exports.IntervalCollection = exports.Interval = void 0; | ||
| exports.SequenceInterval = exports.IntervalCollectionIterator = exports.IntervalCollection = exports.Interval = void 0; | ||
| var intervalCollection_1 = require("./intervalCollection"); | ||
@@ -23,3 +23,2 @@ Object.defineProperty(exports, "Interval", { enumerable: true, get: function () { return intervalCollection_1.Interval; } }); | ||
| Object.defineProperty(exports, "IntervalCollectionIterator", { enumerable: true, get: function () { return intervalCollection_1.IntervalCollectionIterator; } }); | ||
| Object.defineProperty(exports, "IntervalCollectionView", { enumerable: true, get: function () { return intervalCollection_1.IntervalCollectionView; } }); | ||
| Object.defineProperty(exports, "SequenceInterval", { enumerable: true, get: function () { return intervalCollection_1.SequenceInterval; } }); | ||
@@ -26,0 +25,0 @@ __exportStar(require("./sharedString"), exports); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;AAEH,2DAU8B;AAP1B,8GAAA,QAAQ,OAAA;AAGR,wHAAA,kBAAkB,OAAA;AAClB,gIAAA,0BAA0B,OAAA;AAC1B,4HAAA,sBAAsB,OAAA;AACtB,sHAAA,gBAAgB,OAAA;AAKpB,iDAA+B;AAC/B,6CAA2B;AAC3B,oDAAkC;AAClC,uDAAqC;AACrC,mDAAiC;AACjC,yDAAuC;AACvC,yDAAuC;AACvC,iDAA+B;AAC/B,6DAA2C","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n DeserializeCallback,\n IIntervalHelpers,\n Interval,\n ISerializableInterval,\n ISerializedInterval,\n IntervalCollection,\n IntervalCollectionIterator,\n IntervalCollectionView,\n SequenceInterval,\n} from \"./intervalCollection\";\nexport {\n IValueOpEmitter,\n} from \"./mapKernelInterfaces\";\nexport * from \"./sharedString\";\nexport * from \"./sequence\";\nexport * from \"./sequenceFactory\";\nexport * from \"./sequenceDeltaEvent\";\nexport * from \"./sharedSequence\";\nexport * from \"./sharedObjectSequence\";\nexport * from \"./sharedNumberSequence\";\nexport * from \"./sparsematrix\";\nexport * from \"./sharedIntervalCollection\";\n"]} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;AAEH,2DAS8B;AAN1B,8GAAA,QAAQ,OAAA;AAGR,wHAAA,kBAAkB,OAAA;AAClB,gIAAA,0BAA0B,OAAA;AAC1B,sHAAA,gBAAgB,OAAA;AAKpB,iDAA+B;AAC/B,6CAA2B;AAC3B,oDAAkC;AAClC,uDAAqC;AACrC,mDAAiC;AACjC,yDAAuC;AACvC,yDAAuC;AACvC,iDAA+B;AAC/B,6DAA2C","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n DeserializeCallback,\n IIntervalHelpers,\n Interval,\n ISerializableInterval,\n ISerializedInterval,\n IntervalCollection,\n IntervalCollectionIterator,\n SequenceInterval,\n} from \"./intervalCollection\";\nexport {\n IValueOpEmitter,\n} from \"./mapKernelInterfaces\";\nexport * from \"./sharedString\";\nexport * from \"./sequence\";\nexport * from \"./sequenceFactory\";\nexport * from \"./sequenceDeltaEvent\";\nexport * from \"./sharedSequence\";\nexport * from \"./sharedObjectSequence\";\nexport * from \"./sharedNumberSequence\";\nexport * from \"./sparsematrix\";\nexport * from \"./sharedIntervalCollection\";\n"]} |
@@ -10,2 +10,3 @@ /*! | ||
| import { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from "./mapKernelInterfaces"; | ||
| export declare const reservedIntervalIdKey = "intervalId"; | ||
| export interface ISerializedInterval { | ||
@@ -33,2 +34,3 @@ sequenceNumber: number; | ||
| constructor(start: number, end: number, props?: MergeTree.PropertySet); | ||
| getIntervalId(): string | undefined; | ||
| getAdditionalPropertySets(): MergeTree.PropertySet[]; | ||
@@ -59,2 +61,3 @@ addPropertySet(props: MergeTree.PropertySet): void; | ||
| overlaps(b: SequenceInterval): boolean; | ||
| getIntervalId(): string | undefined; | ||
| union(b: SequenceInterval): SequenceInterval; | ||
@@ -78,2 +81,4 @@ addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp): void; | ||
| map(fn: (interval: TInterval) => void): void; | ||
| createLegacyId(start: number, end: number): string; | ||
| ensureSerializedId(serializedInterval: ISerializedInterval): void; | ||
| gatherIterationResults(results: TInterval[], iteratesForward: boolean, start?: number, end?: number): void; | ||
@@ -105,23 +110,2 @@ findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[]; | ||
| export declare type DeserializeCallback = (properties: MergeTree.PropertySet) => void; | ||
| export declare class IntervalCollectionView<TInterval extends ISerializableInterval> extends EventEmitter { | ||
| private readonly client; | ||
| private readonly emitter; | ||
| private readonly localCollection; | ||
| private onDeserialize; | ||
| constructor(client: MergeTree.Client, savedSerializedIntervals: ISerializedInterval[], label: string, helpers: IIntervalHelpers<TInterval>, emitter: IValueOpEmitter); | ||
| attachDeserializer(onDeserialize: DeserializeCallback): void; | ||
| addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void; | ||
| findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[]; | ||
| map(fn: (interval: TInterval) => void): void; | ||
| gatherIterationResults(results: TInterval[], iteratesForward: boolean, start?: number, end?: number): void; | ||
| previousInterval(pos: number): TInterval; | ||
| nextInterval(pos: number): TInterval; | ||
| on(event: "addInterval" | "deleteInterval", listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this; | ||
| add(start: number, end: number, intervalType: MergeTree.IntervalType, props?: MergeTree.PropertySet): TInterval; | ||
| delete(start: number, end: number): void; | ||
| addInternal(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage): TInterval; | ||
| deleteInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage): this; | ||
| serializeInternal(): any[]; | ||
| private attachDeserializerCore; | ||
| } | ||
| export declare class IntervalCollectionIterator<TInterval extends ISerializableInterval> { | ||
@@ -136,3 +120,3 @@ private readonly results; | ||
| } | ||
| export declare class IntervalCollection<TInterval extends ISerializableInterval> { | ||
| export declare class IntervalCollection<TInterval extends ISerializableInterval> extends EventEmitter { | ||
| private readonly helpers; | ||
@@ -142,10 +126,17 @@ private readonly requiresClient; | ||
| private savedSerializedIntervals?; | ||
| private view; | ||
| private localCollection; | ||
| private onDeserialize; | ||
| private client; | ||
| get attached(): boolean; | ||
| constructor(helpers: IIntervalHelpers<TInterval>, requiresClient: boolean, emitter: IValueOpEmitter, serializedIntervals: ISerializedInterval[]); | ||
| attachGraph(client: MergeTree.Client, label: string): void; | ||
| add(startPosition: number, endPosition: number, intervalType: MergeTree.IntervalType, props?: MergeTree.PropertySet): TInterval; | ||
| delete(startPosition: number, endPosition: number): void; | ||
| add(start: number, end: number, intervalType: MergeTree.IntervalType, props?: MergeTree.PropertySet): TInterval; | ||
| delete(start: number, end: number): void; | ||
| addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void; | ||
| getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollectionView<TInterval>>; | ||
| attachDeserializer(onDeserialize: DeserializeCallback): void; | ||
| private attachDeserializerCore; | ||
| /** | ||
| * @deprecated - IntervalCollectionView has been removed. Please refer to IntervalCollection directly. | ||
| */ | ||
| getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollection<TInterval>>; | ||
| addInternal(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage): TInterval; | ||
@@ -160,3 +151,8 @@ deleteInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage): void; | ||
| gatherIterationResults(results: TInterval[], iteratesForward: boolean, start?: number, end?: number): void; | ||
| findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[]; | ||
| map(fn: (interval: TInterval) => void): void; | ||
| previousInterval(pos: number): TInterval; | ||
| nextInterval(pos: number): TInterval; | ||
| on(event: "addInterval" | "deleteInterval", listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this; | ||
| } | ||
| //# sourceMappingURL=intervalCollection.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"intervalCollection.d.ts","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"intervalCollection.d.ts","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"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"} |
+140
-132
@@ -26,6 +26,8 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.IntervalCollection = exports.IntervalCollectionIterator = exports.IntervalCollectionView = exports.IntervalCollectionValueType = exports.SequenceIntervalCollectionValueType = exports.LocalIntervalCollection = exports.createIntervalIndex = exports.defaultIntervalConflictResolver = exports.SequenceInterval = exports.Interval = void 0; | ||
| exports.IntervalCollection = exports.IntervalCollectionIterator = exports.IntervalCollectionValueType = exports.SequenceIntervalCollectionValueType = exports.LocalIntervalCollection = exports.createIntervalIndex = exports.defaultIntervalConflictResolver = exports.SequenceInterval = exports.Interval = exports.reservedIntervalIdKey = void 0; | ||
| /* eslint-disable no-bitwise */ | ||
| const events_1 = require("events"); | ||
| const MergeTree = __importStar(require("@fluidframework/merge-tree")); | ||
| const uuid_1 = require("uuid"); | ||
| exports.reservedIntervalIdKey = "intervalId"; | ||
| class Interval { | ||
@@ -39,2 +41,6 @@ constructor(start, end, props) { | ||
| } | ||
| getIntervalId() { | ||
| var _a, _b; | ||
| return (_b = (_a = this.properties) === null || _a === void 0 ? void 0 : _a[exports.reservedIntervalIdKey]) === null || _b === void 0 ? void 0 : _b.toString(); | ||
| } | ||
| getAdditionalPropertySets() { | ||
@@ -148,2 +154,6 @@ return this.auxProps; | ||
| } | ||
| getIntervalId() { | ||
| var _a, _b; | ||
| return (_b = (_a = this.properties) === null || _a === void 0 ? void 0 : _a[exports.reservedIntervalIdKey]) === null || _b === void 0 ? void 0 : _b.toString(); | ||
| } | ||
| union(b) { | ||
@@ -264,2 +274,17 @@ return new SequenceInterval(this.start.min(b.start), this.end.max(b.end), this.intervalType); | ||
| } | ||
| createLegacyId(start, end) { | ||
| // Create a non-unique ID based on start and end to be used on intervals that come from legacy clients | ||
| // without ID's. | ||
| return `${start}-${end}`; | ||
| } | ||
| ensureSerializedId(serializedInterval) { | ||
| var _a; | ||
| if (((_a = serializedInterval.properties) === null || _a === void 0 ? void 0 : _a[exports.reservedIntervalIdKey]) === undefined) { | ||
| // An interval came over the wire without an ID, so create a non-unique one based on start/end. | ||
| // This will allow all clients to refer to this interval consistently. | ||
| serializedInterval.properties = MergeTree.addProperties(serializedInterval.properties, { | ||
| [exports.reservedIntervalIdKey]: this.createLegacyId(serializedInterval.start, serializedInterval.end), | ||
| }); | ||
| } | ||
| } | ||
| gatherIterationResults(results, iteratesForward, start, end) { | ||
@@ -367,2 +392,5 @@ if (this.intervalTree.intervals.isEmpty()) { | ||
| } | ||
| if (interval.properties[exports.reservedIntervalIdKey] === undefined) { | ||
| interval.properties[exports.reservedIntervalIdKey] = uuid_1.v4(); | ||
| } | ||
| this.intervalTree.put(interval, this.conflictResolver); | ||
@@ -494,40 +522,56 @@ this.endIntervalTree.put(interval, interval, this.endConflictResolver); | ||
| ]]); | ||
| class IntervalCollectionView extends events_1.EventEmitter { | ||
| constructor(client, savedSerializedIntervals, label, helpers, emitter) { | ||
| class IntervalCollectionIterator { | ||
| constructor(collection, iteratesForward = true, start, end) { | ||
| this.results = []; | ||
| this.index = 0; | ||
| collection.gatherIterationResults(this.results, iteratesForward, start, end); | ||
| } | ||
| next() { | ||
| let _value; | ||
| let _done = true; | ||
| if (this.index < this.results.length) { | ||
| _value = this.results[this.index++]; | ||
| _done = false; | ||
| } | ||
| return { | ||
| value: _value, | ||
| done: _done, | ||
| }; | ||
| } | ||
| } | ||
| exports.IntervalCollectionIterator = IntervalCollectionIterator; | ||
| class IntervalCollection extends events_1.EventEmitter { | ||
| constructor(helpers, requiresClient, emitter, serializedIntervals) { | ||
| super(); | ||
| this.client = client; | ||
| this.helpers = helpers; | ||
| this.requiresClient = requiresClient; | ||
| this.emitter = emitter; | ||
| this.savedSerializedIntervals = serializedIntervals; | ||
| } | ||
| get attached() { | ||
| // return !!this.view; | ||
| return !!this.localCollection; | ||
| } | ||
| attachGraph(client, label) { | ||
| if (this.attached) { | ||
| throw new Error("Only supports one Sequence attach"); | ||
| } | ||
| if ((client === undefined) && (this.requiresClient)) { | ||
| throw new Error("Client required for this collection"); | ||
| } | ||
| // Instantiate the local interval collection based on the saved intervals | ||
| this.localCollection = new LocalIntervalCollection(client, label, helpers); | ||
| if (savedSerializedIntervals) { | ||
| for (const serializedInterval of savedSerializedIntervals) { | ||
| this.client = client; | ||
| this.localCollection = new LocalIntervalCollection(client, label, this.helpers); | ||
| if (this.savedSerializedIntervals) { | ||
| for (const serializedInterval of this.savedSerializedIntervals) { | ||
| this.localCollection.ensureSerializedId(serializedInterval); | ||
| this.localCollection.addInterval(serializedInterval.start, serializedInterval.end, serializedInterval.intervalType, serializedInterval.properties); | ||
| } | ||
| } | ||
| this.savedSerializedIntervals = undefined; | ||
| } | ||
| attachDeserializer(onDeserialize) { | ||
| this.attachDeserializerCore(onDeserialize); | ||
| } | ||
| addConflictResolver(conflictResolver) { | ||
| this.localCollection.addConflictResolver(conflictResolver); | ||
| } | ||
| findOverlappingIntervals(startPosition, endPosition) { | ||
| return this.localCollection.findOverlappingIntervals(startPosition, endPosition); | ||
| } | ||
| map(fn) { | ||
| this.localCollection.map(fn); | ||
| } | ||
| gatherIterationResults(results, iteratesForward, start, end) { | ||
| this.localCollection.gatherIterationResults(results, iteratesForward, start, end); | ||
| } | ||
| previousInterval(pos) { | ||
| return this.localCollection.previousInterval(pos); | ||
| } | ||
| nextInterval(pos) { | ||
| return this.localCollection.nextInterval(pos); | ||
| } | ||
| on(event, listener) { | ||
| return super.on(event, listener); | ||
| } | ||
| add(start, end, intervalType, props) { | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to adding intervals"); | ||
| } | ||
| let seq = 0; | ||
@@ -548,2 +592,5 @@ if (this.client) { | ||
| let sequenceNumber = 0; | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| if (this.client) { | ||
@@ -560,4 +607,43 @@ sequenceNumber = this.client.getCurrentSeq(); | ||
| } | ||
| // TODO: error cases | ||
| addConflictResolver(conflictResolver) { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| this.localCollection.addConflictResolver(conflictResolver); | ||
| } | ||
| attachDeserializer(onDeserialize) { | ||
| this.attachDeserializerCore(onDeserialize); | ||
| } | ||
| attachDeserializerCore(onDeserialize) { | ||
| // If no deserializer is specified can skip all processing work | ||
| if (!onDeserialize) { | ||
| return; | ||
| } | ||
| // Start by storing the callbacks so that any subsequent modifications make use of them | ||
| this.onDeserialize = onDeserialize; | ||
| // Trigger the async prepare work across all values in the collection | ||
| this.localCollection.map((interval) => { | ||
| this.onDeserialize(interval); | ||
| }); | ||
| } | ||
| /** | ||
| * @deprecated - IntervalCollectionView has been removed. Please refer to IntervalCollection directly. | ||
| */ | ||
| async getView(onDeserialize) { | ||
| if (!this.attached) { | ||
| return Promise.reject(new Error("attachSequence must be called prior to retrieving the view")); | ||
| } | ||
| // Attach custom deserializers if specified | ||
| if (onDeserialize) { | ||
| this.attachDeserializer(onDeserialize); | ||
| } | ||
| return this; | ||
| } | ||
| addInternal(serializedInterval, local, op) { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| if (!local) { | ||
| this.localCollection.ensureSerializedId(serializedInterval); | ||
| } | ||
| const interval = this.localCollection.addInterval(serializedInterval.start, serializedInterval.end, serializedInterval.intervalType, serializedInterval.properties); | ||
@@ -579,2 +665,5 @@ if (interval) { | ||
| deleteInterval(serializedInterval, local, op) { | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| const interval = this.localCollection.removeInterval(serializedInterval.start, serializedInterval.end); | ||
@@ -593,105 +682,9 @@ if (interval) { | ||
| this.emit("deleteInterval", interval, local, op); | ||
| return this; | ||
| } | ||
| serializeInternal() { | ||
| // eslint-disable-next-line @typescript-eslint/no-unsafe-return | ||
| return this.localCollection.serialize(); | ||
| } | ||
| attachDeserializerCore(onDeserialize) { | ||
| // If no deserializer is specified can skip all processing work | ||
| if (!onDeserialize) { | ||
| return; | ||
| } | ||
| // Start by storing the callbacks so that any subsequent modifications make use of them | ||
| this.onDeserialize = onDeserialize; | ||
| // Trigger the async prepare work across all values in the collection | ||
| this.localCollection.map((interval) => { | ||
| this.onDeserialize(interval); | ||
| }); | ||
| } | ||
| } | ||
| exports.IntervalCollectionView = IntervalCollectionView; | ||
| class IntervalCollectionIterator { | ||
| constructor(collection, iteratesForward = true, start, end) { | ||
| this.results = []; | ||
| this.index = 0; | ||
| collection.gatherIterationResults(this.results, iteratesForward, start, end); | ||
| } | ||
| next() { | ||
| let _value; | ||
| let _done = true; | ||
| if (this.index < this.results.length) { | ||
| _value = this.results[this.index++]; | ||
| _done = false; | ||
| } | ||
| return { | ||
| value: _value, | ||
| done: _done, | ||
| }; | ||
| } | ||
| } | ||
| exports.IntervalCollectionIterator = IntervalCollectionIterator; | ||
| class IntervalCollection { | ||
| constructor(helpers, requiresClient, emitter, serializedIntervals) { | ||
| this.helpers = helpers; | ||
| this.requiresClient = requiresClient; | ||
| this.emitter = emitter; | ||
| this.savedSerializedIntervals = serializedIntervals; | ||
| } | ||
| get attached() { | ||
| return !!this.view; | ||
| } | ||
| attachGraph(client, label) { | ||
| if (this.view) { | ||
| throw new Error("Only supports one Sequence attach"); | ||
| } | ||
| if ((client === undefined) && (this.requiresClient)) { | ||
| throw new Error("Client required for this collection"); | ||
| } | ||
| this.view = new IntervalCollectionView(client, this.savedSerializedIntervals, label, this.helpers, this.emitter); | ||
| this.savedSerializedIntervals = undefined; | ||
| } | ||
| add(startPosition, endPosition, intervalType, props) { | ||
| if (!this.view) { | ||
| throw new Error("attach must be called prior to adding intervals"); | ||
| } | ||
| return this.view.add(startPosition, endPosition, intervalType, props); | ||
| } | ||
| delete(startPosition, endPosition) { | ||
| if (!this.view) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| this.view.delete(startPosition, endPosition); | ||
| } | ||
| addConflictResolver(conflictResolver) { | ||
| this.view.addConflictResolver(conflictResolver); | ||
| } | ||
| async getView(onDeserialize) { | ||
| if (!this.view) { | ||
| return Promise.reject(new Error("attachSequence must be called prior to retrieving the view")); | ||
| } | ||
| // Attach custom deserializers if specified | ||
| if (onDeserialize) { | ||
| this.view.attachDeserializer(onDeserialize); | ||
| } | ||
| return this.view; | ||
| } | ||
| addInternal(serializedInterval, local, op) { | ||
| if (!this.view) { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| return this.view.addInternal(serializedInterval, local, op); | ||
| } | ||
| deleteInterval(serializedInterval, local, op) { | ||
| if (!this.view) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| this.view.deleteInterval(serializedInterval, local, op); | ||
| } | ||
| serializeInternal() { | ||
| if (!this.view) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| // eslint-disable-next-line @typescript-eslint/no-unsafe-return | ||
| return this.view.serializeInternal(); | ||
| return this.localCollection.serialize(); | ||
| } | ||
@@ -719,9 +712,24 @@ [Symbol.iterator]() { | ||
| gatherIterationResults(results, iteratesForward, start, end) { | ||
| if (!this.view) { | ||
| if (!this.attached) { | ||
| return; | ||
| } | ||
| this.view.gatherIterationResults(results, iteratesForward, start, end); | ||
| this.localCollection.gatherIterationResults(results, iteratesForward, start, end); | ||
| } | ||
| findOverlappingIntervals(startPosition, endPosition) { | ||
| return this.localCollection.findOverlappingIntervals(startPosition, endPosition); | ||
| } | ||
| map(fn) { | ||
| this.localCollection.map(fn); | ||
| } | ||
| previousInterval(pos) { | ||
| return this.localCollection.previousInterval(pos); | ||
| } | ||
| nextInterval(pos) { | ||
| return this.localCollection.nextInterval(pos); | ||
| } | ||
| on(event, listener) { | ||
| return super.on(event, listener); | ||
| } | ||
| } | ||
| exports.IntervalCollection = IntervalCollection; | ||
| //# sourceMappingURL=intervalCollection.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"intervalCollection.js","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable no-bitwise */\n\nimport { EventEmitter } from \"events\";\nimport * as MergeTree from \"@fluidframework/merge-tree\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\n\nimport { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from \"./mapKernelInterfaces\";\n\nexport interface ISerializedInterval {\n sequenceNumber: number;\n start: number;\n end: number;\n intervalType: MergeTree.IntervalType;\n properties?: MergeTree.PropertySet;\n}\n\nexport interface ISerializableInterval extends MergeTree.IInterval {\n properties: MergeTree.PropertySet;\n serialize(client: MergeTree.Client);\n addProperties(props: MergeTree.PropertySet);\n}\n\nexport interface IIntervalHelpers<TInterval extends ISerializableInterval> {\n compareEnds(a: TInterval, b: TInterval): number;\n create(label: string, start: number, end: number,\n client: MergeTree.Client, intervalType?: MergeTree.IntervalType): TInterval;\n}\n\nexport class Interval implements ISerializableInterval {\n public properties: MergeTree.PropertySet;\n public auxProps: MergeTree.PropertySet[];\n constructor(\n public start: number,\n public end: number,\n props?: MergeTree.PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public getAdditionalPropertySets() {\n return this.auxProps;\n }\n\n public addPropertySet(props: MergeTree.PropertySet) {\n if (this.auxProps === undefined) {\n this.auxProps = [];\n }\n this.auxProps.push(props);\n }\n\n public serialize(client: MergeTree.Client) {\n let seq = 0;\n if (client) {\n seq = client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end: this.end,\n intervalType: 0,\n sequenceNumber: seq,\n start: this.start,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new Interval(this.start, this.end, this.properties);\n }\n\n public compare(b: Interval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n return this.compareEnd(b);\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: Interval) {\n return this.start - b.start;\n }\n\n public compareEnd(b: Interval) {\n return this.end - b.end;\n }\n\n public overlaps(b: Interval) {\n const result = (this.start < b.end) &&\n (this.end >= b.start);\n return result;\n }\n\n public union(b: Interval) {\n return new Interval(Math.min(this.start, b.start),\n Math.max(this.end, b.end), this.properties);\n }\n\n public getProperties() {\n return this.properties;\n }\n\n public addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp) {\n this.properties = MergeTree.addProperties(this.properties, newProps, op);\n }\n}\n\nexport class SequenceInterval implements ISerializableInterval {\n public properties: MergeTree.PropertySet;\n private readonly checkMergeTree: MergeTree.MergeTree;\n\n constructor(\n public start: MergeTree.LocalReference,\n public end: MergeTree.LocalReference,\n public intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public serialize(client: MergeTree.Client) {\n const startPosition = this.start.toPosition();\n const endPosition = this.end.toPosition();\n const serializedInterval: ISerializedInterval = {\n end: endPosition,\n intervalType: this.intervalType,\n sequenceNumber: client.getCurrentSeq(),\n start: startPosition,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new SequenceInterval(this.start, this.end, this.intervalType);\n }\n\n public compare(b: SequenceInterval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n return this.compareEnd(b);\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: SequenceInterval) {\n return this.start.compare(b.start);\n }\n\n public compareEnd(b: SequenceInterval) {\n return this.end.compare(b.end);\n }\n\n public overlaps(b: SequenceInterval) {\n const result = (this.start.compare(b.end) < 0) &&\n (this.end.compare(b.start) >= 0);\n if (this.checkMergeTree) {\n this.checkOverlaps(b, result);\n }\n return result;\n }\n\n public union(b: SequenceInterval) {\n return new SequenceInterval(this.start.min(b.start),\n this.end.max(b.end), this.intervalType);\n }\n\n public addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp) {\n this.properties = MergeTree.addProperties(this.properties, newProps, op);\n }\n\n public overlapsPos(bstart: number, bend: number) {\n const startPos = this.start.toPosition();\n const endPos = this.start.toPosition();\n return (endPos > bstart) && (startPos < bend);\n }\n\n private checkOverlaps(b: SequenceInterval, result: boolean) {\n const astart = this.start.toPosition();\n const bstart = b.start.toPosition();\n const aend = this.end.toPosition();\n const bend = b.end.toPosition();\n const checkResult = ((astart < bend) && (bstart < aend));\n if (checkResult !== result) {\n // eslint-disable-next-line max-len\n console.log(`check mismatch: res ${result} ${this.start.segment === b.end.segment} ${b.start.segment === this.end.segment}`);\n console.log(`as ${astart} ae ${aend} bs ${bstart} be ${bend}`);\n console.log(`as ${MergeTree.ordinalToArray(this.start.segment.ordinal)}@${this.start.offset}`);\n console.log(`ae ${MergeTree.ordinalToArray(this.end.segment.ordinal)}@${this.end.offset}`);\n console.log(`bs ${MergeTree.ordinalToArray(b.start.segment.ordinal)}@${b.start.offset}`);\n console.log(`be ${MergeTree.ordinalToArray(b.end.segment.ordinal)}@${b.end.offset}`);\n console.log(this.checkMergeTree.nodeToString(b.start.segment.parent, \"\"));\n }\n }\n}\n\nfunction createPositionReference(\n client: MergeTree.Client,\n pos: number,\n refType: MergeTree.ReferenceType): MergeTree.LocalReference {\n const segoff = client.getContainingSegment(pos);\n if (segoff && segoff.segment) {\n const lref = new MergeTree.LocalReference(client, segoff.segment, segoff.offset, refType);\n if (refType !== MergeTree.ReferenceType.Transient) {\n client.addLocalReference(lref);\n }\n return lref;\n }\n return new MergeTree.LocalReference(client, undefined);\n}\n\nfunction createSequenceInterval(\n label: string,\n start: number,\n end: number,\n client: MergeTree.Client,\n intervalType: MergeTree.IntervalType): SequenceInterval {\n let beginRefType = MergeTree.ReferenceType.RangeBegin;\n let endRefType = MergeTree.ReferenceType.RangeEnd;\n if (intervalType === MergeTree.IntervalType.Nest) {\n beginRefType = MergeTree.ReferenceType.NestBegin;\n endRefType = MergeTree.ReferenceType.NestEnd;\n } else if (intervalType === MergeTree.IntervalType.Transient) {\n beginRefType = MergeTree.ReferenceType.Transient;\n endRefType = MergeTree.ReferenceType.Transient;\n }\n\n // TODO: Should SlideOnRemove be the default behavior?\n if (intervalType & MergeTree.IntervalType.SlideOnRemove) {\n beginRefType |= MergeTree.ReferenceType.SlideOnRemove;\n endRefType |= MergeTree.ReferenceType.SlideOnRemove;\n }\n\n const startLref = createPositionReference(client, start, beginRefType);\n const endLref = createPositionReference(client, end, endRefType);\n if (startLref && endLref) {\n startLref.pairedRef = endLref;\n endLref.pairedRef = startLref;\n const rangeProp = {\n [MergeTree.reservedRangeLabelsKey]: [label],\n };\n startLref.addProperties(rangeProp);\n endLref.addProperties(rangeProp);\n\n const ival = new SequenceInterval(startLref, endLref, intervalType, rangeProp);\n return ival;\n }\n}\n\nexport function defaultIntervalConflictResolver(a: Interval, b: Interval) {\n a.addPropertySet(b.properties);\n return a;\n}\n\nexport function createIntervalIndex(conflict?: MergeTree.IntervalConflictResolver<Interval>) {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const lc = new LocalIntervalCollection<Interval>(undefined, \"\", helpers);\n if (conflict) {\n lc.addConflictResolver(conflict);\n } else {\n lc.addConflictResolver(defaultIntervalConflictResolver);\n }\n return lc;\n}\n\nexport class LocalIntervalCollection<TInterval extends ISerializableInterval> {\n private readonly intervalTree = new MergeTree.IntervalTree<TInterval>();\n private readonly endIntervalTree: MergeTree.RedBlackTree<TInterval, TInterval>;\n private conflictResolver: MergeTree.IntervalConflictResolver<TInterval>;\n private endConflictResolver: MergeTree.ConflictAction<TInterval, TInterval>;\n\n constructor(\n private readonly client: MergeTree.Client,\n private readonly label: string,\n private readonly helpers: IIntervalHelpers<TInterval>) {\n this.endIntervalTree =\n // eslint-disable-next-line @typescript-eslint/unbound-method\n new MergeTree.RedBlackTree<TInterval, TInterval>(helpers.compareEnds);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>) {\n this.conflictResolver = conflictResolver;\n this.endConflictResolver =\n (key: TInterval, currentKey: TInterval) => {\n const ival = this.conflictResolver(key, currentKey);\n return {\n data: ival,\n key: ival,\n };\n };\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.intervalTree.map(fn);\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (this.intervalTree.intervals.isEmpty()) {\n return;\n }\n\n if (start === undefined && end === undefined) {\n // No start/end provided. Gather the whole tree in the specified order.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n results.push(interval);\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n results.push(interval);\n });\n }\n }\n else {\n const transientInterval: TInterval = this.helpers.create(\n \"transient\",\n start,\n end,\n this.client,\n MergeTree.IntervalType.Transient,\n );\n\n if (start === undefined) {\n // Only end position provided. Since the tree is not sorted by end position,\n // walk the whole tree in the specified order, gathering intervals that match the end.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n }\n else {\n // Start and (possibly) end provided. Walk the subtrees that may contain\n // this start position.\n const compareFn =\n end === undefined ?\n (node: MergeTree.IntervalNode<TInterval>) => {\n return transientInterval.compareStart(node.key);\n } :\n (node: MergeTree.IntervalNode<TInterval>) => {\n return transientInterval.compare(node.key);\n };\n const continueLeftFn = (cmpResult: number) => cmpResult <= 0;\n const continueRightFn = (cmpResult: number) => cmpResult >= 0;\n const actionFn = (node: MergeTree.IntervalNode<TInterval>) => {\n results.push(node.key);\n };\n\n if (iteratesForward) {\n this.intervalTree.intervals.walkExactMatchesForward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n else {\n this.intervalTree.intervals.walkExactMatchesBackward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n }\n }\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number) {\n if (!this.intervalTree.intervals.isEmpty()) {\n const transientInterval =\n this.helpers.create(\n \"transient\",\n startPosition,\n endPosition,\n this.client,\n MergeTree.IntervalType.Transient);\n\n const overlappingIntervalNodes = this.intervalTree.match(transientInterval);\n return overlappingIntervalNodes.map((node) => node.key);\n } else {\n return [];\n }\n }\n\n public previousInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, MergeTree.IntervalType.Transient);\n const rbNode = this.endIntervalTree.floor(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public nextInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, MergeTree.IntervalType.Transient);\n const rbNode = this.endIntervalTree.ceil(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public removeInterval(startPosition: number, endPosition: number) {\n const transientInterval = this.helpers.create(\n \"transient\", startPosition, endPosition, this.client, MergeTree.IntervalType.Transient);\n this.intervalTree.remove(transientInterval);\n this.endIntervalTree.remove(transientInterval);\n return transientInterval;\n }\n\n public createInterval(start: number, end: number, intervalType: MergeTree.IntervalType) {\n return this.helpers.create(this.label, start, end, this.client, intervalType);\n }\n\n // TODO: remove interval, handle duplicate intervals\n public addInterval(\n start: number,\n end: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet) {\n const interval = this.createInterval(start, end, intervalType);\n if (interval) {\n interval.addProperties(props);\n if (this.label && (this.label.length > 0)) {\n interval.properties[MergeTree.reservedRangeLabelsKey] = [this.label];\n }\n this.intervalTree.put(interval, this.conflictResolver);\n this.endIntervalTree.put(interval, interval, this.endConflictResolver);\n }\n return interval;\n }\n\n public serialize() {\n const client = this.client;\n const intervals = this.intervalTree.intervals.keys();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return intervals.map((interval) => interval.serialize(client));\n }\n}\n\nconst compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInterval): number => a.end.compare(b.end);\n\nclass SequenceIntervalCollectionFactory\n implements IValueFactory<IntervalCollection<SequenceInterval>> {\n public load(\n emitter: IValueOpEmitter,\n raw: ISerializedInterval[] = [],\n ): IntervalCollection<SequenceInterval> {\n const helpers: IIntervalHelpers<SequenceInterval> = {\n compareEnds: compareSequenceIntervalEnds,\n create: createSequenceInterval,\n };\n return new IntervalCollection<SequenceInterval>(helpers, true, emitter, raw);\n }\n\n public store(value: IntervalCollection<SequenceInterval>): ISerializedInterval[] {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value.serializeInternal();\n }\n}\n\nexport class SequenceIntervalCollectionValueType\n implements IValueType<IntervalCollection<SequenceInterval>> {\n public static Name = \"sharedStringIntervalCollection\";\n\n public get name(): string {\n return SequenceIntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<SequenceInterval>> {\n return SequenceIntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> {\n return SequenceIntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<SequenceInterval>> =\n new SequenceIntervalCollectionFactory();\n\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> =\n new Map<string, IValueOperation<IntervalCollection<SequenceInterval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ]]);\n}\n\nconst compareIntervalEnds = (a: Interval, b: Interval) => a.end - b.end;\n\nfunction createInterval(label: string, start: number, end: number, client: MergeTree.Client): Interval {\n let rangeProp: MergeTree.PropertySet;\n if (label && (label.length > 0)) {\n rangeProp = {\n [MergeTree.reservedRangeLabelsKey]: [label],\n };\n }\n return new Interval(start, end, rangeProp);\n}\n\nclass IntervalCollectionFactory\n implements IValueFactory<IntervalCollection<Interval>> {\n public load(emitter: IValueOpEmitter, raw: ISerializedInterval[] = []): IntervalCollection<Interval> {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const collection = new IntervalCollection<Interval>(helpers, false, emitter, raw);\n collection.attachGraph(undefined, \"\");\n return collection;\n }\n\n public store(value: IntervalCollection<Interval>): ISerializedInterval[] {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value.serializeInternal();\n }\n}\n\nexport class IntervalCollectionValueType\n implements IValueType<IntervalCollection<Interval>> {\n public static Name = \"sharedIntervalCollection\";\n\n public get name(): string {\n return IntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<Interval>> {\n return IntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<Interval>>> {\n return IntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<Interval>> =\n new IntervalCollectionFactory();\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<Interval>>> =\n new Map<string, IValueOperation<IntervalCollection<Interval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ]]);\n}\n\nexport type DeserializeCallback = (properties: MergeTree.PropertySet) => void;\n\nexport class IntervalCollectionView<TInterval extends ISerializableInterval> extends EventEmitter {\n private readonly localCollection: LocalIntervalCollection<TInterval>;\n private onDeserialize: DeserializeCallback;\n\n constructor(\n private readonly client: MergeTree.Client,\n savedSerializedIntervals: ISerializedInterval[],\n label: string,\n helpers: IIntervalHelpers<TInterval>,\n private readonly emitter: IValueOpEmitter) {\n super();\n\n // Instantiate the local interval collection based on the saved intervals\n this.localCollection = new LocalIntervalCollection<TInterval>(client, label, helpers);\n if (savedSerializedIntervals) {\n for (const serializedInterval of savedSerializedIntervals) {\n this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n }\n }\n }\n\n public attachDeserializer(onDeserialize: DeserializeCallback): void {\n this.attachDeserializerCore(onDeserialize);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void {\n this.localCollection.addConflictResolver(conflictResolver);\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[] {\n return this.localCollection.findOverlappingIntervals(startPosition, endPosition);\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.localCollection.map(fn);\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n this.localCollection.gatherIterationResults(results, iteratesForward, start, end);\n }\n\n public previousInterval(pos: number): TInterval {\n return this.localCollection.previousInterval(pos);\n }\n\n public nextInterval(pos: number): TInterval {\n return this.localCollection.nextInterval(pos);\n }\n\n public on(\n event: \"addInterval\" | \"deleteInterval\",\n listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this {\n return super.on(event, listener);\n }\n\n public add(\n start: number,\n end: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet,\n ) {\n let seq = 0;\n if (this.client) {\n seq = this.client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end,\n intervalType,\n properties: props,\n sequenceNumber: seq,\n start,\n };\n\n return this.addInternal(serializedInterval, true, undefined);\n }\n\n public delete(\n start: number,\n end: number) {\n let sequenceNumber = 0;\n if (this.client) {\n sequenceNumber = this.client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n start,\n end,\n sequenceNumber,\n intervalType: MergeTree.IntervalType.Transient,\n };\n\n this.deleteInterval(serializedInterval, true, undefined);\n }\n\n // TODO: error cases\n public addInternal(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) {\n const interval = this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"add\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"addInterval\", interval, local, op);\n\n return interval;\n }\n\n public deleteInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) {\n const interval = this.localCollection.removeInterval(serializedInterval.start, serializedInterval.end);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"delete\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"deleteInterval\", interval, local, op);\n\n return this;\n }\n\n public serializeInternal() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.localCollection.serialize();\n }\n\n private attachDeserializerCore(onDeserialize?: DeserializeCallback): void {\n // If no deserializer is specified can skip all processing work\n if (!onDeserialize) {\n return;\n }\n\n // Start by storing the callbacks so that any subsequent modifications make use of them\n this.onDeserialize = onDeserialize;\n\n // Trigger the async prepare work across all values in the collection\n this.localCollection.map((interval) => {\n this.onDeserialize(interval);\n });\n }\n}\n\nexport class IntervalCollectionIterator<TInterval extends ISerializableInterval> {\n private readonly results: TInterval[];\n private index: number;\n\n constructor(\n collection: IntervalCollection<TInterval>,\n iteratesForward: boolean = true,\n start?: number,\n end?: number) {\n this.results = [];\n this.index = 0;\n\n collection.gatherIterationResults(this.results, iteratesForward, start, end);\n }\n\n public next() {\n let _value: TInterval | undefined;\n let _done: boolean = true;\n\n if (this.index < this.results.length) {\n _value = this.results[this.index++];\n _done = false;\n }\n\n return {\n value: _value,\n done: _done,\n };\n }\n}\n\nexport class IntervalCollection<TInterval extends ISerializableInterval> {\n private savedSerializedIntervals?: ISerializedInterval[];\n private view: IntervalCollectionView<TInterval>;\n\n public get attached(): boolean {\n return !!this.view;\n }\n\n constructor(private readonly helpers: IIntervalHelpers<TInterval>, private readonly requiresClient: boolean,\n private readonly emitter: IValueOpEmitter,\n serializedIntervals: ISerializedInterval[]) {\n this.savedSerializedIntervals = serializedIntervals;\n }\n\n public attachGraph(client: MergeTree.Client, label: string) {\n if (this.view) {\n throw new Error(\"Only supports one Sequence attach\");\n }\n\n if ((client === undefined) && (this.requiresClient)) {\n throw new Error(\"Client required for this collection\");\n }\n\n this.view = new IntervalCollectionView<TInterval>(client,\n this.savedSerializedIntervals, label, this.helpers, this.emitter);\n this.savedSerializedIntervals = undefined;\n }\n\n public add(\n startPosition: number,\n endPosition: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet,\n ) {\n if (!this.view) {\n throw new Error(\"attach must be called prior to adding intervals\");\n }\n\n return this.view.add(startPosition, endPosition, intervalType, props);\n }\n\n public delete(\n startPosition: number,\n endPosition: number,\n ) {\n if (!this.view) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n\n this.view.delete(startPosition, endPosition);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void {\n this.view.addConflictResolver(conflictResolver);\n }\n\n public async getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollectionView<TInterval>> {\n if (!this.view) {\n return Promise.reject(new Error(\"attachSequence must be called prior to retrieving the view\"));\n }\n\n // Attach custom deserializers if specified\n if (onDeserialize) {\n this.view.attachDeserializer(onDeserialize);\n }\n\n return this.view;\n }\n\n public addInternal(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage) {\n if (!this.view) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.view.addInternal(serializedInterval, local, op);\n }\n\n public deleteInterval(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage): void {\n if (!this.view) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n this.view.deleteInterval(serializedInterval, local, op);\n }\n\n public serializeInternal() {\n if (!this.view) {\n throw new Error(\"attachSequence must be called\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.view.serializeInternal();\n }\n\n public [Symbol.iterator](): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this);\n return iterator;\n }\n\n public CreateForwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, startPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, startPosition);\n return iterator;\n }\n\n public CreateForwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, undefined, endPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, undefined, endPosition);\n return iterator;\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (!this.view) {\n return;\n }\n\n this.view.gatherIterationResults(results, iteratesForward, start, end);\n }\n}\n"]} | ||
| {"version":3,"file":"intervalCollection.js","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable no-bitwise */\n\nimport { EventEmitter } from \"events\";\nimport * as MergeTree from \"@fluidframework/merge-tree\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from \"./mapKernelInterfaces\";\n\nexport const reservedIntervalIdKey = \"intervalId\";\n\nexport interface ISerializedInterval {\n sequenceNumber: number;\n start: number;\n end: number;\n intervalType: MergeTree.IntervalType;\n properties?: MergeTree.PropertySet;\n}\n\nexport interface ISerializableInterval extends MergeTree.IInterval {\n properties: MergeTree.PropertySet;\n serialize(client: MergeTree.Client);\n addProperties(props: MergeTree.PropertySet);\n}\n\nexport interface IIntervalHelpers<TInterval extends ISerializableInterval> {\n compareEnds(a: TInterval, b: TInterval): number;\n create(label: string, start: number, end: number,\n client: MergeTree.Client, intervalType?: MergeTree.IntervalType): TInterval;\n}\n\nexport class Interval implements ISerializableInterval {\n public properties: MergeTree.PropertySet;\n public auxProps: MergeTree.PropertySet[];\n constructor(\n public start: number,\n public end: number,\n props?: MergeTree.PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public getIntervalId(): string | undefined {\n return this.properties?.[reservedIntervalIdKey]?.toString() as string | undefined;\n }\n\n public getAdditionalPropertySets() {\n return this.auxProps;\n }\n\n public addPropertySet(props: MergeTree.PropertySet) {\n if (this.auxProps === undefined) {\n this.auxProps = [];\n }\n this.auxProps.push(props);\n }\n\n public serialize(client: MergeTree.Client) {\n let seq = 0;\n if (client) {\n seq = client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end: this.end,\n intervalType: 0,\n sequenceNumber: seq,\n start: this.start,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new Interval(this.start, this.end, this.properties);\n }\n\n public compare(b: Interval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n return this.compareEnd(b);\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: Interval) {\n return this.start - b.start;\n }\n\n public compareEnd(b: Interval) {\n return this.end - b.end;\n }\n\n public overlaps(b: Interval) {\n const result = (this.start < b.end) &&\n (this.end >= b.start);\n return result;\n }\n\n public union(b: Interval) {\n return new Interval(Math.min(this.start, b.start),\n Math.max(this.end, b.end), this.properties);\n }\n\n public getProperties() {\n return this.properties;\n }\n\n public addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp) {\n this.properties = MergeTree.addProperties(this.properties, newProps, op);\n }\n}\n\nexport class SequenceInterval implements ISerializableInterval {\n public properties: MergeTree.PropertySet;\n private readonly checkMergeTree: MergeTree.MergeTree;\n\n constructor(\n public start: MergeTree.LocalReference,\n public end: MergeTree.LocalReference,\n public intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public serialize(client: MergeTree.Client) {\n const startPosition = this.start.toPosition();\n const endPosition = this.end.toPosition();\n const serializedInterval: ISerializedInterval = {\n end: endPosition,\n intervalType: this.intervalType,\n sequenceNumber: client.getCurrentSeq(),\n start: startPosition,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new SequenceInterval(this.start, this.end, this.intervalType);\n }\n\n public compare(b: SequenceInterval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n return this.compareEnd(b);\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: SequenceInterval) {\n return this.start.compare(b.start);\n }\n\n public compareEnd(b: SequenceInterval) {\n return this.end.compare(b.end);\n }\n\n public overlaps(b: SequenceInterval) {\n const result = (this.start.compare(b.end) < 0) &&\n (this.end.compare(b.start) >= 0);\n if (this.checkMergeTree) {\n this.checkOverlaps(b, result);\n }\n return result;\n }\n\n public getIntervalId(): string | undefined {\n return this.properties?.[reservedIntervalIdKey]?.toString() as string | undefined;\n }\n\n public union(b: SequenceInterval) {\n return new SequenceInterval(this.start.min(b.start),\n this.end.max(b.end), this.intervalType);\n }\n\n public addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp) {\n this.properties = MergeTree.addProperties(this.properties, newProps, op);\n }\n\n public overlapsPos(bstart: number, bend: number) {\n const startPos = this.start.toPosition();\n const endPos = this.start.toPosition();\n return (endPos > bstart) && (startPos < bend);\n }\n\n private checkOverlaps(b: SequenceInterval, result: boolean) {\n const astart = this.start.toPosition();\n const bstart = b.start.toPosition();\n const aend = this.end.toPosition();\n const bend = b.end.toPosition();\n const checkResult = ((astart < bend) && (bstart < aend));\n if (checkResult !== result) {\n // eslint-disable-next-line max-len\n console.log(`check mismatch: res ${result} ${this.start.segment === b.end.segment} ${b.start.segment === this.end.segment}`);\n console.log(`as ${astart} ae ${aend} bs ${bstart} be ${bend}`);\n console.log(`as ${MergeTree.ordinalToArray(this.start.segment.ordinal)}@${this.start.offset}`);\n console.log(`ae ${MergeTree.ordinalToArray(this.end.segment.ordinal)}@${this.end.offset}`);\n console.log(`bs ${MergeTree.ordinalToArray(b.start.segment.ordinal)}@${b.start.offset}`);\n console.log(`be ${MergeTree.ordinalToArray(b.end.segment.ordinal)}@${b.end.offset}`);\n console.log(this.checkMergeTree.nodeToString(b.start.segment.parent, \"\"));\n }\n }\n}\n\nfunction createPositionReference(\n client: MergeTree.Client,\n pos: number,\n refType: MergeTree.ReferenceType): MergeTree.LocalReference {\n const segoff = client.getContainingSegment(pos);\n if (segoff && segoff.segment) {\n const lref = new MergeTree.LocalReference(client, segoff.segment, segoff.offset, refType);\n if (refType !== MergeTree.ReferenceType.Transient) {\n client.addLocalReference(lref);\n }\n return lref;\n }\n return new MergeTree.LocalReference(client, undefined);\n}\n\nfunction createSequenceInterval(\n label: string,\n start: number,\n end: number,\n client: MergeTree.Client,\n intervalType: MergeTree.IntervalType): SequenceInterval {\n let beginRefType = MergeTree.ReferenceType.RangeBegin;\n let endRefType = MergeTree.ReferenceType.RangeEnd;\n if (intervalType === MergeTree.IntervalType.Nest) {\n beginRefType = MergeTree.ReferenceType.NestBegin;\n endRefType = MergeTree.ReferenceType.NestEnd;\n } else if (intervalType === MergeTree.IntervalType.Transient) {\n beginRefType = MergeTree.ReferenceType.Transient;\n endRefType = MergeTree.ReferenceType.Transient;\n }\n\n // TODO: Should SlideOnRemove be the default behavior?\n if (intervalType & MergeTree.IntervalType.SlideOnRemove) {\n beginRefType |= MergeTree.ReferenceType.SlideOnRemove;\n endRefType |= MergeTree.ReferenceType.SlideOnRemove;\n }\n\n const startLref = createPositionReference(client, start, beginRefType);\n const endLref = createPositionReference(client, end, endRefType);\n if (startLref && endLref) {\n startLref.pairedRef = endLref;\n endLref.pairedRef = startLref;\n const rangeProp = {\n [MergeTree.reservedRangeLabelsKey]: [label],\n };\n startLref.addProperties(rangeProp);\n endLref.addProperties(rangeProp);\n\n const ival = new SequenceInterval(startLref, endLref, intervalType, rangeProp);\n return ival;\n }\n}\n\nexport function defaultIntervalConflictResolver(a: Interval, b: Interval) {\n a.addPropertySet(b.properties);\n return a;\n}\n\nexport function createIntervalIndex(conflict?: MergeTree.IntervalConflictResolver<Interval>) {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const lc = new LocalIntervalCollection<Interval>(undefined, \"\", helpers);\n if (conflict) {\n lc.addConflictResolver(conflict);\n } else {\n lc.addConflictResolver(defaultIntervalConflictResolver);\n }\n return lc;\n}\n\nexport class LocalIntervalCollection<TInterval extends ISerializableInterval> {\n private readonly intervalTree = new MergeTree.IntervalTree<TInterval>();\n private readonly endIntervalTree: MergeTree.RedBlackTree<TInterval, TInterval>;\n private conflictResolver: MergeTree.IntervalConflictResolver<TInterval>;\n private endConflictResolver: MergeTree.ConflictAction<TInterval, TInterval>;\n\n constructor(\n private readonly client: MergeTree.Client,\n private readonly label: string,\n private readonly helpers: IIntervalHelpers<TInterval>) {\n this.endIntervalTree =\n // eslint-disable-next-line @typescript-eslint/unbound-method\n new MergeTree.RedBlackTree<TInterval, TInterval>(helpers.compareEnds);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>) {\n this.conflictResolver = conflictResolver;\n this.endConflictResolver =\n (key: TInterval, currentKey: TInterval) => {\n const ival = this.conflictResolver(key, currentKey);\n return {\n data: ival,\n key: ival,\n };\n };\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.intervalTree.map(fn);\n }\n\n public createLegacyId(start: number, end: number): string {\n // Create a non-unique ID based on start and end to be used on intervals that come from legacy clients\n // without ID's.\n return `${start}-${end}`;\n }\n\n public ensureSerializedId(serializedInterval: ISerializedInterval) {\n if (serializedInterval.properties?.[reservedIntervalIdKey] === undefined) {\n // An interval came over the wire without an ID, so create a non-unique one based on start/end.\n // This will allow all clients to refer to this interval consistently.\n serializedInterval.properties = MergeTree.addProperties(\n serializedInterval.properties,\n {\n [reservedIntervalIdKey]: this.createLegacyId(serializedInterval.start, serializedInterval.end),\n },\n );\n }\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (this.intervalTree.intervals.isEmpty()) {\n return;\n }\n\n if (start === undefined && end === undefined) {\n // No start/end provided. Gather the whole tree in the specified order.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n results.push(interval);\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n results.push(interval);\n });\n }\n }\n else {\n const transientInterval: TInterval = this.helpers.create(\n \"transient\",\n start,\n end,\n this.client,\n MergeTree.IntervalType.Transient,\n );\n\n if (start === undefined) {\n // Only end position provided. Since the tree is not sorted by end position,\n // walk the whole tree in the specified order, gathering intervals that match the end.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n }\n else {\n // Start and (possibly) end provided. Walk the subtrees that may contain\n // this start position.\n const compareFn =\n end === undefined ?\n (node: MergeTree.IntervalNode<TInterval>) => {\n return transientInterval.compareStart(node.key);\n } :\n (node: MergeTree.IntervalNode<TInterval>) => {\n return transientInterval.compare(node.key);\n };\n const continueLeftFn = (cmpResult: number) => cmpResult <= 0;\n const continueRightFn = (cmpResult: number) => cmpResult >= 0;\n const actionFn = (node: MergeTree.IntervalNode<TInterval>) => {\n results.push(node.key);\n };\n\n if (iteratesForward) {\n this.intervalTree.intervals.walkExactMatchesForward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n else {\n this.intervalTree.intervals.walkExactMatchesBackward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n }\n }\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number) {\n if (!this.intervalTree.intervals.isEmpty()) {\n const transientInterval =\n this.helpers.create(\n \"transient\",\n startPosition,\n endPosition,\n this.client,\n MergeTree.IntervalType.Transient);\n\n const overlappingIntervalNodes = this.intervalTree.match(transientInterval);\n return overlappingIntervalNodes.map((node) => node.key);\n } else {\n return [];\n }\n }\n\n public previousInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, MergeTree.IntervalType.Transient);\n const rbNode = this.endIntervalTree.floor(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public nextInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, MergeTree.IntervalType.Transient);\n const rbNode = this.endIntervalTree.ceil(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public removeInterval(startPosition: number, endPosition: number) {\n const transientInterval = this.helpers.create(\n \"transient\", startPosition, endPosition, this.client, MergeTree.IntervalType.Transient);\n this.intervalTree.remove(transientInterval);\n this.endIntervalTree.remove(transientInterval);\n return transientInterval;\n }\n\n public createInterval(start: number, end: number, intervalType: MergeTree.IntervalType) {\n return this.helpers.create(this.label, start, end, this.client, intervalType);\n }\n\n // TODO: remove interval, handle duplicate intervals\n public addInterval(\n start: number,\n end: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet) {\n const interval: TInterval = this.createInterval(start, end, intervalType);\n if (interval) {\n interval.addProperties(props);\n if (this.label && (this.label.length > 0)) {\n interval.properties[MergeTree.reservedRangeLabelsKey] = [this.label];\n }\n if (interval.properties[reservedIntervalIdKey] === undefined) {\n interval.properties[reservedIntervalIdKey] = uuid();\n }\n this.intervalTree.put(interval, this.conflictResolver);\n this.endIntervalTree.put(interval, interval, this.endConflictResolver);\n }\n return interval;\n }\n\n public serialize() {\n const client = this.client;\n const intervals = this.intervalTree.intervals.keys();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return intervals.map((interval) => interval.serialize(client));\n }\n}\n\nconst compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInterval): number => a.end.compare(b.end);\n\nclass SequenceIntervalCollectionFactory\n implements IValueFactory<IntervalCollection<SequenceInterval>> {\n public load(\n emitter: IValueOpEmitter,\n raw: ISerializedInterval[] = [],\n ): IntervalCollection<SequenceInterval> {\n const helpers: IIntervalHelpers<SequenceInterval> = {\n compareEnds: compareSequenceIntervalEnds,\n create: createSequenceInterval,\n };\n return new IntervalCollection<SequenceInterval>(helpers, true, emitter, raw);\n }\n\n public store(value: IntervalCollection<SequenceInterval>): ISerializedInterval[] {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value.serializeInternal();\n }\n}\n\nexport class SequenceIntervalCollectionValueType\n implements IValueType<IntervalCollection<SequenceInterval>> {\n public static Name = \"sharedStringIntervalCollection\";\n\n public get name(): string {\n return SequenceIntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<SequenceInterval>> {\n return SequenceIntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> {\n return SequenceIntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<SequenceInterval>> =\n new SequenceIntervalCollectionFactory();\n\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> =\n new Map<string, IValueOperation<IntervalCollection<SequenceInterval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ]]);\n}\n\nconst compareIntervalEnds = (a: Interval, b: Interval) => a.end - b.end;\n\nfunction createInterval(label: string, start: number, end: number, client: MergeTree.Client): Interval {\n let rangeProp: MergeTree.PropertySet;\n if (label && (label.length > 0)) {\n rangeProp = {\n [MergeTree.reservedRangeLabelsKey]: [label],\n };\n }\n return new Interval(start, end, rangeProp);\n}\n\nclass IntervalCollectionFactory\n implements IValueFactory<IntervalCollection<Interval>> {\n public load(emitter: IValueOpEmitter, raw: ISerializedInterval[] = []): IntervalCollection<Interval> {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const collection = new IntervalCollection<Interval>(helpers, false, emitter, raw);\n collection.attachGraph(undefined, \"\");\n return collection;\n }\n\n public store(value: IntervalCollection<Interval>): ISerializedInterval[] {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value.serializeInternal();\n }\n}\n\nexport class IntervalCollectionValueType\n implements IValueType<IntervalCollection<Interval>> {\n public static Name = \"sharedIntervalCollection\";\n\n public get name(): string {\n return IntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<Interval>> {\n return IntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<Interval>>> {\n return IntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<Interval>> =\n new IntervalCollectionFactory();\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<Interval>>> =\n new Map<string, IValueOperation<IntervalCollection<Interval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ]]);\n}\n\nexport type DeserializeCallback = (properties: MergeTree.PropertySet) => void;\n\nexport class IntervalCollectionIterator<TInterval extends ISerializableInterval> {\n private readonly results: TInterval[];\n private index: number;\n\n constructor(\n collection: IntervalCollection<TInterval>,\n iteratesForward: boolean = true,\n start?: number,\n end?: number) {\n this.results = [];\n this.index = 0;\n\n collection.gatherIterationResults(this.results, iteratesForward, start, end);\n }\n\n public next() {\n let _value: TInterval | undefined;\n let _done: boolean = true;\n\n if (this.index < this.results.length) {\n _value = this.results[this.index++];\n _done = false;\n }\n\n return {\n value: _value,\n done: _done,\n };\n }\n}\n\nexport class IntervalCollection<TInterval extends ISerializableInterval> extends EventEmitter {\n private savedSerializedIntervals?: ISerializedInterval[];\n private localCollection: LocalIntervalCollection<TInterval>;\n private onDeserialize: DeserializeCallback;\n private client: MergeTree.Client;\n\n public get attached(): boolean {\n // return !!this.view;\n return !!this.localCollection;\n }\n\n constructor(private readonly helpers: IIntervalHelpers<TInterval>, private readonly requiresClient: boolean,\n private readonly emitter: IValueOpEmitter,\n serializedIntervals: ISerializedInterval[]) {\n super();\n this.savedSerializedIntervals = serializedIntervals;\n }\n\n public attachGraph(client: MergeTree.Client, label: string) {\n if (this.attached) {\n throw new Error(\"Only supports one Sequence attach\");\n }\n\n if ((client === undefined) && (this.requiresClient)) {\n throw new Error(\"Client required for this collection\");\n }\n\n // Instantiate the local interval collection based on the saved intervals\n this.client = client;\n this.localCollection = new LocalIntervalCollection<TInterval>(client, label, this.helpers);\n if (this.savedSerializedIntervals) {\n for (const serializedInterval of this.savedSerializedIntervals) {\n this.localCollection.ensureSerializedId(serializedInterval);\n this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n }\n }\n this.savedSerializedIntervals = undefined;\n }\n\n public add(\n start: number,\n end: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet,\n ) {\n if (!this.attached) {\n throw new Error(\"attach must be called prior to adding intervals\");\n }\n\n let seq = 0;\n if (this.client) {\n seq = this.client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end,\n intervalType,\n properties: props,\n sequenceNumber: seq,\n start,\n };\n\n return this.addInternal(serializedInterval, true, undefined);\n }\n\n public delete(\n start: number,\n end: number,\n ) {\n let sequenceNumber = 0;\n if (!this.attached) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n\n if (this.client) {\n sequenceNumber = this.client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n start,\n end,\n sequenceNumber,\n intervalType: MergeTree.IntervalType.Transient,\n };\n\n this.deleteInterval(serializedInterval, true, undefined);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n this.localCollection.addConflictResolver(conflictResolver);\n }\n\n public attachDeserializer(onDeserialize: DeserializeCallback): void {\n this.attachDeserializerCore(onDeserialize);\n }\n\n private attachDeserializerCore(onDeserialize?: DeserializeCallback): void {\n // If no deserializer is specified can skip all processing work\n if (!onDeserialize) {\n return;\n }\n\n // Start by storing the callbacks so that any subsequent modifications make use of them\n this.onDeserialize = onDeserialize;\n\n // Trigger the async prepare work across all values in the collection\n this.localCollection.map((interval) => {\n this.onDeserialize(interval);\n });\n }\n\n /**\n * @deprecated - IntervalCollectionView has been removed. Please refer to IntervalCollection directly.\n */\n public async getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollection<TInterval>> {\n if (!this.attached) {\n return Promise.reject(new Error(\"attachSequence must be called prior to retrieving the view\"));\n }\n\n // Attach custom deserializers if specified\n if (onDeserialize) {\n this.attachDeserializer(onDeserialize);\n }\n\n return this;\n }\n\n public addInternal(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage) {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n if (!local) {\n this.localCollection.ensureSerializedId(serializedInterval);\n }\n\n const interval = this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"add\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"addInterval\", interval, local, op);\n\n return interval;\n }\n\n public deleteInterval(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage): void {\n if (!this.attached) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n\n const interval = this.localCollection.removeInterval(serializedInterval.start, serializedInterval.end);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"delete\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"deleteInterval\", interval, local, op);\n }\n\n public serializeInternal() {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.localCollection.serialize();\n }\n\n public [Symbol.iterator](): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this);\n return iterator;\n }\n\n public CreateForwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, startPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, startPosition);\n return iterator;\n }\n\n public CreateForwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, undefined, endPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, undefined, endPosition);\n return iterator;\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (!this.attached) {\n return;\n }\n\n this.localCollection.gatherIterationResults(results, iteratesForward, start, end);\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[] {\n return this.localCollection.findOverlappingIntervals(startPosition, endPosition);\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.localCollection.map(fn);\n }\n\n public previousInterval(pos: number): TInterval {\n return this.localCollection.previousInterval(pos);\n }\n\n public nextInterval(pos: number): TInterval {\n return this.localCollection.nextInterval(pos);\n }\n\n public on(\n event: \"addInterval\" | \"deleteInterval\",\n listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this {\n return super.on(event, listener);\n }\n}\n"]} |
@@ -8,3 +8,3 @@ /*! | ||
| export declare const pkgName = "@fluidframework/sequence"; | ||
| export declare const pkgVersion = "0.42.2"; | ||
| export declare const pkgVersion = "0.43.0"; | ||
| //# sourceMappingURL=packageVersion.d.ts.map |
@@ -11,3 +11,3 @@ "use strict"; | ||
| exports.pkgName = "@fluidframework/sequence"; | ||
| exports.pkgVersion = "0.42.2"; | ||
| exports.pkgVersion = "0.43.0"; | ||
| //# sourceMappingURL=packageVersion.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,0BAA0B,CAAC;AACrC,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"0.42.2\";\n"]} | ||
| {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,0BAA0B,CAAC;AACrC,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"0.43.0\";\n"]} |
+1
-1
@@ -5,3 +5,3 @@ /*! | ||
| */ | ||
| export { DeserializeCallback, IIntervalHelpers, Interval, ISerializableInterval, ISerializedInterval, IntervalCollection, IntervalCollectionIterator, IntervalCollectionView, SequenceInterval, } from "./intervalCollection"; | ||
| export { DeserializeCallback, IIntervalHelpers, Interval, ISerializableInterval, ISerializedInterval, IntervalCollection, IntervalCollectionIterator, SequenceInterval, } from "./intervalCollection"; | ||
| export { IValueOpEmitter, } from "./mapKernelInterfaces"; | ||
@@ -8,0 +8,0 @@ export * from "./sharedString"; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,eAAe,GAClB,MAAM,uBAAuB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,eAAe,GAClB,MAAM,uBAAuB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC"} |
+1
-1
@@ -5,3 +5,3 @@ /*! | ||
| */ | ||
| export { Interval, IntervalCollection, IntervalCollectionIterator, IntervalCollectionView, SequenceInterval, } from "./intervalCollection"; | ||
| export { Interval, IntervalCollection, IntervalCollectionIterator, SequenceInterval, } from "./intervalCollection"; | ||
| export * from "./sharedString"; | ||
@@ -8,0 +8,0 @@ export * from "./sequence"; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGH,QAAQ,EAGR,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,GACnB,MAAM,sBAAsB,CAAC;AAI9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n DeserializeCallback,\n IIntervalHelpers,\n Interval,\n ISerializableInterval,\n ISerializedInterval,\n IntervalCollection,\n IntervalCollectionIterator,\n IntervalCollectionView,\n SequenceInterval,\n} from \"./intervalCollection\";\nexport {\n IValueOpEmitter,\n} from \"./mapKernelInterfaces\";\nexport * from \"./sharedString\";\nexport * from \"./sequence\";\nexport * from \"./sequenceFactory\";\nexport * from \"./sequenceDeltaEvent\";\nexport * from \"./sharedSequence\";\nexport * from \"./sharedObjectSequence\";\nexport * from \"./sharedNumberSequence\";\nexport * from \"./sparsematrix\";\nexport * from \"./sharedIntervalCollection\";\n"]} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGH,QAAQ,EAGR,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,GACnB,MAAM,sBAAsB,CAAC;AAI9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n DeserializeCallback,\n IIntervalHelpers,\n Interval,\n ISerializableInterval,\n ISerializedInterval,\n IntervalCollection,\n IntervalCollectionIterator,\n SequenceInterval,\n} from \"./intervalCollection\";\nexport {\n IValueOpEmitter,\n} from \"./mapKernelInterfaces\";\nexport * from \"./sharedString\";\nexport * from \"./sequence\";\nexport * from \"./sequenceFactory\";\nexport * from \"./sequenceDeltaEvent\";\nexport * from \"./sharedSequence\";\nexport * from \"./sharedObjectSequence\";\nexport * from \"./sharedNumberSequence\";\nexport * from \"./sparsematrix\";\nexport * from \"./sharedIntervalCollection\";\n"]} |
@@ -10,2 +10,3 @@ /*! | ||
| import { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from "./mapKernelInterfaces"; | ||
| export declare const reservedIntervalIdKey = "intervalId"; | ||
| export interface ISerializedInterval { | ||
@@ -33,2 +34,3 @@ sequenceNumber: number; | ||
| constructor(start: number, end: number, props?: MergeTree.PropertySet); | ||
| getIntervalId(): string | undefined; | ||
| getAdditionalPropertySets(): MergeTree.PropertySet[]; | ||
@@ -59,2 +61,3 @@ addPropertySet(props: MergeTree.PropertySet): void; | ||
| overlaps(b: SequenceInterval): boolean; | ||
| getIntervalId(): string | undefined; | ||
| union(b: SequenceInterval): SequenceInterval; | ||
@@ -78,2 +81,4 @@ addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp): void; | ||
| map(fn: (interval: TInterval) => void): void; | ||
| createLegacyId(start: number, end: number): string; | ||
| ensureSerializedId(serializedInterval: ISerializedInterval): void; | ||
| gatherIterationResults(results: TInterval[], iteratesForward: boolean, start?: number, end?: number): void; | ||
@@ -105,23 +110,2 @@ findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[]; | ||
| export declare type DeserializeCallback = (properties: MergeTree.PropertySet) => void; | ||
| export declare class IntervalCollectionView<TInterval extends ISerializableInterval> extends EventEmitter { | ||
| private readonly client; | ||
| private readonly emitter; | ||
| private readonly localCollection; | ||
| private onDeserialize; | ||
| constructor(client: MergeTree.Client, savedSerializedIntervals: ISerializedInterval[], label: string, helpers: IIntervalHelpers<TInterval>, emitter: IValueOpEmitter); | ||
| attachDeserializer(onDeserialize: DeserializeCallback): void; | ||
| addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void; | ||
| findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[]; | ||
| map(fn: (interval: TInterval) => void): void; | ||
| gatherIterationResults(results: TInterval[], iteratesForward: boolean, start?: number, end?: number): void; | ||
| previousInterval(pos: number): TInterval; | ||
| nextInterval(pos: number): TInterval; | ||
| on(event: "addInterval" | "deleteInterval", listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this; | ||
| add(start: number, end: number, intervalType: MergeTree.IntervalType, props?: MergeTree.PropertySet): TInterval; | ||
| delete(start: number, end: number): void; | ||
| addInternal(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage): TInterval; | ||
| deleteInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage): this; | ||
| serializeInternal(): any[]; | ||
| private attachDeserializerCore; | ||
| } | ||
| export declare class IntervalCollectionIterator<TInterval extends ISerializableInterval> { | ||
@@ -136,3 +120,3 @@ private readonly results; | ||
| } | ||
| export declare class IntervalCollection<TInterval extends ISerializableInterval> { | ||
| export declare class IntervalCollection<TInterval extends ISerializableInterval> extends EventEmitter { | ||
| private readonly helpers; | ||
@@ -142,10 +126,17 @@ private readonly requiresClient; | ||
| private savedSerializedIntervals?; | ||
| private view; | ||
| private localCollection; | ||
| private onDeserialize; | ||
| private client; | ||
| get attached(): boolean; | ||
| constructor(helpers: IIntervalHelpers<TInterval>, requiresClient: boolean, emitter: IValueOpEmitter, serializedIntervals: ISerializedInterval[]); | ||
| attachGraph(client: MergeTree.Client, label: string): void; | ||
| add(startPosition: number, endPosition: number, intervalType: MergeTree.IntervalType, props?: MergeTree.PropertySet): TInterval; | ||
| delete(startPosition: number, endPosition: number): void; | ||
| add(start: number, end: number, intervalType: MergeTree.IntervalType, props?: MergeTree.PropertySet): TInterval; | ||
| delete(start: number, end: number): void; | ||
| addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void; | ||
| getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollectionView<TInterval>>; | ||
| attachDeserializer(onDeserialize: DeserializeCallback): void; | ||
| private attachDeserializerCore; | ||
| /** | ||
| * @deprecated - IntervalCollectionView has been removed. Please refer to IntervalCollection directly. | ||
| */ | ||
| getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollection<TInterval>>; | ||
| addInternal(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage): TInterval; | ||
@@ -160,3 +151,8 @@ deleteInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage): void; | ||
| gatherIterationResults(results: TInterval[], iteratesForward: boolean, start?: number, end?: number): void; | ||
| findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[]; | ||
| map(fn: (interval: TInterval) => void): void; | ||
| previousInterval(pos: number): TInterval; | ||
| nextInterval(pos: number): TInterval; | ||
| on(event: "addInterval" | "deleteInterval", listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this; | ||
| } | ||
| //# sourceMappingURL=intervalCollection.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"intervalCollection.d.ts","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEpG,MAAM,WAAW,mBAAmB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC;IACrC,UAAU,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC;CACtC;AAED,MAAM,WAAW,qBAAsB,SAAQ,SAAS,CAAC,SAAS;IAC9D,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;IAClC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,OAAE;IACpC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW,OAAE;CAC/C;AAED,MAAM,WAAW,gBAAgB,CAAC,SAAS,SAAS,qBAAqB;IACrE,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAC5C,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC;CACnF;AAED,qBAAa,QAAS,YAAW,qBAAqB;IAIvC,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,MAAM;IAJf,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;IAClC,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC;gBAE9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,SAAS,CAAC,WAAW;IAM1B,yBAAyB;IAIzB,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,WAAW;IAO3C,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM;IAkBlC,KAAK;IAIL,OAAO,CAAC,CAAC,EAAE,QAAQ;IASnB,YAAY,CAAC,CAAC,EAAE,QAAQ;IAIxB,UAAU,CAAC,CAAC,EAAE,QAAQ;IAItB,QAAQ,CAAC,CAAC,EAAE,QAAQ;IAMpB,KAAK,CAAC,CAAC,EAAE,QAAQ;IAKjB,aAAa;IAIb,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,YAAY;CAGpF;AAED,qBAAa,gBAAiB,YAAW,qBAAqB;IAK/C,KAAK,EAAE,SAAS,CAAC,cAAc;IAC/B,GAAG,EAAE,SAAS,CAAC,cAAc;IAC7B,YAAY,EAAE,SAAS,CAAC,YAAY;IANxC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;gBAG1C,KAAK,EAAE,SAAS,CAAC,cAAc,EAC/B,GAAG,EAAE,SAAS,CAAC,cAAc,EAC7B,YAAY,EAAE,SAAS,CAAC,YAAY,EAC3C,KAAK,CAAC,EAAE,SAAS,CAAC,WAAW;IAM1B,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM;IAelC,KAAK;IAIL,OAAO,CAAC,CAAC,EAAE,gBAAgB;IAS3B,YAAY,CAAC,CAAC,EAAE,gBAAgB;IAIhC,UAAU,CAAC,CAAC,EAAE,gBAAgB;IAI9B,QAAQ,CAAC,CAAC,EAAE,gBAAgB;IAS5B,KAAK,CAAC,CAAC,EAAE,gBAAgB;IAKzB,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,YAAY;IAI1E,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAM/C,OAAO,CAAC,aAAa;CAiBxB;AAuDD,wBAAgB,+BAA+B,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,YAGvE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,wBAAwB,CAAC,QAAQ,CAAC,qCAY1F;AAED,qBAAa,uBAAuB,CAAC,SAAS,SAAS,qBAAqB;IAOpE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2C;IACxE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA+C;IAC/E,OAAO,CAAC,gBAAgB,CAAgD;IACxE,OAAO,CAAC,mBAAmB,CAAiD;gBAGvD,MAAM,EAAE,SAAS,CAAC,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAMlD,mBAAmB,CAAC,gBAAgB,EAAE,SAAS,CAAC,wBAAwB,CAAC,SAAS,CAAC;IAYnF,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI;IAIrC,sBAAsB,CACzB,OAAO,EAAE,SAAS,EAAE,EACpB,eAAe,EAAE,OAAO,EACxB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM;IA4ET,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAiBnE,gBAAgB,CAAC,GAAG,EAAE,MAAM;IAS5B,YAAY,CAAC,GAAG,EAAE,MAAM;IASxB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAQzD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY;IAK/E,WAAW,CACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,SAAS,CAAC,YAAY,EACpC,KAAK,CAAC,EAAE,SAAS,CAAC,WAAW;IAa1B,SAAS;CAMnB;AAuBD,qBAAa,mCACT,YAAW,UAAU,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,OAAc,IAAI,SAAoC;IAEtD,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,OAAO,IAAI,aAAa,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAExE;IAED,IAAW,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAEnF;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CACY;IAE5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAyBhB;CACf;AAgCD,qBAAa,2BACT,YAAW,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnD,OAAc,IAAI,SAA8B;IAEhD,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,OAAO,IAAI,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAEhE;IAED,IAAW,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAE3E;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CACI;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAyBhB;CACf;AAED,oBAAY,mBAAmB,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,WAAW,KAAK,IAAI,CAAC;AAE9E,qBAAa,sBAAsB,CAAC,SAAS,SAAS,qBAAqB,CAAE,SAAQ,YAAY;IAKzF,OAAO,CAAC,QAAQ,CAAC,MAAM;IAIvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,aAAa,CAAsB;gBAGtB,MAAM,EAAE,SAAS,CAAC,MAAM,EACzC,wBAAwB,EAAE,mBAAmB,EAAE,EAC/C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,EACnB,OAAO,EAAE,eAAe;IAgBtC,kBAAkB,CAAC,aAAa,EAAE,mBAAmB,GAAG,IAAI;IAI5D,mBAAmB,CAAC,gBAAgB,EAAE,SAAS,CAAC,wBAAwB,CAAC,SAAS,CAAC,GAAG,IAAI;IAI1F,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE;IAIjF,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI;IAIrC,sBAAsB,CACzB,OAAO,EAAE,SAAS,EAAE,EACpB,eAAe,EAAE,OAAO,EACxB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM;IAIT,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAIxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAIpC,EAAE,CACL,KAAK,EAAE,aAAa,GAAG,gBAAgB,EACvC,QAAQ,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,yBAAyB,KAAK,IAAI,GAAG,IAAI;IAIpG,GAAG,CACN,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,SAAS,CAAC,YAAY,EACpC,KAAK,CAAC,EAAE,SAAS,CAAC,WAAW;IAkB1B,MAAM,CACT,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM;IAiBR,WAAW,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,yBAAyB;IAuBlG,cAAc,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,yBAAyB;IAmBrG,iBAAiB;IAKxB,OAAO,CAAC,sBAAsB;CAcjC;AAED,qBAAa,0BAA0B,CAAC,SAAS,SAAS,qBAAqB;IAC3E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,KAAK,CAAS;gBAGlB,UAAU,EAAE,kBAAkB,CAAC,SAAS,CAAC,EACzC,eAAe,GAAE,OAAc,EAC/B,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM;IAOT,IAAI;;;;CAcd;AAED,qBAAa,kBAAkB,CAAC,SAAS,SAAS,qBAAqB;IAQvD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA+B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC9F,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR5B,OAAO,CAAC,wBAAwB,CAAC,CAAwB;IACzD,OAAO,CAAC,IAAI,CAAoC;IAEhD,IAAW,QAAQ,IAAI,OAAO,CAE7B;gBAE4B,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,EAAmB,cAAc,EAAE,OAAO,EACtF,OAAO,EAAE,eAAe,EACzC,mBAAmB,EAAE,mBAAmB,EAAE;IAIvC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM;IAcnD,GAAG,CACN,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,SAAS,CAAC,YAAY,EACpC,KAAK,CAAC,EAAE,SAAS,CAAC,WAAW;IAS1B,MAAM,CACT,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM;IAShB,mBAAmB,CAAC,gBAAgB,EAAE,SAAS,CAAC,wBAAwB,CAAC,SAAS,CAAC,GAAG,IAAI;IAIpF,OAAO,CAAC,aAAa,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAa9F,WAAW,CACd,kBAAkB,EAAE,mBAAmB,EACvC,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,yBAAyB;IAQ1B,cAAc,CACjB,kBAAkB,EAAE,mBAAmB,EACvC,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,yBAAyB,GAAG,IAAI;IAOjC,iBAAiB;IASjB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,0BAA0B,CAAC,SAAS,CAAC;IAK1D,sCAAsC,CAAC,aAAa,EAAE,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC;IAKpG,uCAAuC,CAAC,aAAa,EAAE,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC;IAKrG,oCAAoC,CAAC,WAAW,EAAE,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC;IAKhG,qCAAqC,CAAC,WAAW,EAAE,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC;IAKjG,sBAAsB,CACzB,OAAO,EAAE,SAAS,EAAE,EACpB,eAAe,EAAE,OAAO,EACxB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM;CAOnB"} | ||
| {"version":3,"file":"intervalCollection.d.ts","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"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"} |
+138
-129
@@ -8,2 +8,4 @@ /*! | ||
| import * as MergeTree from "@fluidframework/merge-tree"; | ||
| import { v4 as uuid } from "uuid"; | ||
| export const reservedIntervalIdKey = "intervalId"; | ||
| export class Interval { | ||
@@ -17,2 +19,6 @@ constructor(start, end, props) { | ||
| } | ||
| getIntervalId() { | ||
| var _a, _b; | ||
| return (_b = (_a = this.properties) === null || _a === void 0 ? void 0 : _a[reservedIntervalIdKey]) === null || _b === void 0 ? void 0 : _b.toString(); | ||
| } | ||
| getAdditionalPropertySets() { | ||
@@ -125,2 +131,6 @@ return this.auxProps; | ||
| } | ||
| getIntervalId() { | ||
| var _a, _b; | ||
| return (_b = (_a = this.properties) === null || _a === void 0 ? void 0 : _a[reservedIntervalIdKey]) === null || _b === void 0 ? void 0 : _b.toString(); | ||
| } | ||
| union(b) { | ||
@@ -238,2 +248,17 @@ return new SequenceInterval(this.start.min(b.start), this.end.max(b.end), this.intervalType); | ||
| } | ||
| createLegacyId(start, end) { | ||
| // Create a non-unique ID based on start and end to be used on intervals that come from legacy clients | ||
| // without ID's. | ||
| return `${start}-${end}`; | ||
| } | ||
| ensureSerializedId(serializedInterval) { | ||
| var _a; | ||
| if (((_a = serializedInterval.properties) === null || _a === void 0 ? void 0 : _a[reservedIntervalIdKey]) === undefined) { | ||
| // An interval came over the wire without an ID, so create a non-unique one based on start/end. | ||
| // This will allow all clients to refer to this interval consistently. | ||
| serializedInterval.properties = MergeTree.addProperties(serializedInterval.properties, { | ||
| [reservedIntervalIdKey]: this.createLegacyId(serializedInterval.start, serializedInterval.end), | ||
| }); | ||
| } | ||
| } | ||
| gatherIterationResults(results, iteratesForward, start, end) { | ||
@@ -341,2 +366,5 @@ if (this.intervalTree.intervals.isEmpty()) { | ||
| } | ||
| if (interval.properties[reservedIntervalIdKey] === undefined) { | ||
| interval.properties[reservedIntervalIdKey] = uuid(); | ||
| } | ||
| this.intervalTree.put(interval, this.conflictResolver); | ||
@@ -465,40 +493,55 @@ this.endIntervalTree.put(interval, interval, this.endConflictResolver); | ||
| ]]); | ||
| export class IntervalCollectionView extends EventEmitter { | ||
| constructor(client, savedSerializedIntervals, label, helpers, emitter) { | ||
| export class IntervalCollectionIterator { | ||
| constructor(collection, iteratesForward = true, start, end) { | ||
| this.results = []; | ||
| this.index = 0; | ||
| collection.gatherIterationResults(this.results, iteratesForward, start, end); | ||
| } | ||
| next() { | ||
| let _value; | ||
| let _done = true; | ||
| if (this.index < this.results.length) { | ||
| _value = this.results[this.index++]; | ||
| _done = false; | ||
| } | ||
| return { | ||
| value: _value, | ||
| done: _done, | ||
| }; | ||
| } | ||
| } | ||
| export class IntervalCollection extends EventEmitter { | ||
| constructor(helpers, requiresClient, emitter, serializedIntervals) { | ||
| super(); | ||
| this.client = client; | ||
| this.helpers = helpers; | ||
| this.requiresClient = requiresClient; | ||
| this.emitter = emitter; | ||
| this.savedSerializedIntervals = serializedIntervals; | ||
| } | ||
| get attached() { | ||
| // return !!this.view; | ||
| return !!this.localCollection; | ||
| } | ||
| attachGraph(client, label) { | ||
| if (this.attached) { | ||
| throw new Error("Only supports one Sequence attach"); | ||
| } | ||
| if ((client === undefined) && (this.requiresClient)) { | ||
| throw new Error("Client required for this collection"); | ||
| } | ||
| // Instantiate the local interval collection based on the saved intervals | ||
| this.localCollection = new LocalIntervalCollection(client, label, helpers); | ||
| if (savedSerializedIntervals) { | ||
| for (const serializedInterval of savedSerializedIntervals) { | ||
| this.client = client; | ||
| this.localCollection = new LocalIntervalCollection(client, label, this.helpers); | ||
| if (this.savedSerializedIntervals) { | ||
| for (const serializedInterval of this.savedSerializedIntervals) { | ||
| this.localCollection.ensureSerializedId(serializedInterval); | ||
| this.localCollection.addInterval(serializedInterval.start, serializedInterval.end, serializedInterval.intervalType, serializedInterval.properties); | ||
| } | ||
| } | ||
| this.savedSerializedIntervals = undefined; | ||
| } | ||
| attachDeserializer(onDeserialize) { | ||
| this.attachDeserializerCore(onDeserialize); | ||
| } | ||
| addConflictResolver(conflictResolver) { | ||
| this.localCollection.addConflictResolver(conflictResolver); | ||
| } | ||
| findOverlappingIntervals(startPosition, endPosition) { | ||
| return this.localCollection.findOverlappingIntervals(startPosition, endPosition); | ||
| } | ||
| map(fn) { | ||
| this.localCollection.map(fn); | ||
| } | ||
| gatherIterationResults(results, iteratesForward, start, end) { | ||
| this.localCollection.gatherIterationResults(results, iteratesForward, start, end); | ||
| } | ||
| previousInterval(pos) { | ||
| return this.localCollection.previousInterval(pos); | ||
| } | ||
| nextInterval(pos) { | ||
| return this.localCollection.nextInterval(pos); | ||
| } | ||
| on(event, listener) { | ||
| return super.on(event, listener); | ||
| } | ||
| add(start, end, intervalType, props) { | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to adding intervals"); | ||
| } | ||
| let seq = 0; | ||
@@ -519,2 +562,5 @@ if (this.client) { | ||
| let sequenceNumber = 0; | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| if (this.client) { | ||
@@ -531,4 +577,43 @@ sequenceNumber = this.client.getCurrentSeq(); | ||
| } | ||
| // TODO: error cases | ||
| addConflictResolver(conflictResolver) { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| this.localCollection.addConflictResolver(conflictResolver); | ||
| } | ||
| attachDeserializer(onDeserialize) { | ||
| this.attachDeserializerCore(onDeserialize); | ||
| } | ||
| attachDeserializerCore(onDeserialize) { | ||
| // If no deserializer is specified can skip all processing work | ||
| if (!onDeserialize) { | ||
| return; | ||
| } | ||
| // Start by storing the callbacks so that any subsequent modifications make use of them | ||
| this.onDeserialize = onDeserialize; | ||
| // Trigger the async prepare work across all values in the collection | ||
| this.localCollection.map((interval) => { | ||
| this.onDeserialize(interval); | ||
| }); | ||
| } | ||
| /** | ||
| * @deprecated - IntervalCollectionView has been removed. Please refer to IntervalCollection directly. | ||
| */ | ||
| async getView(onDeserialize) { | ||
| if (!this.attached) { | ||
| return Promise.reject(new Error("attachSequence must be called prior to retrieving the view")); | ||
| } | ||
| // Attach custom deserializers if specified | ||
| if (onDeserialize) { | ||
| this.attachDeserializer(onDeserialize); | ||
| } | ||
| return this; | ||
| } | ||
| addInternal(serializedInterval, local, op) { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| if (!local) { | ||
| this.localCollection.ensureSerializedId(serializedInterval); | ||
| } | ||
| const interval = this.localCollection.addInterval(serializedInterval.start, serializedInterval.end, serializedInterval.intervalType, serializedInterval.properties); | ||
@@ -550,2 +635,5 @@ if (interval) { | ||
| deleteInterval(serializedInterval, local, op) { | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| const interval = this.localCollection.removeInterval(serializedInterval.start, serializedInterval.end); | ||
@@ -564,103 +652,9 @@ if (interval) { | ||
| this.emit("deleteInterval", interval, local, op); | ||
| return this; | ||
| } | ||
| serializeInternal() { | ||
| // eslint-disable-next-line @typescript-eslint/no-unsafe-return | ||
| return this.localCollection.serialize(); | ||
| } | ||
| attachDeserializerCore(onDeserialize) { | ||
| // If no deserializer is specified can skip all processing work | ||
| if (!onDeserialize) { | ||
| return; | ||
| } | ||
| // Start by storing the callbacks so that any subsequent modifications make use of them | ||
| this.onDeserialize = onDeserialize; | ||
| // Trigger the async prepare work across all values in the collection | ||
| this.localCollection.map((interval) => { | ||
| this.onDeserialize(interval); | ||
| }); | ||
| } | ||
| } | ||
| export class IntervalCollectionIterator { | ||
| constructor(collection, iteratesForward = true, start, end) { | ||
| this.results = []; | ||
| this.index = 0; | ||
| collection.gatherIterationResults(this.results, iteratesForward, start, end); | ||
| } | ||
| next() { | ||
| let _value; | ||
| let _done = true; | ||
| if (this.index < this.results.length) { | ||
| _value = this.results[this.index++]; | ||
| _done = false; | ||
| } | ||
| return { | ||
| value: _value, | ||
| done: _done, | ||
| }; | ||
| } | ||
| } | ||
| export class IntervalCollection { | ||
| constructor(helpers, requiresClient, emitter, serializedIntervals) { | ||
| this.helpers = helpers; | ||
| this.requiresClient = requiresClient; | ||
| this.emitter = emitter; | ||
| this.savedSerializedIntervals = serializedIntervals; | ||
| } | ||
| get attached() { | ||
| return !!this.view; | ||
| } | ||
| attachGraph(client, label) { | ||
| if (this.view) { | ||
| throw new Error("Only supports one Sequence attach"); | ||
| } | ||
| if ((client === undefined) && (this.requiresClient)) { | ||
| throw new Error("Client required for this collection"); | ||
| } | ||
| this.view = new IntervalCollectionView(client, this.savedSerializedIntervals, label, this.helpers, this.emitter); | ||
| this.savedSerializedIntervals = undefined; | ||
| } | ||
| add(startPosition, endPosition, intervalType, props) { | ||
| if (!this.view) { | ||
| throw new Error("attach must be called prior to adding intervals"); | ||
| } | ||
| return this.view.add(startPosition, endPosition, intervalType, props); | ||
| } | ||
| delete(startPosition, endPosition) { | ||
| if (!this.view) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| this.view.delete(startPosition, endPosition); | ||
| } | ||
| addConflictResolver(conflictResolver) { | ||
| this.view.addConflictResolver(conflictResolver); | ||
| } | ||
| async getView(onDeserialize) { | ||
| if (!this.view) { | ||
| return Promise.reject(new Error("attachSequence must be called prior to retrieving the view")); | ||
| } | ||
| // Attach custom deserializers if specified | ||
| if (onDeserialize) { | ||
| this.view.attachDeserializer(onDeserialize); | ||
| } | ||
| return this.view; | ||
| } | ||
| addInternal(serializedInterval, local, op) { | ||
| if (!this.view) { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| return this.view.addInternal(serializedInterval, local, op); | ||
| } | ||
| deleteInterval(serializedInterval, local, op) { | ||
| if (!this.view) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| this.view.deleteInterval(serializedInterval, local, op); | ||
| } | ||
| serializeInternal() { | ||
| if (!this.view) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| // eslint-disable-next-line @typescript-eslint/no-unsafe-return | ||
| return this.view.serializeInternal(); | ||
| return this.localCollection.serialize(); | ||
| } | ||
@@ -688,8 +682,23 @@ [Symbol.iterator]() { | ||
| gatherIterationResults(results, iteratesForward, start, end) { | ||
| if (!this.view) { | ||
| if (!this.attached) { | ||
| return; | ||
| } | ||
| this.view.gatherIterationResults(results, iteratesForward, start, end); | ||
| this.localCollection.gatherIterationResults(results, iteratesForward, start, end); | ||
| } | ||
| findOverlappingIntervals(startPosition, endPosition) { | ||
| return this.localCollection.findOverlappingIntervals(startPosition, endPosition); | ||
| } | ||
| map(fn) { | ||
| this.localCollection.map(fn); | ||
| } | ||
| previousInterval(pos) { | ||
| return this.localCollection.previousInterval(pos); | ||
| } | ||
| nextInterval(pos) { | ||
| return this.localCollection.nextInterval(pos); | ||
| } | ||
| on(event, listener) { | ||
| return super.on(event, listener); | ||
| } | ||
| } | ||
| //# sourceMappingURL=intervalCollection.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"intervalCollection.js","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+BAA+B;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AAyBxD,MAAM,OAAO,QAAQ;IAGjB,YACW,KAAa,EACb,GAAW,EAClB,KAA6B;QAFtB,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAQ;QAElB,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC7B;IACL,CAAC;IAEM,yBAAyB;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,cAAc,CAAC,KAA4B;QAC9C,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YAC7B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;SACtB;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,SAAS,CAAC,MAAwB;QACrC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,MAAM,EAAE;YACR,GAAG,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;SAChC;QAED,MAAM,kBAAkB,GAAwB;YAC5C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,GAAG;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,kBAAkB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;SACnD;QACD,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEM,KAAK;QACR,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;IAEM,OAAO,CAAC,CAAW;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,WAAW,KAAK,CAAC,EAAE;YACnB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC7B;aAAM;YACH,OAAO,WAAW,CAAC;SACtB;IACL,CAAC;IAEM,YAAY,CAAC,CAAW;QAC3B,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IAChC,CAAC;IAEM,UAAU,CAAC,CAAW;QACzB,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;IAC5B,CAAC;IAEM,QAAQ,CAAC,CAAW;QACvB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;YAC/B,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,CAAW;QACpB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAEM,aAAa;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAEM,aAAa,CAAC,QAA+B,EAAE,EAA2B;QAC7E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;CACJ;AAED,MAAM,OAAO,gBAAgB;IAIzB,YACW,KAA+B,EAC/B,GAA6B,EAC7B,YAAoC,EAC3C,KAA6B;QAHtB,UAAK,GAAL,KAAK,CAA0B;QAC/B,QAAG,GAAH,GAAG,CAA0B;QAC7B,iBAAY,GAAZ,YAAY,CAAwB;QAE3C,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC7B;IACL,CAAC;IAEM,SAAS,CAAC,MAAwB;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,kBAAkB,GAAwB;YAC5C,GAAG,EAAE,WAAW;YAChB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE;YACtC,KAAK,EAAE,aAAa;SACvB,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,kBAAkB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;SACnD;QACD,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEM,KAAK;QACR,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACzE,CAAC;IAEM,OAAO,CAAC,CAAmB;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,WAAW,KAAK,CAAC,EAAE;YACnB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC7B;aAAM;YACH,OAAO,WAAW,CAAC;SACtB;IACL,CAAC;IAEM,YAAY,CAAC,CAAmB;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,UAAU,CAAC,CAAmB;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEM,QAAQ,CAAC,CAAmB;QAC/B,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;SACjC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,CAAmB;QAC5B,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAC/C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAEM,aAAa,CAAC,QAA+B,EAAE,EAA2B;QAC7E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IAEM,WAAW,CAAC,MAAc,EAAE,IAAY;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAClD,CAAC;IAEO,aAAa,CAAC,CAAmB,EAAE,MAAe;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,WAAW,KAAK,MAAM,EAAE;YACxB,mCAAmC;YACnC,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7H,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;SAC7E;IACL,CAAC;CACJ;AAED,SAAS,uBAAuB,CAC5B,MAAwB,EACxB,GAAW,EACX,OAAgC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE;QAC1B,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1F,IAAI,OAAO,KAAK,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE;YAC/C,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SAClC;QACD,OAAO,IAAI,CAAC;KACf;IACD,OAAO,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,sBAAsB,CAC3B,KAAa,EACb,KAAa,EACb,GAAW,EACX,MAAwB,EACxB,YAAoC;IACpC,IAAI,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;IACtD,IAAI,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;IAClD,IAAI,YAAY,KAAK,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE;QAC9C,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC;QACjD,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC;KAChD;SAAM,IAAI,YAAY,KAAK,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE;QAC1D,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC;QACjD,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC;KAClD;IAED,sDAAsD;IACtD,IAAI,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,aAAa,EAAE;QACrD,YAAY,IAAI,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC;QACtD,UAAU,IAAI,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC;KACvD;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACjE,IAAI,SAAS,IAAI,OAAO,EAAE;QACtB,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC;QAC9B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAC9B,MAAM,SAAS,GAAG;YACd,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,CAAC;SAC9C,CAAC;QACF,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAEjC,MAAM,IAAI,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;KACf;AACL,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,CAAW,EAAE,CAAW;IACpE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAuD;IACvF,MAAM,OAAO,GAA+B;QACxC,WAAW,EAAE,mBAAmB;QAChC,MAAM,EAAE,cAAc;KACzB,CAAC;IACF,MAAM,EAAE,GAAG,IAAI,uBAAuB,CAAW,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,IAAI,QAAQ,EAAE;QACV,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;KACpC;SAAM;QACH,EAAE,CAAC,mBAAmB,CAAC,+BAA+B,CAAC,CAAC;KAC3D;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,OAAO,uBAAuB;IAMhC,YACqB,MAAwB,EACxB,KAAa,EACb,OAAoC;QAFpC,WAAM,GAAN,MAAM,CAAkB;QACxB,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAA6B;QARxC,iBAAY,GAAG,IAAI,SAAS,CAAC,YAAY,EAAa,CAAC;QASpE,IAAI,CAAC,eAAe;YAChB,6DAA6D;YAC7D,IAAI,SAAS,CAAC,YAAY,CAAuB,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9E,CAAC;IAEM,mBAAmB,CAAC,gBAA+D;QACtF,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,mBAAmB;YACpB,CAAC,GAAc,EAAE,UAAqB,EAAE,EAAE;gBACtC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACpD,OAAO;oBACH,IAAI,EAAE,IAAI;oBACV,GAAG,EAAE,IAAI;iBACZ,CAAC;YACN,CAAC,CAAC;IACV,CAAC;IAEM,GAAG,CAAC,EAAiC;QACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAEM,sBAAsB,CACzB,OAAoB,EACpB,eAAwB,EACxB,KAAc,EACd,GAAY;QACZ,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;YACvC,OAAO;SACV;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE;YAC1C,uEAAuE;YACvE,IAAI,eAAe,EAAE;gBACjB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,QAAmB,EAAE,EAAE;oBAC1C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,CAAC,CAAC,CAAC;aACN;iBACI;gBACD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,QAAmB,EAAE,EAAE;oBAClD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,CAAC,CAAC,CAAC;aACN;SACJ;aACI;YACD,MAAM,iBAAiB,GAAc,IAAI,CAAC,OAAO,CAAC,MAAM,CACpD,WAAW,EACX,KAAK,EACL,GAAG,EACH,IAAI,CAAC,MAAM,EACX,SAAS,CAAC,YAAY,CAAC,SAAS,CACnC,CAAC;YAEF,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,4EAA4E;gBAC5E,sFAAsF;gBACtF,IAAI,eAAe,EAAE;oBACjB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,QAAmB,EAAE,EAAE;wBAC1C,IAAI,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;4BAC9C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;yBAC1B;oBACL,CAAC,CAAC,CAAC;iBACN;qBACI;oBACD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,QAAmB,EAAE,EAAE;wBAClD,IAAI,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;4BAC9C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;yBAC1B;oBACL,CAAC,CAAC,CAAC;iBACN;aACJ;iBACI;gBACD,wEAAwE;gBACxE,uBAAuB;gBACvB,MAAM,SAAS,GACX,GAAG,KAAK,SAAS,CAAC,CAAC;oBACf,CAAC,IAAuC,EAAE,EAAE;wBACxC,OAAO,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACpD,CAAC,CAAC,CAAC;oBACH,CAAC,IAAuC,EAAE,EAAE;wBACxC,OAAO,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC/C,CAAC,CAAC;gBACV,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC7D,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC9D,MAAM,QAAQ,GAAG,CAAC,IAAuC,EAAE,EAAE;oBACzD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3B,CAAC,CAAC;gBAEF,IAAI,eAAe,EAAE;oBACjB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,uBAAuB,CAC/C,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CACvD,CAAC;iBACL;qBACI;oBACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,wBAAwB,CAChD,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CACvD,CAAC;iBACL;aACJ;SACJ;IACL,CAAC;IAEM,wBAAwB,CAAC,aAAqB,EAAE,WAAmB;QACtE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;YACxC,MAAM,iBAAiB,GACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,IAAI,CAAC,MAAM,EACX,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAE1C,MAAM,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC5E,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC3D;aAAM;YACH,OAAO,EAAE,CAAC;SACb;IACL,CAAC;IAEM,gBAAgB,CAAC,GAAW;QAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACzC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC7D,IAAI,MAAM,EAAE;YACR,OAAO,MAAM,CAAC,IAAI,CAAC;SACtB;IACL,CAAC;IAEM,YAAY,CAAC,GAAW;QAC3B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACzC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5D,IAAI,MAAM,EAAE;YACR,OAAO,MAAM,CAAC,IAAI,CAAC;SACtB;IACL,CAAC;IAEM,cAAc,CAAC,aAAqB,EAAE,WAAmB;QAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACzC,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5F,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC/C,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAEM,cAAc,CAAC,KAAa,EAAE,GAAW,EAAE,YAAoC;QAClF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClF,CAAC;IAED,oDAAoD;IAC7C,WAAW,CACd,KAAa,EACb,GAAW,EACX,YAAoC,EACpC,KAA6B;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAC/D,IAAI,QAAQ,EAAE;YACV,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;gBACvC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACxE;YACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACvD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;SAC1E;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,SAAS;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACrD,+DAA+D;QAC/D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;CACJ;AAED,MAAM,2BAA2B,GAAG,CAAC,CAAmB,EAAE,CAAmB,EAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE/G,MAAM,iCAAiC;IAE5B,IAAI,CACP,OAAwB,EACxB,MAA6B,EAAE;QAE/B,MAAM,OAAO,GAAuC;YAChD,WAAW,EAAE,2BAA2B;YACxC,MAAM,EAAE,sBAAsB;SACjC,CAAC;QACF,OAAO,IAAI,kBAAkB,CAAmB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAEM,KAAK,CAAC,KAA2C;QACpD,+DAA+D;QAC/D,OAAO,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACrC,CAAC;CACJ;AAED,MAAM,OAAO,mCAAmC;IAI5C,IAAW,IAAI;QACX,OAAO,mCAAmC,CAAC,IAAI,CAAC;IACpD,CAAC;IAED,IAAW,OAAO;QACd,OAAO,mCAAmC,CAAC,QAAQ,CAAC;IACxD,CAAC;IAED,IAAW,GAAG;QACV,OAAO,mCAAmC,CAAC,IAAI,CAAC;IACpD,CAAC;;AAZa,wCAAI,GAAG,gCAAgC,CAAC;AAc9B,4CAAQ,GAC5B,IAAI,iCAAiC,EAAE,CAAC;AAEpB,wCAAI,GACxB,IAAI,GAAG,CACH,CAAC;QACG,KAAK;QACL;YACI,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,sDAAsD;gBACtD,IAAI,KAAK,EAAE;oBACP,OAAO;iBACV;gBAED,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;SACJ;KACJ;IACD;QACI,QAAQ;QACR;YACI,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,IAAI,KAAK,EAAE;oBACP,OAAO;iBACV;gBACD,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC;SACJ;KACJ,CAAC,CAAC,CAAC;AAGhB,MAAM,mBAAmB,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AAExE,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,EAAE,MAAwB;IACvF,IAAI,SAAgC,CAAC;IACrC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;QAC7B,SAAS,GAAG;YACR,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,CAAC;SAC9C,CAAC;KACL;IACD,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,yBAAyB;IAEpB,IAAI,CAAC,OAAwB,EAAE,MAA6B,EAAE;QACjE,MAAM,OAAO,GAA+B;YACxC,WAAW,EAAE,mBAAmB;YAChC,MAAM,EAAE,cAAc;SACzB,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAW,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAClF,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,KAAmC;QAC5C,+DAA+D;QAC/D,OAAO,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACrC,CAAC;CACJ;AAED,MAAM,OAAO,2BAA2B;IAIpC,IAAW,IAAI;QACX,OAAO,2BAA2B,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED,IAAW,OAAO;QACd,OAAO,2BAA2B,CAAC,QAAQ,CAAC;IAChD,CAAC;IAED,IAAW,GAAG;QACV,OAAO,2BAA2B,CAAC,IAAI,CAAC;IAC5C,CAAC;;AAZa,gCAAI,GAAG,0BAA0B,CAAC;AAcxB,oCAAQ,GAC5B,IAAI,yBAAyB,EAAE,CAAC;AACZ,gCAAI,GACxB,IAAI,GAAG,CACH,CAAC;QACG,KAAK;QACL;YACI,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,sDAAsD;gBACtD,IAAI,KAAK,EAAE;oBACP,OAAO;iBACV;gBAED,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;SACJ;KACJ;IACD;QACI,QAAQ;QACR;YACI,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,IAAI,KAAK,EAAE;oBACP,OAAO;iBACV;gBACD,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC;SACJ;KACJ,CAAC,CAAC,CAAC;AAKhB,MAAM,OAAO,sBAAgE,SAAQ,YAAY;IAI7F,YACqB,MAAwB,EACzC,wBAA+C,EAC/C,KAAa,EACb,OAAoC,EACnB,OAAwB;QACzC,KAAK,EAAE,CAAC;QALS,WAAM,GAAN,MAAM,CAAkB;QAIxB,YAAO,GAAP,OAAO,CAAiB;QAGzC,yEAAyE;QACzE,IAAI,CAAC,eAAe,GAAG,IAAI,uBAAuB,CAAY,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACtF,IAAI,wBAAwB,EAAE;YAC1B,KAAK,MAAM,kBAAkB,IAAI,wBAAwB,EAAE;gBACvD,IAAI,CAAC,eAAe,CAAC,WAAW,CAC5B,kBAAkB,CAAC,KAAK,EACxB,kBAAkB,CAAC,GAAG,EACtB,kBAAkB,CAAC,YAAY,EAC/B,kBAAkB,CAAC,UAAU,CAAC,CAAC;aACtC;SACJ;IACL,CAAC;IAEM,kBAAkB,CAAC,aAAkC;QACxD,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAEM,mBAAmB,CAAC,gBAA+D;QACtF,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAEM,wBAAwB,CAAC,aAAqB,EAAE,WAAmB;QACtE,OAAO,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACrF,CAAC;IAEM,GAAG,CAAC,EAAiC;QACxC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAEM,sBAAsB,CACzB,OAAoB,EACpB,eAAwB,EACxB,KAAc,EACd,GAAY;QACZ,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IAEM,gBAAgB,CAAC,GAAW;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAEM,YAAY,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAEM,EAAE,CACL,KAAuC,EACvC,QAAgG;QAChG,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAEM,GAAG,CACN,KAAa,EACb,GAAW,EACX,YAAoC,EACpC,KAA6B;QAE7B,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;SACrC;QAED,MAAM,kBAAkB,GAAwB;YAC5C,GAAG;YACH,YAAY;YACZ,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,GAAG;YACnB,KAAK;SACR,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAEM,MAAM,CACT,KAAa,EACb,GAAW;QACX,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;SAChD;QAED,MAAM,kBAAkB,GAAwB;YAC5C,KAAK;YACL,GAAG;YACH,cAAc;YACd,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,SAAS;SACjD,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAED,oBAAoB;IACb,WAAW,CAAC,kBAAuC,EAAE,KAAc,EAAE,EAA6B;QACrG,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAC7C,kBAAkB,CAAC,KAAK,EACxB,kBAAkB,CAAC,GAAG,EACtB,kBAAkB,CAAC,YAAY,EAC/B,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEnC,IAAI,QAAQ,EAAE;YACV,+EAA+E;YAC/E,IAAI,KAAK,EAAE;gBACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;aAC3D;iBAAM;gBACH,IAAI,IAAI,CAAC,aAAa,EAAE;oBACpB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;iBAChC;aACJ;SACJ;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAE9C,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,cAAc,CAAC,kBAAuC,EAAE,KAAc,EAAE,EAA6B;QACxG,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAEvG,IAAI,QAAQ,EAAE;YACV,+EAA+E;YAC/E,IAAI,KAAK,EAAE;gBACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;aAC9D;iBAAM;gBACH,IAAI,IAAI,CAAC,aAAa,EAAE;oBACpB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;iBAChC;aACJ;SACJ;QAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAEjD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,iBAAiB;QACpB,+DAA+D;QAC/D,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;IAC5C,CAAC;IAEO,sBAAsB,CAAC,aAAmC;QAC9D,+DAA+D;QAC/D,IAAI,CAAC,aAAa,EAAE;YAChB,OAAO;SACV;QAED,uFAAuF;QACvF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,qEAAqE;QACrE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAClC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,MAAM,OAAO,0BAA0B;IAInC,YACI,UAAyC,EACzC,kBAA2B,IAAI,EAC/B,KAAc,EACd,GAAY;QACZ,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAEf,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAEM,IAAI;QACP,IAAI,MAA6B,CAAC;QAClC,IAAI,KAAK,GAAY,IAAI,CAAC;QAE1B,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAClC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACpC,KAAK,GAAG,KAAK,CAAC;SACjB;QAED,OAAO;YACH,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,KAAK;SACd,CAAC;IACN,CAAC;CACJ;AAED,MAAM,OAAO,kBAAkB;IAQ3B,YAA6B,OAAoC,EAAmB,cAAuB,EACtF,OAAwB,EACzC,mBAA0C;QAFjB,YAAO,GAAP,OAAO,CAA6B;QAAmB,mBAAc,GAAd,cAAc,CAAS;QACtF,YAAO,GAAP,OAAO,CAAiB;QAEzC,IAAI,CAAC,wBAAwB,GAAG,mBAAmB,CAAC;IACxD,CAAC;IARD,IAAW,QAAQ;QACf,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC;IAQM,WAAW,CAAC,MAAwB,EAAE,KAAa;QACtD,IAAI,IAAI,CAAC,IAAI,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;SACxD;QAED,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;SAC1D;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,sBAAsB,CAAY,MAAM,EACpD,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;IAC9C,CAAC;IAEM,GAAG,CACN,aAAqB,EACrB,WAAmB,EACnB,YAAoC,EACpC,KAA6B;QAE7B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;IAEM,MAAM,CACT,aAAqB,EACrB,WAAmB;QAEnB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;SACxE;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACjD,CAAC;IAEM,mBAAmB,CAAC,gBAA+D;QACtF,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,aAAmC;QACpD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC,CAAC;SAClG;QAED,2CAA2C;QAC3C,IAAI,aAAa,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;SAC/C;QAED,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAEM,WAAW,CACd,kBAAuC,EACvC,KAAc,EACd,EAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAEM,cAAc,CACjB,kBAAuC,EACvC,KAAc,EACd,EAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;SACxE;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEM,iBAAiB;QACpB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QAED,+DAA+D;QAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACzC,CAAC;IAEM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,sCAAsC,CAAC,aAAqB;QAC/D,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QACtF,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,uCAAuC,CAAC,aAAqB;QAChE,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QACvF,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,oCAAoC,CAAC,WAAmB;QAC3D,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC/F,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,qCAAqC,CAAC,WAAmB;QAC5D,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAChG,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,sBAAsB,CACzB,OAAoB,EACpB,eAAwB,EACxB,KAAc,EACd,GAAY;QACZ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,OAAO;SACV;QAED,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable no-bitwise */\n\nimport { EventEmitter } from \"events\";\nimport * as MergeTree from \"@fluidframework/merge-tree\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\n\nimport { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from \"./mapKernelInterfaces\";\n\nexport interface ISerializedInterval {\n sequenceNumber: number;\n start: number;\n end: number;\n intervalType: MergeTree.IntervalType;\n properties?: MergeTree.PropertySet;\n}\n\nexport interface ISerializableInterval extends MergeTree.IInterval {\n properties: MergeTree.PropertySet;\n serialize(client: MergeTree.Client);\n addProperties(props: MergeTree.PropertySet);\n}\n\nexport interface IIntervalHelpers<TInterval extends ISerializableInterval> {\n compareEnds(a: TInterval, b: TInterval): number;\n create(label: string, start: number, end: number,\n client: MergeTree.Client, intervalType?: MergeTree.IntervalType): TInterval;\n}\n\nexport class Interval implements ISerializableInterval {\n public properties: MergeTree.PropertySet;\n public auxProps: MergeTree.PropertySet[];\n constructor(\n public start: number,\n public end: number,\n props?: MergeTree.PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public getAdditionalPropertySets() {\n return this.auxProps;\n }\n\n public addPropertySet(props: MergeTree.PropertySet) {\n if (this.auxProps === undefined) {\n this.auxProps = [];\n }\n this.auxProps.push(props);\n }\n\n public serialize(client: MergeTree.Client) {\n let seq = 0;\n if (client) {\n seq = client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end: this.end,\n intervalType: 0,\n sequenceNumber: seq,\n start: this.start,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new Interval(this.start, this.end, this.properties);\n }\n\n public compare(b: Interval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n return this.compareEnd(b);\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: Interval) {\n return this.start - b.start;\n }\n\n public compareEnd(b: Interval) {\n return this.end - b.end;\n }\n\n public overlaps(b: Interval) {\n const result = (this.start < b.end) &&\n (this.end >= b.start);\n return result;\n }\n\n public union(b: Interval) {\n return new Interval(Math.min(this.start, b.start),\n Math.max(this.end, b.end), this.properties);\n }\n\n public getProperties() {\n return this.properties;\n }\n\n public addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp) {\n this.properties = MergeTree.addProperties(this.properties, newProps, op);\n }\n}\n\nexport class SequenceInterval implements ISerializableInterval {\n public properties: MergeTree.PropertySet;\n private readonly checkMergeTree: MergeTree.MergeTree;\n\n constructor(\n public start: MergeTree.LocalReference,\n public end: MergeTree.LocalReference,\n public intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public serialize(client: MergeTree.Client) {\n const startPosition = this.start.toPosition();\n const endPosition = this.end.toPosition();\n const serializedInterval: ISerializedInterval = {\n end: endPosition,\n intervalType: this.intervalType,\n sequenceNumber: client.getCurrentSeq(),\n start: startPosition,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new SequenceInterval(this.start, this.end, this.intervalType);\n }\n\n public compare(b: SequenceInterval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n return this.compareEnd(b);\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: SequenceInterval) {\n return this.start.compare(b.start);\n }\n\n public compareEnd(b: SequenceInterval) {\n return this.end.compare(b.end);\n }\n\n public overlaps(b: SequenceInterval) {\n const result = (this.start.compare(b.end) < 0) &&\n (this.end.compare(b.start) >= 0);\n if (this.checkMergeTree) {\n this.checkOverlaps(b, result);\n }\n return result;\n }\n\n public union(b: SequenceInterval) {\n return new SequenceInterval(this.start.min(b.start),\n this.end.max(b.end), this.intervalType);\n }\n\n public addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp) {\n this.properties = MergeTree.addProperties(this.properties, newProps, op);\n }\n\n public overlapsPos(bstart: number, bend: number) {\n const startPos = this.start.toPosition();\n const endPos = this.start.toPosition();\n return (endPos > bstart) && (startPos < bend);\n }\n\n private checkOverlaps(b: SequenceInterval, result: boolean) {\n const astart = this.start.toPosition();\n const bstart = b.start.toPosition();\n const aend = this.end.toPosition();\n const bend = b.end.toPosition();\n const checkResult = ((astart < bend) && (bstart < aend));\n if (checkResult !== result) {\n // eslint-disable-next-line max-len\n console.log(`check mismatch: res ${result} ${this.start.segment === b.end.segment} ${b.start.segment === this.end.segment}`);\n console.log(`as ${astart} ae ${aend} bs ${bstart} be ${bend}`);\n console.log(`as ${MergeTree.ordinalToArray(this.start.segment.ordinal)}@${this.start.offset}`);\n console.log(`ae ${MergeTree.ordinalToArray(this.end.segment.ordinal)}@${this.end.offset}`);\n console.log(`bs ${MergeTree.ordinalToArray(b.start.segment.ordinal)}@${b.start.offset}`);\n console.log(`be ${MergeTree.ordinalToArray(b.end.segment.ordinal)}@${b.end.offset}`);\n console.log(this.checkMergeTree.nodeToString(b.start.segment.parent, \"\"));\n }\n }\n}\n\nfunction createPositionReference(\n client: MergeTree.Client,\n pos: number,\n refType: MergeTree.ReferenceType): MergeTree.LocalReference {\n const segoff = client.getContainingSegment(pos);\n if (segoff && segoff.segment) {\n const lref = new MergeTree.LocalReference(client, segoff.segment, segoff.offset, refType);\n if (refType !== MergeTree.ReferenceType.Transient) {\n client.addLocalReference(lref);\n }\n return lref;\n }\n return new MergeTree.LocalReference(client, undefined);\n}\n\nfunction createSequenceInterval(\n label: string,\n start: number,\n end: number,\n client: MergeTree.Client,\n intervalType: MergeTree.IntervalType): SequenceInterval {\n let beginRefType = MergeTree.ReferenceType.RangeBegin;\n let endRefType = MergeTree.ReferenceType.RangeEnd;\n if (intervalType === MergeTree.IntervalType.Nest) {\n beginRefType = MergeTree.ReferenceType.NestBegin;\n endRefType = MergeTree.ReferenceType.NestEnd;\n } else if (intervalType === MergeTree.IntervalType.Transient) {\n beginRefType = MergeTree.ReferenceType.Transient;\n endRefType = MergeTree.ReferenceType.Transient;\n }\n\n // TODO: Should SlideOnRemove be the default behavior?\n if (intervalType & MergeTree.IntervalType.SlideOnRemove) {\n beginRefType |= MergeTree.ReferenceType.SlideOnRemove;\n endRefType |= MergeTree.ReferenceType.SlideOnRemove;\n }\n\n const startLref = createPositionReference(client, start, beginRefType);\n const endLref = createPositionReference(client, end, endRefType);\n if (startLref && endLref) {\n startLref.pairedRef = endLref;\n endLref.pairedRef = startLref;\n const rangeProp = {\n [MergeTree.reservedRangeLabelsKey]: [label],\n };\n startLref.addProperties(rangeProp);\n endLref.addProperties(rangeProp);\n\n const ival = new SequenceInterval(startLref, endLref, intervalType, rangeProp);\n return ival;\n }\n}\n\nexport function defaultIntervalConflictResolver(a: Interval, b: Interval) {\n a.addPropertySet(b.properties);\n return a;\n}\n\nexport function createIntervalIndex(conflict?: MergeTree.IntervalConflictResolver<Interval>) {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const lc = new LocalIntervalCollection<Interval>(undefined, \"\", helpers);\n if (conflict) {\n lc.addConflictResolver(conflict);\n } else {\n lc.addConflictResolver(defaultIntervalConflictResolver);\n }\n return lc;\n}\n\nexport class LocalIntervalCollection<TInterval extends ISerializableInterval> {\n private readonly intervalTree = new MergeTree.IntervalTree<TInterval>();\n private readonly endIntervalTree: MergeTree.RedBlackTree<TInterval, TInterval>;\n private conflictResolver: MergeTree.IntervalConflictResolver<TInterval>;\n private endConflictResolver: MergeTree.ConflictAction<TInterval, TInterval>;\n\n constructor(\n private readonly client: MergeTree.Client,\n private readonly label: string,\n private readonly helpers: IIntervalHelpers<TInterval>) {\n this.endIntervalTree =\n // eslint-disable-next-line @typescript-eslint/unbound-method\n new MergeTree.RedBlackTree<TInterval, TInterval>(helpers.compareEnds);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>) {\n this.conflictResolver = conflictResolver;\n this.endConflictResolver =\n (key: TInterval, currentKey: TInterval) => {\n const ival = this.conflictResolver(key, currentKey);\n return {\n data: ival,\n key: ival,\n };\n };\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.intervalTree.map(fn);\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (this.intervalTree.intervals.isEmpty()) {\n return;\n }\n\n if (start === undefined && end === undefined) {\n // No start/end provided. Gather the whole tree in the specified order.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n results.push(interval);\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n results.push(interval);\n });\n }\n }\n else {\n const transientInterval: TInterval = this.helpers.create(\n \"transient\",\n start,\n end,\n this.client,\n MergeTree.IntervalType.Transient,\n );\n\n if (start === undefined) {\n // Only end position provided. Since the tree is not sorted by end position,\n // walk the whole tree in the specified order, gathering intervals that match the end.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n }\n else {\n // Start and (possibly) end provided. Walk the subtrees that may contain\n // this start position.\n const compareFn =\n end === undefined ?\n (node: MergeTree.IntervalNode<TInterval>) => {\n return transientInterval.compareStart(node.key);\n } :\n (node: MergeTree.IntervalNode<TInterval>) => {\n return transientInterval.compare(node.key);\n };\n const continueLeftFn = (cmpResult: number) => cmpResult <= 0;\n const continueRightFn = (cmpResult: number) => cmpResult >= 0;\n const actionFn = (node: MergeTree.IntervalNode<TInterval>) => {\n results.push(node.key);\n };\n\n if (iteratesForward) {\n this.intervalTree.intervals.walkExactMatchesForward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n else {\n this.intervalTree.intervals.walkExactMatchesBackward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n }\n }\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number) {\n if (!this.intervalTree.intervals.isEmpty()) {\n const transientInterval =\n this.helpers.create(\n \"transient\",\n startPosition,\n endPosition,\n this.client,\n MergeTree.IntervalType.Transient);\n\n const overlappingIntervalNodes = this.intervalTree.match(transientInterval);\n return overlappingIntervalNodes.map((node) => node.key);\n } else {\n return [];\n }\n }\n\n public previousInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, MergeTree.IntervalType.Transient);\n const rbNode = this.endIntervalTree.floor(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public nextInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, MergeTree.IntervalType.Transient);\n const rbNode = this.endIntervalTree.ceil(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public removeInterval(startPosition: number, endPosition: number) {\n const transientInterval = this.helpers.create(\n \"transient\", startPosition, endPosition, this.client, MergeTree.IntervalType.Transient);\n this.intervalTree.remove(transientInterval);\n this.endIntervalTree.remove(transientInterval);\n return transientInterval;\n }\n\n public createInterval(start: number, end: number, intervalType: MergeTree.IntervalType) {\n return this.helpers.create(this.label, start, end, this.client, intervalType);\n }\n\n // TODO: remove interval, handle duplicate intervals\n public addInterval(\n start: number,\n end: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet) {\n const interval = this.createInterval(start, end, intervalType);\n if (interval) {\n interval.addProperties(props);\n if (this.label && (this.label.length > 0)) {\n interval.properties[MergeTree.reservedRangeLabelsKey] = [this.label];\n }\n this.intervalTree.put(interval, this.conflictResolver);\n this.endIntervalTree.put(interval, interval, this.endConflictResolver);\n }\n return interval;\n }\n\n public serialize() {\n const client = this.client;\n const intervals = this.intervalTree.intervals.keys();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return intervals.map((interval) => interval.serialize(client));\n }\n}\n\nconst compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInterval): number => a.end.compare(b.end);\n\nclass SequenceIntervalCollectionFactory\n implements IValueFactory<IntervalCollection<SequenceInterval>> {\n public load(\n emitter: IValueOpEmitter,\n raw: ISerializedInterval[] = [],\n ): IntervalCollection<SequenceInterval> {\n const helpers: IIntervalHelpers<SequenceInterval> = {\n compareEnds: compareSequenceIntervalEnds,\n create: createSequenceInterval,\n };\n return new IntervalCollection<SequenceInterval>(helpers, true, emitter, raw);\n }\n\n public store(value: IntervalCollection<SequenceInterval>): ISerializedInterval[] {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value.serializeInternal();\n }\n}\n\nexport class SequenceIntervalCollectionValueType\n implements IValueType<IntervalCollection<SequenceInterval>> {\n public static Name = \"sharedStringIntervalCollection\";\n\n public get name(): string {\n return SequenceIntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<SequenceInterval>> {\n return SequenceIntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> {\n return SequenceIntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<SequenceInterval>> =\n new SequenceIntervalCollectionFactory();\n\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> =\n new Map<string, IValueOperation<IntervalCollection<SequenceInterval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ]]);\n}\n\nconst compareIntervalEnds = (a: Interval, b: Interval) => a.end - b.end;\n\nfunction createInterval(label: string, start: number, end: number, client: MergeTree.Client): Interval {\n let rangeProp: MergeTree.PropertySet;\n if (label && (label.length > 0)) {\n rangeProp = {\n [MergeTree.reservedRangeLabelsKey]: [label],\n };\n }\n return new Interval(start, end, rangeProp);\n}\n\nclass IntervalCollectionFactory\n implements IValueFactory<IntervalCollection<Interval>> {\n public load(emitter: IValueOpEmitter, raw: ISerializedInterval[] = []): IntervalCollection<Interval> {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const collection = new IntervalCollection<Interval>(helpers, false, emitter, raw);\n collection.attachGraph(undefined, \"\");\n return collection;\n }\n\n public store(value: IntervalCollection<Interval>): ISerializedInterval[] {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value.serializeInternal();\n }\n}\n\nexport class IntervalCollectionValueType\n implements IValueType<IntervalCollection<Interval>> {\n public static Name = \"sharedIntervalCollection\";\n\n public get name(): string {\n return IntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<Interval>> {\n return IntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<Interval>>> {\n return IntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<Interval>> =\n new IntervalCollectionFactory();\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<Interval>>> =\n new Map<string, IValueOperation<IntervalCollection<Interval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ]]);\n}\n\nexport type DeserializeCallback = (properties: MergeTree.PropertySet) => void;\n\nexport class IntervalCollectionView<TInterval extends ISerializableInterval> extends EventEmitter {\n private readonly localCollection: LocalIntervalCollection<TInterval>;\n private onDeserialize: DeserializeCallback;\n\n constructor(\n private readonly client: MergeTree.Client,\n savedSerializedIntervals: ISerializedInterval[],\n label: string,\n helpers: IIntervalHelpers<TInterval>,\n private readonly emitter: IValueOpEmitter) {\n super();\n\n // Instantiate the local interval collection based on the saved intervals\n this.localCollection = new LocalIntervalCollection<TInterval>(client, label, helpers);\n if (savedSerializedIntervals) {\n for (const serializedInterval of savedSerializedIntervals) {\n this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n }\n }\n }\n\n public attachDeserializer(onDeserialize: DeserializeCallback): void {\n this.attachDeserializerCore(onDeserialize);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void {\n this.localCollection.addConflictResolver(conflictResolver);\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[] {\n return this.localCollection.findOverlappingIntervals(startPosition, endPosition);\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.localCollection.map(fn);\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n this.localCollection.gatherIterationResults(results, iteratesForward, start, end);\n }\n\n public previousInterval(pos: number): TInterval {\n return this.localCollection.previousInterval(pos);\n }\n\n public nextInterval(pos: number): TInterval {\n return this.localCollection.nextInterval(pos);\n }\n\n public on(\n event: \"addInterval\" | \"deleteInterval\",\n listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this {\n return super.on(event, listener);\n }\n\n public add(\n start: number,\n end: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet,\n ) {\n let seq = 0;\n if (this.client) {\n seq = this.client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end,\n intervalType,\n properties: props,\n sequenceNumber: seq,\n start,\n };\n\n return this.addInternal(serializedInterval, true, undefined);\n }\n\n public delete(\n start: number,\n end: number) {\n let sequenceNumber = 0;\n if (this.client) {\n sequenceNumber = this.client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n start,\n end,\n sequenceNumber,\n intervalType: MergeTree.IntervalType.Transient,\n };\n\n this.deleteInterval(serializedInterval, true, undefined);\n }\n\n // TODO: error cases\n public addInternal(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) {\n const interval = this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"add\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"addInterval\", interval, local, op);\n\n return interval;\n }\n\n public deleteInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) {\n const interval = this.localCollection.removeInterval(serializedInterval.start, serializedInterval.end);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"delete\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"deleteInterval\", interval, local, op);\n\n return this;\n }\n\n public serializeInternal() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.localCollection.serialize();\n }\n\n private attachDeserializerCore(onDeserialize?: DeserializeCallback): void {\n // If no deserializer is specified can skip all processing work\n if (!onDeserialize) {\n return;\n }\n\n // Start by storing the callbacks so that any subsequent modifications make use of them\n this.onDeserialize = onDeserialize;\n\n // Trigger the async prepare work across all values in the collection\n this.localCollection.map((interval) => {\n this.onDeserialize(interval);\n });\n }\n}\n\nexport class IntervalCollectionIterator<TInterval extends ISerializableInterval> {\n private readonly results: TInterval[];\n private index: number;\n\n constructor(\n collection: IntervalCollection<TInterval>,\n iteratesForward: boolean = true,\n start?: number,\n end?: number) {\n this.results = [];\n this.index = 0;\n\n collection.gatherIterationResults(this.results, iteratesForward, start, end);\n }\n\n public next() {\n let _value: TInterval | undefined;\n let _done: boolean = true;\n\n if (this.index < this.results.length) {\n _value = this.results[this.index++];\n _done = false;\n }\n\n return {\n value: _value,\n done: _done,\n };\n }\n}\n\nexport class IntervalCollection<TInterval extends ISerializableInterval> {\n private savedSerializedIntervals?: ISerializedInterval[];\n private view: IntervalCollectionView<TInterval>;\n\n public get attached(): boolean {\n return !!this.view;\n }\n\n constructor(private readonly helpers: IIntervalHelpers<TInterval>, private readonly requiresClient: boolean,\n private readonly emitter: IValueOpEmitter,\n serializedIntervals: ISerializedInterval[]) {\n this.savedSerializedIntervals = serializedIntervals;\n }\n\n public attachGraph(client: MergeTree.Client, label: string) {\n if (this.view) {\n throw new Error(\"Only supports one Sequence attach\");\n }\n\n if ((client === undefined) && (this.requiresClient)) {\n throw new Error(\"Client required for this collection\");\n }\n\n this.view = new IntervalCollectionView<TInterval>(client,\n this.savedSerializedIntervals, label, this.helpers, this.emitter);\n this.savedSerializedIntervals = undefined;\n }\n\n public add(\n startPosition: number,\n endPosition: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet,\n ) {\n if (!this.view) {\n throw new Error(\"attach must be called prior to adding intervals\");\n }\n\n return this.view.add(startPosition, endPosition, intervalType, props);\n }\n\n public delete(\n startPosition: number,\n endPosition: number,\n ) {\n if (!this.view) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n\n this.view.delete(startPosition, endPosition);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void {\n this.view.addConflictResolver(conflictResolver);\n }\n\n public async getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollectionView<TInterval>> {\n if (!this.view) {\n return Promise.reject(new Error(\"attachSequence must be called prior to retrieving the view\"));\n }\n\n // Attach custom deserializers if specified\n if (onDeserialize) {\n this.view.attachDeserializer(onDeserialize);\n }\n\n return this.view;\n }\n\n public addInternal(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage) {\n if (!this.view) {\n throw new Error(\"attachSequence must be called\");\n }\n\n return this.view.addInternal(serializedInterval, local, op);\n }\n\n public deleteInterval(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage): void {\n if (!this.view) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n this.view.deleteInterval(serializedInterval, local, op);\n }\n\n public serializeInternal() {\n if (!this.view) {\n throw new Error(\"attachSequence must be called\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.view.serializeInternal();\n }\n\n public [Symbol.iterator](): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this);\n return iterator;\n }\n\n public CreateForwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, startPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, startPosition);\n return iterator;\n }\n\n public CreateForwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, undefined, endPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, undefined, endPosition);\n return iterator;\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (!this.view) {\n return;\n }\n\n this.view.gatherIterationResults(results, iteratesForward, start, end);\n }\n}\n"]} | ||
| {"version":3,"file":"intervalCollection.js","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+BAA+B;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAGlC,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAsBlD,MAAM,OAAO,QAAQ;IAGjB,YACW,KAAa,EACb,GAAW,EAClB,KAA6B;QAFtB,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAQ;QAElB,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC7B;IACL,CAAC;IAEM,aAAa;;QAChB,OAAO,YAAA,IAAI,CAAC,UAAU,0CAAG,qBAAqB,2CAAG,QAAQ,EAAwB,CAAC;IACtF,CAAC;IAEM,yBAAyB;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,cAAc,CAAC,KAA4B;QAC9C,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YAC7B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;SACtB;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,SAAS,CAAC,MAAwB;QACrC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,MAAM,EAAE;YACR,GAAG,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;SAChC;QAED,MAAM,kBAAkB,GAAwB;YAC5C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,GAAG;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,kBAAkB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;SACnD;QACD,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEM,KAAK;QACR,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;IAEM,OAAO,CAAC,CAAW;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,WAAW,KAAK,CAAC,EAAE;YACnB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC7B;aAAM;YACH,OAAO,WAAW,CAAC;SACtB;IACL,CAAC;IAEM,YAAY,CAAC,CAAW;QAC3B,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IAChC,CAAC;IAEM,UAAU,CAAC,CAAW;QACzB,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;IAC5B,CAAC;IAEM,QAAQ,CAAC,CAAW;QACvB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;YAC/B,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,CAAW;QACpB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAEM,aAAa;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAEM,aAAa,CAAC,QAA+B,EAAE,EAA2B;QAC7E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;CACJ;AAED,MAAM,OAAO,gBAAgB;IAIzB,YACW,KAA+B,EAC/B,GAA6B,EAC7B,YAAoC,EAC3C,KAA6B;QAHtB,UAAK,GAAL,KAAK,CAA0B;QAC/B,QAAG,GAAH,GAAG,CAA0B;QAC7B,iBAAY,GAAZ,YAAY,CAAwB;QAE3C,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC7B;IACL,CAAC;IAEM,SAAS,CAAC,MAAwB;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,kBAAkB,GAAwB;YAC5C,GAAG,EAAE,WAAW;YAChB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE;YACtC,KAAK,EAAE,aAAa;SACvB,CAAC;QACF,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,kBAAkB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;SACnD;QACD,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEM,KAAK;QACR,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACzE,CAAC;IAEM,OAAO,CAAC,CAAmB;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,WAAW,KAAK,CAAC,EAAE;YACnB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC7B;aAAM;YACH,OAAO,WAAW,CAAC;SACtB;IACL,CAAC;IAEM,YAAY,CAAC,CAAmB;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEM,UAAU,CAAC,CAAmB;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAEM,QAAQ,CAAC,CAAmB;QAC/B,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;SACjC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,aAAa;;QAChB,OAAO,YAAA,IAAI,CAAC,UAAU,0CAAG,qBAAqB,2CAAG,QAAQ,EAAwB,CAAC;IACtF,CAAC;IAEM,KAAK,CAAC,CAAmB;QAC5B,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAC/C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAEM,aAAa,CAAC,QAA+B,EAAE,EAA2B;QAC7E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IAEM,WAAW,CAAC,MAAc,EAAE,IAAY;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAClD,CAAC;IAEO,aAAa,CAAC,CAAmB,EAAE,MAAe;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,WAAW,KAAK,MAAM,EAAE;YACxB,mCAAmC;YACnC,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7H,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;SAC7E;IACL,CAAC;CACJ;AAED,SAAS,uBAAuB,CAC5B,MAAwB,EACxB,GAAW,EACX,OAAgC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE;QAC1B,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1F,IAAI,OAAO,KAAK,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE;YAC/C,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SAClC;QACD,OAAO,IAAI,CAAC;KACf;IACD,OAAO,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,sBAAsB,CAC3B,KAAa,EACb,KAAa,EACb,GAAW,EACX,MAAwB,EACxB,YAAoC;IACpC,IAAI,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;IACtD,IAAI,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;IAClD,IAAI,YAAY,KAAK,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE;QAC9C,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC;QACjD,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC;KAChD;SAAM,IAAI,YAAY,KAAK,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE;QAC1D,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC;QACjD,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC;KAClD;IAED,sDAAsD;IACtD,IAAI,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,aAAa,EAAE;QACrD,YAAY,IAAI,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC;QACtD,UAAU,IAAI,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC;KACvD;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACjE,IAAI,SAAS,IAAI,OAAO,EAAE;QACtB,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC;QAC9B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAC9B,MAAM,SAAS,GAAG;YACd,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,CAAC;SAC9C,CAAC;QACF,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAEjC,MAAM,IAAI,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;KACf;AACL,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,CAAW,EAAE,CAAW;IACpE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAuD;IACvF,MAAM,OAAO,GAA+B;QACxC,WAAW,EAAE,mBAAmB;QAChC,MAAM,EAAE,cAAc;KACzB,CAAC;IACF,MAAM,EAAE,GAAG,IAAI,uBAAuB,CAAW,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,IAAI,QAAQ,EAAE;QACV,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;KACpC;SAAM;QACH,EAAE,CAAC,mBAAmB,CAAC,+BAA+B,CAAC,CAAC;KAC3D;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,OAAO,uBAAuB;IAMhC,YACqB,MAAwB,EACxB,KAAa,EACb,OAAoC;QAFpC,WAAM,GAAN,MAAM,CAAkB;QACxB,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAA6B;QARxC,iBAAY,GAAG,IAAI,SAAS,CAAC,YAAY,EAAa,CAAC;QASpE,IAAI,CAAC,eAAe;YAChB,6DAA6D;YAC7D,IAAI,SAAS,CAAC,YAAY,CAAuB,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9E,CAAC;IAEM,mBAAmB,CAAC,gBAA+D;QACtF,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,mBAAmB;YACpB,CAAC,GAAc,EAAE,UAAqB,EAAE,EAAE;gBACtC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACpD,OAAO;oBACH,IAAI,EAAE,IAAI;oBACV,GAAG,EAAE,IAAI;iBACZ,CAAC;YACN,CAAC,CAAC;IACV,CAAC;IAEM,GAAG,CAAC,EAAiC;QACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAEM,cAAc,CAAC,KAAa,EAAE,GAAW;QAC5C,sGAAsG;QACtG,gBAAgB;QAChB,OAAO,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;IAC7B,CAAC;IAEM,kBAAkB,CAAC,kBAAuC;;QAC7D,IAAI,OAAA,kBAAkB,CAAC,UAAU,0CAAG,qBAAqB,OAAM,SAAS,EAAE;YACtE,+FAA+F;YAC/F,sEAAsE;YACtE,kBAAkB,CAAC,UAAU,GAAG,SAAS,CAAC,aAAa,CACnD,kBAAkB,CAAC,UAAU,EAC7B;gBACI,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC;aACjG,CACJ,CAAC;SACL;IACL,CAAC;IAEM,sBAAsB,CACzB,OAAoB,EACpB,eAAwB,EACxB,KAAc,EACd,GAAY;QACZ,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;YACvC,OAAO;SACV;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE;YAC1C,uEAAuE;YACvE,IAAI,eAAe,EAAE;gBACjB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,QAAmB,EAAE,EAAE;oBAC1C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,CAAC,CAAC,CAAC;aACN;iBACI;gBACD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,QAAmB,EAAE,EAAE;oBAClD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,CAAC,CAAC,CAAC;aACN;SACJ;aACI;YACD,MAAM,iBAAiB,GAAc,IAAI,CAAC,OAAO,CAAC,MAAM,CACpD,WAAW,EACX,KAAK,EACL,GAAG,EACH,IAAI,CAAC,MAAM,EACX,SAAS,CAAC,YAAY,CAAC,SAAS,CACnC,CAAC;YAEF,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,4EAA4E;gBAC5E,sFAAsF;gBACtF,IAAI,eAAe,EAAE;oBACjB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,QAAmB,EAAE,EAAE;wBAC1C,IAAI,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;4BAC9C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;yBAC1B;oBACL,CAAC,CAAC,CAAC;iBACN;qBACI;oBACD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,QAAmB,EAAE,EAAE;wBAClD,IAAI,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;4BAC9C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;yBAC1B;oBACL,CAAC,CAAC,CAAC;iBACN;aACJ;iBACI;gBACD,wEAAwE;gBACxE,uBAAuB;gBACvB,MAAM,SAAS,GACX,GAAG,KAAK,SAAS,CAAC,CAAC;oBACf,CAAC,IAAuC,EAAE,EAAE;wBACxC,OAAO,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACpD,CAAC,CAAC,CAAC;oBACH,CAAC,IAAuC,EAAE,EAAE;wBACxC,OAAO,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC/C,CAAC,CAAC;gBACV,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC7D,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC9D,MAAM,QAAQ,GAAG,CAAC,IAAuC,EAAE,EAAE;oBACzD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3B,CAAC,CAAC;gBAEF,IAAI,eAAe,EAAE;oBACjB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,uBAAuB,CAC/C,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CACvD,CAAC;iBACL;qBACI;oBACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,wBAAwB,CAChD,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CACvD,CAAC;iBACL;aACJ;SACJ;IACL,CAAC;IAEM,wBAAwB,CAAC,aAAqB,EAAE,WAAmB;QACtE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;YACxC,MAAM,iBAAiB,GACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,IAAI,CAAC,MAAM,EACX,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAE1C,MAAM,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC5E,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC3D;aAAM;YACH,OAAO,EAAE,CAAC;SACb;IACL,CAAC;IAEM,gBAAgB,CAAC,GAAW;QAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACzC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC7D,IAAI,MAAM,EAAE;YACR,OAAO,MAAM,CAAC,IAAI,CAAC;SACtB;IACL,CAAC;IAEM,YAAY,CAAC,GAAW;QAC3B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACzC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5D,IAAI,MAAM,EAAE;YACR,OAAO,MAAM,CAAC,IAAI,CAAC;SACtB;IACL,CAAC;IAEM,cAAc,CAAC,aAAqB,EAAE,WAAmB;QAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACzC,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5F,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC/C,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAEM,cAAc,CAAC,KAAa,EAAE,GAAW,EAAE,YAAoC;QAClF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClF,CAAC;IAED,oDAAoD;IAC7C,WAAW,CACd,KAAa,EACb,GAAW,EACX,YAAoC,EACpC,KAA6B;QAC7B,MAAM,QAAQ,GAAc,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAC1E,IAAI,QAAQ,EAAE;YACV,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;gBACvC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACxE;YACD,IAAI,QAAQ,CAAC,UAAU,CAAC,qBAAqB,CAAC,KAAK,SAAS,EAAE;gBAC1D,QAAQ,CAAC,UAAU,CAAC,qBAAqB,CAAC,GAAG,IAAI,EAAE,CAAC;aACvD;YACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACvD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;SAC1E;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,SAAS;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACrD,+DAA+D;QAC/D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;CACJ;AAED,MAAM,2BAA2B,GAAG,CAAC,CAAmB,EAAE,CAAmB,EAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE/G,MAAM,iCAAiC;IAE5B,IAAI,CACP,OAAwB,EACxB,MAA6B,EAAE;QAE/B,MAAM,OAAO,GAAuC;YAChD,WAAW,EAAE,2BAA2B;YACxC,MAAM,EAAE,sBAAsB;SACjC,CAAC;QACF,OAAO,IAAI,kBAAkB,CAAmB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAEM,KAAK,CAAC,KAA2C;QACpD,+DAA+D;QAC/D,OAAO,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACrC,CAAC;CACJ;AAED,MAAM,OAAO,mCAAmC;IAI5C,IAAW,IAAI;QACX,OAAO,mCAAmC,CAAC,IAAI,CAAC;IACpD,CAAC;IAED,IAAW,OAAO;QACd,OAAO,mCAAmC,CAAC,QAAQ,CAAC;IACxD,CAAC;IAED,IAAW,GAAG;QACV,OAAO,mCAAmC,CAAC,IAAI,CAAC;IACpD,CAAC;;AAZa,wCAAI,GAAG,gCAAgC,CAAC;AAc9B,4CAAQ,GAC5B,IAAI,iCAAiC,EAAE,CAAC;AAEpB,wCAAI,GACxB,IAAI,GAAG,CACH,CAAC;QACG,KAAK;QACL;YACI,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,sDAAsD;gBACtD,IAAI,KAAK,EAAE;oBACP,OAAO;iBACV;gBAED,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;SACJ;KACJ;IACD;QACI,QAAQ;QACR;YACI,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,IAAI,KAAK,EAAE;oBACP,OAAO;iBACV;gBACD,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC;SACJ;KACJ,CAAC,CAAC,CAAC;AAGhB,MAAM,mBAAmB,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AAExE,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,EAAE,MAAwB;IACvF,IAAI,SAAgC,CAAC;IACrC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;QAC7B,SAAS,GAAG;YACR,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,CAAC;SAC9C,CAAC;KACL;IACD,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,yBAAyB;IAEpB,IAAI,CAAC,OAAwB,EAAE,MAA6B,EAAE;QACjE,MAAM,OAAO,GAA+B;YACxC,WAAW,EAAE,mBAAmB;YAChC,MAAM,EAAE,cAAc;SACzB,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAW,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAClF,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,KAAmC;QAC5C,+DAA+D;QAC/D,OAAO,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACrC,CAAC;CACJ;AAED,MAAM,OAAO,2BAA2B;IAIpC,IAAW,IAAI;QACX,OAAO,2BAA2B,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED,IAAW,OAAO;QACd,OAAO,2BAA2B,CAAC,QAAQ,CAAC;IAChD,CAAC;IAED,IAAW,GAAG;QACV,OAAO,2BAA2B,CAAC,IAAI,CAAC;IAC5C,CAAC;;AAZa,gCAAI,GAAG,0BAA0B,CAAC;AAcxB,oCAAQ,GAC5B,IAAI,yBAAyB,EAAE,CAAC;AACZ,gCAAI,GACxB,IAAI,GAAG,CACH,CAAC;QACG,KAAK;QACL;YACI,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,sDAAsD;gBACtD,IAAI,KAAK,EAAE;oBACP,OAAO;iBACV;gBAED,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;SACJ;KACJ;IACD;QACI,QAAQ;QACR;YACI,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,IAAI,KAAK,EAAE;oBACP,OAAO;iBACV;gBACD,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC;SACJ;KACJ,CAAC,CAAC,CAAC;AAKhB,MAAM,OAAO,0BAA0B;IAInC,YACI,UAAyC,EACzC,kBAA2B,IAAI,EAC/B,KAAc,EACd,GAAY;QACZ,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAEf,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAEM,IAAI;QACP,IAAI,MAA6B,CAAC;QAClC,IAAI,KAAK,GAAY,IAAI,CAAC;QAE1B,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAClC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACpC,KAAK,GAAG,KAAK,CAAC;SACjB;QAED,OAAO;YACH,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,KAAK;SACd,CAAC;IACN,CAAC;CACJ;AAED,MAAM,OAAO,kBAA4D,SAAQ,YAAY;IAWzF,YAA6B,OAAoC,EAAmB,cAAuB,EACtF,OAAwB,EACzC,mBAA0C;QAC1C,KAAK,EAAE,CAAC;QAHiB,YAAO,GAAP,OAAO,CAA6B;QAAmB,mBAAc,GAAd,cAAc,CAAS;QACtF,YAAO,GAAP,OAAO,CAAiB;QAGzC,IAAI,CAAC,wBAAwB,GAAG,mBAAmB,CAAC;IACxD,CAAC;IAVD,IAAW,QAAQ;QACf,sBAAsB;QACtB,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IAClC,CAAC;IASM,WAAW,CAAC,MAAwB,EAAE,KAAa;QACtD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;SACxD;QAED,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;SAC1D;QAED,yEAAyE;QACzE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,IAAI,uBAAuB,CAAY,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3F,IAAI,IAAI,CAAC,wBAAwB,EAAE;YAC/B,KAAK,MAAM,kBAAkB,IAAI,IAAI,CAAC,wBAAwB,EAAE;gBAC5D,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;gBAC5D,IAAI,CAAC,eAAe,CAAC,WAAW,CAC5B,kBAAkB,CAAC,KAAK,EACxB,kBAAkB,CAAC,GAAG,EACtB,kBAAkB,CAAC,YAAY,EAC/B,kBAAkB,CAAC,UAAU,CAAC,CAAC;aACtC;SACJ;QACD,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;IAC9C,CAAC;IAEM,GAAG,CACN,KAAa,EACb,GAAW,EACX,YAAoC,EACpC,KAA6B;QAE7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;QAED,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;SACrC;QAED,MAAM,kBAAkB,GAAwB;YAC5C,GAAG;YACH,YAAY;YACZ,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,GAAG;YACnB,KAAK;SACR,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAEM,MAAM,CACT,KAAa,EACb,GAAW;QAEX,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;SACxE;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;SAChD;QAED,MAAM,kBAAkB,GAAwB;YAC5C,KAAK;YACL,GAAG;YACH,cAAc;YACd,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,SAAS;SACjD,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAEM,mBAAmB,CAAC,gBAA+D;QACtF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QACD,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAEM,kBAAkB,CAAC,aAAkC;QACxD,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAEO,sBAAsB,CAAC,aAAmC;QAC9D,+DAA+D;QAC/D,IAAI,CAAC,aAAa,EAAE;YAChB,OAAO;SACV;QAED,uFAAuF;QACvF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,qEAAqE;QACrE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAClC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAO,CAAC,aAAmC;QACpD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC,CAAC;SAClG;QAED,2CAA2C;QAC3C,IAAI,aAAa,EAAE;YACf,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;SAC1C;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,WAAW,CACd,kBAAuC,EACvC,KAAc,EACd,EAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QAED,IAAI,CAAC,KAAK,EAAE;YACR,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;SAC/D;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAC7C,kBAAkB,CAAC,KAAK,EACxB,kBAAkB,CAAC,GAAG,EACtB,kBAAkB,CAAC,YAAY,EAC/B,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEnC,IAAI,QAAQ,EAAE;YACV,+EAA+E;YAC/E,IAAI,KAAK,EAAE;gBACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;aAC3D;iBAAM;gBACH,IAAI,IAAI,CAAC,aAAa,EAAE;oBACpB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;iBAChC;aACJ;SACJ;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAE9C,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,cAAc,CACjB,kBAAuC,EACvC,KAAc,EACd,EAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;SACxE;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAEvG,IAAI,QAAQ,EAAE;YACV,+EAA+E;YAC/E,IAAI,KAAK,EAAE;gBACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;aAC9D;iBAAM;gBACH,IAAI,IAAI,CAAC,aAAa,EAAE;oBACpB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;iBAChC;aACJ;SACJ;QAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAEM,iBAAiB;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACpD;QAED,+DAA+D;QAC/D,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;IAC5C,CAAC;IAEM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,sCAAsC,CAAC,aAAqB;QAC/D,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QACtF,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,uCAAuC,CAAC,aAAqB;QAChE,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QACvF,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,oCAAoC,CAAC,WAAmB;QAC3D,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC/F,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,qCAAqC,CAAC,WAAmB;QAC5D,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAY,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAChG,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,sBAAsB,CACzB,OAAoB,EACpB,eAAwB,EACxB,KAAc,EACd,GAAY;QACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,OAAO;SACV;QAED,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IAEM,wBAAwB,CAAC,aAAqB,EAAE,WAAmB;QACtE,OAAO,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACrF,CAAC;IAEM,GAAG,CAAC,EAAiC;QACxC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAEM,gBAAgB,CAAC,GAAW;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAEM,YAAY,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAEM,EAAE,CACL,KAAuC,EACvC,QAAgG;QAChG,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable no-bitwise */\n\nimport { EventEmitter } from \"events\";\nimport * as MergeTree from \"@fluidframework/merge-tree\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from \"./mapKernelInterfaces\";\n\nexport const reservedIntervalIdKey = \"intervalId\";\n\nexport interface ISerializedInterval {\n sequenceNumber: number;\n start: number;\n end: number;\n intervalType: MergeTree.IntervalType;\n properties?: MergeTree.PropertySet;\n}\n\nexport interface ISerializableInterval extends MergeTree.IInterval {\n properties: MergeTree.PropertySet;\n serialize(client: MergeTree.Client);\n addProperties(props: MergeTree.PropertySet);\n}\n\nexport interface IIntervalHelpers<TInterval extends ISerializableInterval> {\n compareEnds(a: TInterval, b: TInterval): number;\n create(label: string, start: number, end: number,\n client: MergeTree.Client, intervalType?: MergeTree.IntervalType): TInterval;\n}\n\nexport class Interval implements ISerializableInterval {\n public properties: MergeTree.PropertySet;\n public auxProps: MergeTree.PropertySet[];\n constructor(\n public start: number,\n public end: number,\n props?: MergeTree.PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public getIntervalId(): string | undefined {\n return this.properties?.[reservedIntervalIdKey]?.toString() as string | undefined;\n }\n\n public getAdditionalPropertySets() {\n return this.auxProps;\n }\n\n public addPropertySet(props: MergeTree.PropertySet) {\n if (this.auxProps === undefined) {\n this.auxProps = [];\n }\n this.auxProps.push(props);\n }\n\n public serialize(client: MergeTree.Client) {\n let seq = 0;\n if (client) {\n seq = client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end: this.end,\n intervalType: 0,\n sequenceNumber: seq,\n start: this.start,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new Interval(this.start, this.end, this.properties);\n }\n\n public compare(b: Interval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n return this.compareEnd(b);\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: Interval) {\n return this.start - b.start;\n }\n\n public compareEnd(b: Interval) {\n return this.end - b.end;\n }\n\n public overlaps(b: Interval) {\n const result = (this.start < b.end) &&\n (this.end >= b.start);\n return result;\n }\n\n public union(b: Interval) {\n return new Interval(Math.min(this.start, b.start),\n Math.max(this.end, b.end), this.properties);\n }\n\n public getProperties() {\n return this.properties;\n }\n\n public addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp) {\n this.properties = MergeTree.addProperties(this.properties, newProps, op);\n }\n}\n\nexport class SequenceInterval implements ISerializableInterval {\n public properties: MergeTree.PropertySet;\n private readonly checkMergeTree: MergeTree.MergeTree;\n\n constructor(\n public start: MergeTree.LocalReference,\n public end: MergeTree.LocalReference,\n public intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet) {\n if (props) {\n this.addProperties(props);\n }\n }\n\n public serialize(client: MergeTree.Client) {\n const startPosition = this.start.toPosition();\n const endPosition = this.end.toPosition();\n const serializedInterval: ISerializedInterval = {\n end: endPosition,\n intervalType: this.intervalType,\n sequenceNumber: client.getCurrentSeq(),\n start: startPosition,\n };\n if (this.properties) {\n serializedInterval.properties = this.properties;\n }\n return serializedInterval;\n }\n\n public clone() {\n return new SequenceInterval(this.start, this.end, this.intervalType);\n }\n\n public compare(b: SequenceInterval) {\n const startResult = this.compareStart(b);\n if (startResult === 0) {\n return this.compareEnd(b);\n } else {\n return startResult;\n }\n }\n\n public compareStart(b: SequenceInterval) {\n return this.start.compare(b.start);\n }\n\n public compareEnd(b: SequenceInterval) {\n return this.end.compare(b.end);\n }\n\n public overlaps(b: SequenceInterval) {\n const result = (this.start.compare(b.end) < 0) &&\n (this.end.compare(b.start) >= 0);\n if (this.checkMergeTree) {\n this.checkOverlaps(b, result);\n }\n return result;\n }\n\n public getIntervalId(): string | undefined {\n return this.properties?.[reservedIntervalIdKey]?.toString() as string | undefined;\n }\n\n public union(b: SequenceInterval) {\n return new SequenceInterval(this.start.min(b.start),\n this.end.max(b.end), this.intervalType);\n }\n\n public addProperties(newProps: MergeTree.PropertySet, op?: MergeTree.ICombiningOp) {\n this.properties = MergeTree.addProperties(this.properties, newProps, op);\n }\n\n public overlapsPos(bstart: number, bend: number) {\n const startPos = this.start.toPosition();\n const endPos = this.start.toPosition();\n return (endPos > bstart) && (startPos < bend);\n }\n\n private checkOverlaps(b: SequenceInterval, result: boolean) {\n const astart = this.start.toPosition();\n const bstart = b.start.toPosition();\n const aend = this.end.toPosition();\n const bend = b.end.toPosition();\n const checkResult = ((astart < bend) && (bstart < aend));\n if (checkResult !== result) {\n // eslint-disable-next-line max-len\n console.log(`check mismatch: res ${result} ${this.start.segment === b.end.segment} ${b.start.segment === this.end.segment}`);\n console.log(`as ${astart} ae ${aend} bs ${bstart} be ${bend}`);\n console.log(`as ${MergeTree.ordinalToArray(this.start.segment.ordinal)}@${this.start.offset}`);\n console.log(`ae ${MergeTree.ordinalToArray(this.end.segment.ordinal)}@${this.end.offset}`);\n console.log(`bs ${MergeTree.ordinalToArray(b.start.segment.ordinal)}@${b.start.offset}`);\n console.log(`be ${MergeTree.ordinalToArray(b.end.segment.ordinal)}@${b.end.offset}`);\n console.log(this.checkMergeTree.nodeToString(b.start.segment.parent, \"\"));\n }\n }\n}\n\nfunction createPositionReference(\n client: MergeTree.Client,\n pos: number,\n refType: MergeTree.ReferenceType): MergeTree.LocalReference {\n const segoff = client.getContainingSegment(pos);\n if (segoff && segoff.segment) {\n const lref = new MergeTree.LocalReference(client, segoff.segment, segoff.offset, refType);\n if (refType !== MergeTree.ReferenceType.Transient) {\n client.addLocalReference(lref);\n }\n return lref;\n }\n return new MergeTree.LocalReference(client, undefined);\n}\n\nfunction createSequenceInterval(\n label: string,\n start: number,\n end: number,\n client: MergeTree.Client,\n intervalType: MergeTree.IntervalType): SequenceInterval {\n let beginRefType = MergeTree.ReferenceType.RangeBegin;\n let endRefType = MergeTree.ReferenceType.RangeEnd;\n if (intervalType === MergeTree.IntervalType.Nest) {\n beginRefType = MergeTree.ReferenceType.NestBegin;\n endRefType = MergeTree.ReferenceType.NestEnd;\n } else if (intervalType === MergeTree.IntervalType.Transient) {\n beginRefType = MergeTree.ReferenceType.Transient;\n endRefType = MergeTree.ReferenceType.Transient;\n }\n\n // TODO: Should SlideOnRemove be the default behavior?\n if (intervalType & MergeTree.IntervalType.SlideOnRemove) {\n beginRefType |= MergeTree.ReferenceType.SlideOnRemove;\n endRefType |= MergeTree.ReferenceType.SlideOnRemove;\n }\n\n const startLref = createPositionReference(client, start, beginRefType);\n const endLref = createPositionReference(client, end, endRefType);\n if (startLref && endLref) {\n startLref.pairedRef = endLref;\n endLref.pairedRef = startLref;\n const rangeProp = {\n [MergeTree.reservedRangeLabelsKey]: [label],\n };\n startLref.addProperties(rangeProp);\n endLref.addProperties(rangeProp);\n\n const ival = new SequenceInterval(startLref, endLref, intervalType, rangeProp);\n return ival;\n }\n}\n\nexport function defaultIntervalConflictResolver(a: Interval, b: Interval) {\n a.addPropertySet(b.properties);\n return a;\n}\n\nexport function createIntervalIndex(conflict?: MergeTree.IntervalConflictResolver<Interval>) {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const lc = new LocalIntervalCollection<Interval>(undefined, \"\", helpers);\n if (conflict) {\n lc.addConflictResolver(conflict);\n } else {\n lc.addConflictResolver(defaultIntervalConflictResolver);\n }\n return lc;\n}\n\nexport class LocalIntervalCollection<TInterval extends ISerializableInterval> {\n private readonly intervalTree = new MergeTree.IntervalTree<TInterval>();\n private readonly endIntervalTree: MergeTree.RedBlackTree<TInterval, TInterval>;\n private conflictResolver: MergeTree.IntervalConflictResolver<TInterval>;\n private endConflictResolver: MergeTree.ConflictAction<TInterval, TInterval>;\n\n constructor(\n private readonly client: MergeTree.Client,\n private readonly label: string,\n private readonly helpers: IIntervalHelpers<TInterval>) {\n this.endIntervalTree =\n // eslint-disable-next-line @typescript-eslint/unbound-method\n new MergeTree.RedBlackTree<TInterval, TInterval>(helpers.compareEnds);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>) {\n this.conflictResolver = conflictResolver;\n this.endConflictResolver =\n (key: TInterval, currentKey: TInterval) => {\n const ival = this.conflictResolver(key, currentKey);\n return {\n data: ival,\n key: ival,\n };\n };\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.intervalTree.map(fn);\n }\n\n public createLegacyId(start: number, end: number): string {\n // Create a non-unique ID based on start and end to be used on intervals that come from legacy clients\n // without ID's.\n return `${start}-${end}`;\n }\n\n public ensureSerializedId(serializedInterval: ISerializedInterval) {\n if (serializedInterval.properties?.[reservedIntervalIdKey] === undefined) {\n // An interval came over the wire without an ID, so create a non-unique one based on start/end.\n // This will allow all clients to refer to this interval consistently.\n serializedInterval.properties = MergeTree.addProperties(\n serializedInterval.properties,\n {\n [reservedIntervalIdKey]: this.createLegacyId(serializedInterval.start, serializedInterval.end),\n },\n );\n }\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (this.intervalTree.intervals.isEmpty()) {\n return;\n }\n\n if (start === undefined && end === undefined) {\n // No start/end provided. Gather the whole tree in the specified order.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n results.push(interval);\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n results.push(interval);\n });\n }\n }\n else {\n const transientInterval: TInterval = this.helpers.create(\n \"transient\",\n start,\n end,\n this.client,\n MergeTree.IntervalType.Transient,\n );\n\n if (start === undefined) {\n // Only end position provided. Since the tree is not sorted by end position,\n // walk the whole tree in the specified order, gathering intervals that match the end.\n if (iteratesForward) {\n this.intervalTree.map((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n else {\n this.intervalTree.mapBackward((interval: TInterval) => {\n if (transientInterval.compareEnd(interval) === 0) {\n results.push(interval);\n }\n });\n }\n }\n else {\n // Start and (possibly) end provided. Walk the subtrees that may contain\n // this start position.\n const compareFn =\n end === undefined ?\n (node: MergeTree.IntervalNode<TInterval>) => {\n return transientInterval.compareStart(node.key);\n } :\n (node: MergeTree.IntervalNode<TInterval>) => {\n return transientInterval.compare(node.key);\n };\n const continueLeftFn = (cmpResult: number) => cmpResult <= 0;\n const continueRightFn = (cmpResult: number) => cmpResult >= 0;\n const actionFn = (node: MergeTree.IntervalNode<TInterval>) => {\n results.push(node.key);\n };\n\n if (iteratesForward) {\n this.intervalTree.intervals.walkExactMatchesForward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n else {\n this.intervalTree.intervals.walkExactMatchesBackward(\n compareFn, actionFn, continueLeftFn, continueRightFn,\n );\n }\n }\n }\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number) {\n if (!this.intervalTree.intervals.isEmpty()) {\n const transientInterval =\n this.helpers.create(\n \"transient\",\n startPosition,\n endPosition,\n this.client,\n MergeTree.IntervalType.Transient);\n\n const overlappingIntervalNodes = this.intervalTree.match(transientInterval);\n return overlappingIntervalNodes.map((node) => node.key);\n } else {\n return [];\n }\n }\n\n public previousInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, MergeTree.IntervalType.Transient);\n const rbNode = this.endIntervalTree.floor(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public nextInterval(pos: number) {\n const transientInterval = this.helpers.create(\n \"transient\", pos, pos, this.client, MergeTree.IntervalType.Transient);\n const rbNode = this.endIntervalTree.ceil(transientInterval);\n if (rbNode) {\n return rbNode.data;\n }\n }\n\n public removeInterval(startPosition: number, endPosition: number) {\n const transientInterval = this.helpers.create(\n \"transient\", startPosition, endPosition, this.client, MergeTree.IntervalType.Transient);\n this.intervalTree.remove(transientInterval);\n this.endIntervalTree.remove(transientInterval);\n return transientInterval;\n }\n\n public createInterval(start: number, end: number, intervalType: MergeTree.IntervalType) {\n return this.helpers.create(this.label, start, end, this.client, intervalType);\n }\n\n // TODO: remove interval, handle duplicate intervals\n public addInterval(\n start: number,\n end: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet) {\n const interval: TInterval = this.createInterval(start, end, intervalType);\n if (interval) {\n interval.addProperties(props);\n if (this.label && (this.label.length > 0)) {\n interval.properties[MergeTree.reservedRangeLabelsKey] = [this.label];\n }\n if (interval.properties[reservedIntervalIdKey] === undefined) {\n interval.properties[reservedIntervalIdKey] = uuid();\n }\n this.intervalTree.put(interval, this.conflictResolver);\n this.endIntervalTree.put(interval, interval, this.endConflictResolver);\n }\n return interval;\n }\n\n public serialize() {\n const client = this.client;\n const intervals = this.intervalTree.intervals.keys();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return intervals.map((interval) => interval.serialize(client));\n }\n}\n\nconst compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInterval): number => a.end.compare(b.end);\n\nclass SequenceIntervalCollectionFactory\n implements IValueFactory<IntervalCollection<SequenceInterval>> {\n public load(\n emitter: IValueOpEmitter,\n raw: ISerializedInterval[] = [],\n ): IntervalCollection<SequenceInterval> {\n const helpers: IIntervalHelpers<SequenceInterval> = {\n compareEnds: compareSequenceIntervalEnds,\n create: createSequenceInterval,\n };\n return new IntervalCollection<SequenceInterval>(helpers, true, emitter, raw);\n }\n\n public store(value: IntervalCollection<SequenceInterval>): ISerializedInterval[] {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value.serializeInternal();\n }\n}\n\nexport class SequenceIntervalCollectionValueType\n implements IValueType<IntervalCollection<SequenceInterval>> {\n public static Name = \"sharedStringIntervalCollection\";\n\n public get name(): string {\n return SequenceIntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<SequenceInterval>> {\n return SequenceIntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> {\n return SequenceIntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<SequenceInterval>> =\n new SequenceIntervalCollectionFactory();\n\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> =\n new Map<string, IValueOperation<IntervalCollection<SequenceInterval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ]]);\n}\n\nconst compareIntervalEnds = (a: Interval, b: Interval) => a.end - b.end;\n\nfunction createInterval(label: string, start: number, end: number, client: MergeTree.Client): Interval {\n let rangeProp: MergeTree.PropertySet;\n if (label && (label.length > 0)) {\n rangeProp = {\n [MergeTree.reservedRangeLabelsKey]: [label],\n };\n }\n return new Interval(start, end, rangeProp);\n}\n\nclass IntervalCollectionFactory\n implements IValueFactory<IntervalCollection<Interval>> {\n public load(emitter: IValueOpEmitter, raw: ISerializedInterval[] = []): IntervalCollection<Interval> {\n const helpers: IIntervalHelpers<Interval> = {\n compareEnds: compareIntervalEnds,\n create: createInterval,\n };\n const collection = new IntervalCollection<Interval>(helpers, false, emitter, raw);\n collection.attachGraph(undefined, \"\");\n return collection;\n }\n\n public store(value: IntervalCollection<Interval>): ISerializedInterval[] {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value.serializeInternal();\n }\n}\n\nexport class IntervalCollectionValueType\n implements IValueType<IntervalCollection<Interval>> {\n public static Name = \"sharedIntervalCollection\";\n\n public get name(): string {\n return IntervalCollectionValueType.Name;\n }\n\n public get factory(): IValueFactory<IntervalCollection<Interval>> {\n return IntervalCollectionValueType._factory;\n }\n\n public get ops(): Map<string, IValueOperation<IntervalCollection<Interval>>> {\n return IntervalCollectionValueType._ops;\n }\n\n private static readonly _factory: IValueFactory<IntervalCollection<Interval>> =\n new IntervalCollectionFactory();\n private static readonly _ops: Map<string, IValueOperation<IntervalCollection<Interval>>> =\n new Map<string, IValueOperation<IntervalCollection<Interval>>>(\n [[\n \"add\",\n {\n process: (value, params, local, op) => {\n // Local ops were applied when the message was created\n if (local) {\n return;\n }\n\n value.addInternal(params, local, op);\n },\n },\n ],\n [\n \"delete\",\n {\n process: (value, params, local, op) => {\n if (local) {\n return;\n }\n value.deleteInterval(params, local, op);\n },\n },\n ]]);\n}\n\nexport type DeserializeCallback = (properties: MergeTree.PropertySet) => void;\n\nexport class IntervalCollectionIterator<TInterval extends ISerializableInterval> {\n private readonly results: TInterval[];\n private index: number;\n\n constructor(\n collection: IntervalCollection<TInterval>,\n iteratesForward: boolean = true,\n start?: number,\n end?: number) {\n this.results = [];\n this.index = 0;\n\n collection.gatherIterationResults(this.results, iteratesForward, start, end);\n }\n\n public next() {\n let _value: TInterval | undefined;\n let _done: boolean = true;\n\n if (this.index < this.results.length) {\n _value = this.results[this.index++];\n _done = false;\n }\n\n return {\n value: _value,\n done: _done,\n };\n }\n}\n\nexport class IntervalCollection<TInterval extends ISerializableInterval> extends EventEmitter {\n private savedSerializedIntervals?: ISerializedInterval[];\n private localCollection: LocalIntervalCollection<TInterval>;\n private onDeserialize: DeserializeCallback;\n private client: MergeTree.Client;\n\n public get attached(): boolean {\n // return !!this.view;\n return !!this.localCollection;\n }\n\n constructor(private readonly helpers: IIntervalHelpers<TInterval>, private readonly requiresClient: boolean,\n private readonly emitter: IValueOpEmitter,\n serializedIntervals: ISerializedInterval[]) {\n super();\n this.savedSerializedIntervals = serializedIntervals;\n }\n\n public attachGraph(client: MergeTree.Client, label: string) {\n if (this.attached) {\n throw new Error(\"Only supports one Sequence attach\");\n }\n\n if ((client === undefined) && (this.requiresClient)) {\n throw new Error(\"Client required for this collection\");\n }\n\n // Instantiate the local interval collection based on the saved intervals\n this.client = client;\n this.localCollection = new LocalIntervalCollection<TInterval>(client, label, this.helpers);\n if (this.savedSerializedIntervals) {\n for (const serializedInterval of this.savedSerializedIntervals) {\n this.localCollection.ensureSerializedId(serializedInterval);\n this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n }\n }\n this.savedSerializedIntervals = undefined;\n }\n\n public add(\n start: number,\n end: number,\n intervalType: MergeTree.IntervalType,\n props?: MergeTree.PropertySet,\n ) {\n if (!this.attached) {\n throw new Error(\"attach must be called prior to adding intervals\");\n }\n\n let seq = 0;\n if (this.client) {\n seq = this.client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n end,\n intervalType,\n properties: props,\n sequenceNumber: seq,\n start,\n };\n\n return this.addInternal(serializedInterval, true, undefined);\n }\n\n public delete(\n start: number,\n end: number,\n ) {\n let sequenceNumber = 0;\n if (!this.attached) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n\n if (this.client) {\n sequenceNumber = this.client.getCurrentSeq();\n }\n\n const serializedInterval: ISerializedInterval = {\n start,\n end,\n sequenceNumber,\n intervalType: MergeTree.IntervalType.Transient,\n };\n\n this.deleteInterval(serializedInterval, true, undefined);\n }\n\n public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n this.localCollection.addConflictResolver(conflictResolver);\n }\n\n public attachDeserializer(onDeserialize: DeserializeCallback): void {\n this.attachDeserializerCore(onDeserialize);\n }\n\n private attachDeserializerCore(onDeserialize?: DeserializeCallback): void {\n // If no deserializer is specified can skip all processing work\n if (!onDeserialize) {\n return;\n }\n\n // Start by storing the callbacks so that any subsequent modifications make use of them\n this.onDeserialize = onDeserialize;\n\n // Trigger the async prepare work across all values in the collection\n this.localCollection.map((interval) => {\n this.onDeserialize(interval);\n });\n }\n\n /**\n * @deprecated - IntervalCollectionView has been removed. Please refer to IntervalCollection directly.\n */\n public async getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollection<TInterval>> {\n if (!this.attached) {\n return Promise.reject(new Error(\"attachSequence must be called prior to retrieving the view\"));\n }\n\n // Attach custom deserializers if specified\n if (onDeserialize) {\n this.attachDeserializer(onDeserialize);\n }\n\n return this;\n }\n\n public addInternal(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage) {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n if (!local) {\n this.localCollection.ensureSerializedId(serializedInterval);\n }\n\n const interval = this.localCollection.addInterval(\n serializedInterval.start,\n serializedInterval.end,\n serializedInterval.intervalType,\n serializedInterval.properties);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"add\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"addInterval\", interval, local, op);\n\n return interval;\n }\n\n public deleteInterval(\n serializedInterval: ISerializedInterval,\n local: boolean,\n op: ISequencedDocumentMessage): void {\n if (!this.attached) {\n throw new Error(\"attach must be called prior to deleting intervals\");\n }\n\n const interval = this.localCollection.removeInterval(serializedInterval.start, serializedInterval.end);\n\n if (interval) {\n // Local ops get submitted to the server. Remote ops have the deserializer run.\n if (local) {\n this.emitter.emit(\"delete\", undefined, serializedInterval);\n } else {\n if (this.onDeserialize) {\n this.onDeserialize(interval);\n }\n }\n }\n\n this.emit(\"deleteInterval\", interval, local, op);\n }\n\n public serializeInternal() {\n if (!this.attached) {\n throw new Error(\"attachSequence must be called\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.localCollection.serialize();\n }\n\n public [Symbol.iterator](): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this);\n return iterator;\n }\n\n public CreateForwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, startPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithStartPosition(startPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, startPosition);\n return iterator;\n }\n\n public CreateForwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, true, undefined, endPosition);\n return iterator;\n }\n\n public CreateBackwardIteratorWithEndPosition(endPosition: number): IntervalCollectionIterator<TInterval> {\n const iterator = new IntervalCollectionIterator<TInterval>(this, false, undefined, endPosition);\n return iterator;\n }\n\n public gatherIterationResults(\n results: TInterval[],\n iteratesForward: boolean,\n start?: number,\n end?: number) {\n if (!this.attached) {\n return;\n }\n\n this.localCollection.gatherIterationResults(results, iteratesForward, start, end);\n }\n\n public findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[] {\n return this.localCollection.findOverlappingIntervals(startPosition, endPosition);\n }\n\n public map(fn: (interval: TInterval) => void) {\n this.localCollection.map(fn);\n }\n\n public previousInterval(pos: number): TInterval {\n return this.localCollection.previousInterval(pos);\n }\n\n public nextInterval(pos: number): TInterval {\n return this.localCollection.nextInterval(pos);\n }\n\n public on(\n event: \"addInterval\" | \"deleteInterval\",\n listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this {\n return super.on(event, listener);\n }\n}\n"]} |
@@ -8,3 +8,3 @@ /*! | ||
| export declare const pkgName = "@fluidframework/sequence"; | ||
| export declare const pkgVersion = "0.42.2"; | ||
| export declare const pkgVersion = "0.43.0"; | ||
| //# sourceMappingURL=packageVersion.d.ts.map |
@@ -8,3 +8,3 @@ /*! | ||
| export const pkgName = "@fluidframework/sequence"; | ||
| export const pkgVersion = "0.42.2"; | ||
| export const pkgVersion = "0.43.0"; | ||
| //# sourceMappingURL=packageVersion.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,0BAA0B,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"0.42.2\";\n"]} | ||
| {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,0BAA0B,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"0.43.0\";\n"]} |
+13
-14
| { | ||
| "name": "@fluidframework/sequence", | ||
| "version": "0.42.2", | ||
| "version": "0.43.0", | ||
| "description": "Distributed sequence", | ||
@@ -62,23 +62,22 @@ "homepage": "https://fluidframework.com", | ||
| "@fluidframework/common-utils": "^0.31.0", | ||
| "@fluidframework/core-interfaces": "^0.39.0", | ||
| "@fluidframework/datastore-definitions": "^0.42.2", | ||
| "@fluidframework/merge-tree": "^0.42.2", | ||
| "@fluidframework/core-interfaces": "^0.39.5", | ||
| "@fluidframework/datastore-definitions": "^0.43.0", | ||
| "@fluidframework/merge-tree": "^0.43.0", | ||
| "@fluidframework/protocol-definitions": "^0.1024.0", | ||
| "@fluidframework/runtime-definitions": "^0.42.2", | ||
| "@fluidframework/runtime-utils": "^0.42.2", | ||
| "@fluidframework/shared-object-base": "^0.42.2", | ||
| "@fluidframework/telemetry-utils": "^0.42.2", | ||
| "assert": "^2.0.0", | ||
| "debug": "^4.1.1" | ||
| "@fluidframework/runtime-definitions": "^0.43.0", | ||
| "@fluidframework/runtime-utils": "^0.43.0", | ||
| "@fluidframework/shared-object-base": "^0.43.0", | ||
| "@fluidframework/telemetry-utils": "^0.43.0", | ||
| "debug": "^4.1.1", | ||
| "uuid": "^8.3.1" | ||
| }, | ||
| "devDependencies": { | ||
| "@fluid-internal/test-dds-utils": "^0.42.2", | ||
| "@fluid-internal/test-dds-utils": "^0.43.0", | ||
| "@fluidframework/build-common": "^0.22.0", | ||
| "@fluidframework/eslint-config-fluid": "^0.23.0", | ||
| "@fluidframework/gitresources": "^0.1027.0", | ||
| "@fluidframework/mocha-test-setup": "^0.42.2", | ||
| "@fluidframework/mocha-test-setup": "^0.43.0", | ||
| "@fluidframework/server-services-client": "^0.1027.0", | ||
| "@fluidframework/test-runtime-utils": "^0.42.2", | ||
| "@fluidframework/test-runtime-utils": "^0.43.0", | ||
| "@microsoft/api-extractor": "^7.16.1", | ||
| "@types/assert": "^1.5.2", | ||
| "@types/debug": "^4.1.5", | ||
@@ -85,0 +84,0 @@ "@types/diff": "^3.5.1", |
+0
-1
@@ -14,3 +14,2 @@ /*! | ||
| IntervalCollectionIterator, | ||
| IntervalCollectionView, | ||
| SequenceInterval, | ||
@@ -17,0 +16,0 @@ } from "./intervalCollection"; |
+181
-192
@@ -11,5 +11,7 @@ /*! | ||
| import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"; | ||
| import { v4 as uuid } from "uuid"; | ||
| import { IValueFactory, IValueOpEmitter, IValueOperation, IValueType } from "./mapKernelInterfaces"; | ||
| export const reservedIntervalIdKey = "intervalId"; | ||
| export interface ISerializedInterval { | ||
@@ -47,2 +49,6 @@ sequenceNumber: number; | ||
| public getIntervalId(): string | undefined { | ||
| return this.properties?.[reservedIntervalIdKey]?.toString() as string | undefined; | ||
| } | ||
| public getAdditionalPropertySets() { | ||
@@ -177,2 +183,6 @@ return this.auxProps; | ||
| public getIntervalId(): string | undefined { | ||
| return this.properties?.[reservedIntervalIdKey]?.toString() as string | undefined; | ||
| } | ||
| public union(b: SequenceInterval) { | ||
@@ -315,2 +325,21 @@ return new SequenceInterval(this.start.min(b.start), | ||
| public createLegacyId(start: number, end: number): string { | ||
| // Create a non-unique ID based on start and end to be used on intervals that come from legacy clients | ||
| // without ID's. | ||
| return `${start}-${end}`; | ||
| } | ||
| public ensureSerializedId(serializedInterval: ISerializedInterval) { | ||
| if (serializedInterval.properties?.[reservedIntervalIdKey] === undefined) { | ||
| // An interval came over the wire without an ID, so create a non-unique one based on start/end. | ||
| // This will allow all clients to refer to this interval consistently. | ||
| serializedInterval.properties = MergeTree.addProperties( | ||
| serializedInterval.properties, | ||
| { | ||
| [reservedIntervalIdKey]: this.createLegacyId(serializedInterval.start, serializedInterval.end), | ||
| }, | ||
| ); | ||
| } | ||
| } | ||
| public gatherIterationResults( | ||
@@ -449,3 +478,3 @@ results: TInterval[], | ||
| props?: MergeTree.PropertySet) { | ||
| const interval = this.createInterval(start, end, intervalType); | ||
| const interval: TInterval = this.createInterval(start, end, intervalType); | ||
| if (interval) { | ||
@@ -456,2 +485,5 @@ interval.addProperties(props); | ||
| } | ||
| if (interval.properties[reservedIntervalIdKey] === undefined) { | ||
| interval.properties[reservedIntervalIdKey] = uuid(); | ||
| } | ||
| this.intervalTree.put(interval, this.conflictResolver); | ||
@@ -617,63 +649,74 @@ this.endIntervalTree.put(interval, interval, this.endConflictResolver); | ||
| export class IntervalCollectionView<TInterval extends ISerializableInterval> extends EventEmitter { | ||
| private readonly localCollection: LocalIntervalCollection<TInterval>; | ||
| private onDeserialize: DeserializeCallback; | ||
| export class IntervalCollectionIterator<TInterval extends ISerializableInterval> { | ||
| private readonly results: TInterval[]; | ||
| private index: number; | ||
| constructor( | ||
| private readonly client: MergeTree.Client, | ||
| savedSerializedIntervals: ISerializedInterval[], | ||
| label: string, | ||
| helpers: IIntervalHelpers<TInterval>, | ||
| private readonly emitter: IValueOpEmitter) { | ||
| super(); | ||
| collection: IntervalCollection<TInterval>, | ||
| iteratesForward: boolean = true, | ||
| start?: number, | ||
| end?: number) { | ||
| this.results = []; | ||
| this.index = 0; | ||
| // Instantiate the local interval collection based on the saved intervals | ||
| this.localCollection = new LocalIntervalCollection<TInterval>(client, label, helpers); | ||
| if (savedSerializedIntervals) { | ||
| for (const serializedInterval of savedSerializedIntervals) { | ||
| this.localCollection.addInterval( | ||
| serializedInterval.start, | ||
| serializedInterval.end, | ||
| serializedInterval.intervalType, | ||
| serializedInterval.properties); | ||
| } | ||
| } | ||
| collection.gatherIterationResults(this.results, iteratesForward, start, end); | ||
| } | ||
| public attachDeserializer(onDeserialize: DeserializeCallback): void { | ||
| this.attachDeserializerCore(onDeserialize); | ||
| } | ||
| public next() { | ||
| let _value: TInterval | undefined; | ||
| let _done: boolean = true; | ||
| public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void { | ||
| this.localCollection.addConflictResolver(conflictResolver); | ||
| } | ||
| if (this.index < this.results.length) { | ||
| _value = this.results[this.index++]; | ||
| _done = false; | ||
| } | ||
| public findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[] { | ||
| return this.localCollection.findOverlappingIntervals(startPosition, endPosition); | ||
| return { | ||
| value: _value, | ||
| done: _done, | ||
| }; | ||
| } | ||
| } | ||
| public map(fn: (interval: TInterval) => void) { | ||
| this.localCollection.map(fn); | ||
| } | ||
| export class IntervalCollection<TInterval extends ISerializableInterval> extends EventEmitter { | ||
| private savedSerializedIntervals?: ISerializedInterval[]; | ||
| private localCollection: LocalIntervalCollection<TInterval>; | ||
| private onDeserialize: DeserializeCallback; | ||
| private client: MergeTree.Client; | ||
| public gatherIterationResults( | ||
| results: TInterval[], | ||
| iteratesForward: boolean, | ||
| start?: number, | ||
| end?: number) { | ||
| this.localCollection.gatherIterationResults(results, iteratesForward, start, end); | ||
| public get attached(): boolean { | ||
| // return !!this.view; | ||
| return !!this.localCollection; | ||
| } | ||
| public previousInterval(pos: number): TInterval { | ||
| return this.localCollection.previousInterval(pos); | ||
| constructor(private readonly helpers: IIntervalHelpers<TInterval>, private readonly requiresClient: boolean, | ||
| private readonly emitter: IValueOpEmitter, | ||
| serializedIntervals: ISerializedInterval[]) { | ||
| super(); | ||
| this.savedSerializedIntervals = serializedIntervals; | ||
| } | ||
| public nextInterval(pos: number): TInterval { | ||
| return this.localCollection.nextInterval(pos); | ||
| } | ||
| public attachGraph(client: MergeTree.Client, label: string) { | ||
| if (this.attached) { | ||
| throw new Error("Only supports one Sequence attach"); | ||
| } | ||
| public on( | ||
| event: "addInterval" | "deleteInterval", | ||
| listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this { | ||
| return super.on(event, listener); | ||
| if ((client === undefined) && (this.requiresClient)) { | ||
| throw new Error("Client required for this collection"); | ||
| } | ||
| // Instantiate the local interval collection based on the saved intervals | ||
| this.client = client; | ||
| this.localCollection = new LocalIntervalCollection<TInterval>(client, label, this.helpers); | ||
| if (this.savedSerializedIntervals) { | ||
| for (const serializedInterval of this.savedSerializedIntervals) { | ||
| this.localCollection.ensureSerializedId(serializedInterval); | ||
| this.localCollection.addInterval( | ||
| serializedInterval.start, | ||
| serializedInterval.end, | ||
| serializedInterval.intervalType, | ||
| serializedInterval.properties); | ||
| } | ||
| } | ||
| this.savedSerializedIntervals = undefined; | ||
| } | ||
@@ -687,2 +730,6 @@ | ||
| ) { | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to adding intervals"); | ||
| } | ||
| let seq = 0; | ||
@@ -706,4 +753,9 @@ if (this.client) { | ||
| start: number, | ||
| end: number) { | ||
| end: number, | ||
| ) { | ||
| let sequenceNumber = 0; | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| if (this.client) { | ||
@@ -723,50 +775,13 @@ sequenceNumber = this.client.getCurrentSeq(); | ||
| // TODO: error cases | ||
| public addInternal(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) { | ||
| const interval = this.localCollection.addInterval( | ||
| serializedInterval.start, | ||
| serializedInterval.end, | ||
| serializedInterval.intervalType, | ||
| serializedInterval.properties); | ||
| if (interval) { | ||
| // Local ops get submitted to the server. Remote ops have the deserializer run. | ||
| if (local) { | ||
| this.emitter.emit("add", undefined, serializedInterval); | ||
| } else { | ||
| if (this.onDeserialize) { | ||
| this.onDeserialize(interval); | ||
| } | ||
| } | ||
| public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| this.emit("addInterval", interval, local, op); | ||
| return interval; | ||
| this.localCollection.addConflictResolver(conflictResolver); | ||
| } | ||
| public deleteInterval(serializedInterval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) { | ||
| const interval = this.localCollection.removeInterval(serializedInterval.start, serializedInterval.end); | ||
| if (interval) { | ||
| // Local ops get submitted to the server. Remote ops have the deserializer run. | ||
| if (local) { | ||
| this.emitter.emit("delete", undefined, serializedInterval); | ||
| } else { | ||
| if (this.onDeserialize) { | ||
| this.onDeserialize(interval); | ||
| } | ||
| } | ||
| } | ||
| this.emit("deleteInterval", interval, local, op); | ||
| return this; | ||
| public attachDeserializer(onDeserialize: DeserializeCallback): void { | ||
| this.attachDeserializerCore(onDeserialize); | ||
| } | ||
| public serializeInternal() { | ||
| // eslint-disable-next-line @typescript-eslint/no-unsafe-return | ||
| return this.localCollection.serialize(); | ||
| } | ||
| private attachDeserializerCore(onDeserialize?: DeserializeCallback): void { | ||
@@ -786,93 +801,8 @@ // If no deserializer is specified can skip all processing work | ||
| } | ||
| } | ||
| export class IntervalCollectionIterator<TInterval extends ISerializableInterval> { | ||
| private readonly results: TInterval[]; | ||
| private index: number; | ||
| constructor( | ||
| collection: IntervalCollection<TInterval>, | ||
| iteratesForward: boolean = true, | ||
| start?: number, | ||
| end?: number) { | ||
| this.results = []; | ||
| this.index = 0; | ||
| collection.gatherIterationResults(this.results, iteratesForward, start, end); | ||
| } | ||
| public next() { | ||
| let _value: TInterval | undefined; | ||
| let _done: boolean = true; | ||
| if (this.index < this.results.length) { | ||
| _value = this.results[this.index++]; | ||
| _done = false; | ||
| } | ||
| return { | ||
| value: _value, | ||
| done: _done, | ||
| }; | ||
| } | ||
| } | ||
| export class IntervalCollection<TInterval extends ISerializableInterval> { | ||
| private savedSerializedIntervals?: ISerializedInterval[]; | ||
| private view: IntervalCollectionView<TInterval>; | ||
| public get attached(): boolean { | ||
| return !!this.view; | ||
| } | ||
| constructor(private readonly helpers: IIntervalHelpers<TInterval>, private readonly requiresClient: boolean, | ||
| private readonly emitter: IValueOpEmitter, | ||
| serializedIntervals: ISerializedInterval[]) { | ||
| this.savedSerializedIntervals = serializedIntervals; | ||
| } | ||
| public attachGraph(client: MergeTree.Client, label: string) { | ||
| if (this.view) { | ||
| throw new Error("Only supports one Sequence attach"); | ||
| } | ||
| if ((client === undefined) && (this.requiresClient)) { | ||
| throw new Error("Client required for this collection"); | ||
| } | ||
| this.view = new IntervalCollectionView<TInterval>(client, | ||
| this.savedSerializedIntervals, label, this.helpers, this.emitter); | ||
| this.savedSerializedIntervals = undefined; | ||
| } | ||
| public add( | ||
| startPosition: number, | ||
| endPosition: number, | ||
| intervalType: MergeTree.IntervalType, | ||
| props?: MergeTree.PropertySet, | ||
| ) { | ||
| if (!this.view) { | ||
| throw new Error("attach must be called prior to adding intervals"); | ||
| } | ||
| return this.view.add(startPosition, endPosition, intervalType, props); | ||
| } | ||
| public delete( | ||
| startPosition: number, | ||
| endPosition: number, | ||
| ) { | ||
| if (!this.view) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| this.view.delete(startPosition, endPosition); | ||
| } | ||
| public addConflictResolver(conflictResolver: MergeTree.IntervalConflictResolver<TInterval>): void { | ||
| this.view.addConflictResolver(conflictResolver); | ||
| } | ||
| public async getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollectionView<TInterval>> { | ||
| if (!this.view) { | ||
| /** | ||
| * @deprecated - IntervalCollectionView has been removed. Please refer to IntervalCollection directly. | ||
| */ | ||
| public async getView(onDeserialize?: DeserializeCallback): Promise<IntervalCollection<TInterval>> { | ||
| if (!this.attached) { | ||
| return Promise.reject(new Error("attachSequence must be called prior to retrieving the view")); | ||
@@ -883,6 +813,6 @@ } | ||
| if (onDeserialize) { | ||
| this.view.attachDeserializer(onDeserialize); | ||
| this.attachDeserializer(onDeserialize); | ||
| } | ||
| return this.view; | ||
| return this; | ||
| } | ||
@@ -894,7 +824,30 @@ | ||
| op: ISequencedDocumentMessage) { | ||
| if (!this.view) { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
| } | ||
| return this.view.addInternal(serializedInterval, local, op); | ||
| if (!local) { | ||
| this.localCollection.ensureSerializedId(serializedInterval); | ||
| } | ||
| const interval = this.localCollection.addInterval( | ||
| serializedInterval.start, | ||
| serializedInterval.end, | ||
| serializedInterval.intervalType, | ||
| serializedInterval.properties); | ||
| if (interval) { | ||
| // Local ops get submitted to the server. Remote ops have the deserializer run. | ||
| if (local) { | ||
| this.emitter.emit("add", undefined, serializedInterval); | ||
| } else { | ||
| if (this.onDeserialize) { | ||
| this.onDeserialize(interval); | ||
| } | ||
| } | ||
| } | ||
| this.emit("addInterval", interval, local, op); | ||
| return interval; | ||
| } | ||
@@ -906,10 +859,24 @@ | ||
| op: ISequencedDocumentMessage): void { | ||
| if (!this.view) { | ||
| if (!this.attached) { | ||
| throw new Error("attach must be called prior to deleting intervals"); | ||
| } | ||
| this.view.deleteInterval(serializedInterval, local, op); | ||
| const interval = this.localCollection.removeInterval(serializedInterval.start, serializedInterval.end); | ||
| if (interval) { | ||
| // Local ops get submitted to the server. Remote ops have the deserializer run. | ||
| if (local) { | ||
| this.emitter.emit("delete", undefined, serializedInterval); | ||
| } else { | ||
| if (this.onDeserialize) { | ||
| this.onDeserialize(interval); | ||
| } | ||
| } | ||
| } | ||
| this.emit("deleteInterval", interval, local, op); | ||
| } | ||
| public serializeInternal() { | ||
| if (!this.view) { | ||
| if (!this.attached) { | ||
| throw new Error("attachSequence must be called"); | ||
@@ -919,3 +886,3 @@ } | ||
| // eslint-disable-next-line @typescript-eslint/no-unsafe-return | ||
| return this.view.serializeInternal(); | ||
| return this.localCollection.serialize(); | ||
| } | ||
@@ -953,8 +920,30 @@ | ||
| end?: number) { | ||
| if (!this.view) { | ||
| if (!this.attached) { | ||
| return; | ||
| } | ||
| this.view.gatherIterationResults(results, iteratesForward, start, end); | ||
| this.localCollection.gatherIterationResults(results, iteratesForward, start, end); | ||
| } | ||
| public findOverlappingIntervals(startPosition: number, endPosition: number): TInterval[] { | ||
| return this.localCollection.findOverlappingIntervals(startPosition, endPosition); | ||
| } | ||
| public map(fn: (interval: TInterval) => void) { | ||
| this.localCollection.map(fn); | ||
| } | ||
| public previousInterval(pos: number): TInterval { | ||
| return this.localCollection.previousInterval(pos); | ||
| } | ||
| public nextInterval(pos: number): TInterval { | ||
| return this.localCollection.nextInterval(pos); | ||
| } | ||
| public on( | ||
| event: "addInterval" | "deleteInterval", | ||
| listener: (interval: ISerializedInterval, local: boolean, op: ISequencedDocumentMessage) => void): this { | ||
| return super.on(event, listener); | ||
| } | ||
| } |
@@ -9,2 +9,2 @@ /*! | ||
| export const pkgName = "@fluidframework/sequence"; | ||
| export const pkgVersion = "0.42.2"; | ||
| export const pkgVersion = "0.43.0"; |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
32
-3.03%13392
0.01%1120748
-0.11%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed