You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@fluidframework/sequence

Package Overview
Dependencies
Maintainers
3
Versions
661
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@fluidframework/sequence - npm Package Compare versions

Comparing version
0.42.2
to
0.43.0
+1
-1
dist/index.d.ts

@@ -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"}

@@ -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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"}

@@ -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":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;AAEH,+BAA+B;AAE/B,mCAAsC;AACtC,sEAAwD;AAyBxD,MAAa,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;AAhFD,4BAgFC;AAED,MAAa,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;AA3FD,4CA2FC;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,SAAgB,+BAA+B,CAAC,CAAW,EAAE,CAAW;IACpE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC;AACb,CAAC;AAHD,0EAGC;AAED,SAAgB,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;AAZD,kDAYC;AAED,MAAa,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;AAtLD,0DAsLC;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,MAAa,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;;AAdL,kFA6CC;AA3CiB,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,MAAa,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;;AAdL,kEA4CC;AA1CiB,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,MAAa,sBAAgE,SAAQ,qBAAY;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;AArKD,wDAqKC;AAED,MAAa,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;AA7BD,gEA6BC;AAED,MAAa,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;AAvID,gDAuIC","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"]}

@@ -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"}

@@ -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 +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":"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"}
{"version":3,"file":"intervalCollection.d.ts","sourceRoot":"","sources":["../src/intervalCollection.ts"],"names":[],"mappings":"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"}

@@ -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":"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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

@@ -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"]}
{
"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",

@@ -14,3 +14,2 @@ /*!

IntervalCollectionIterator,
IntervalCollectionView,
SequenceInterval,

@@ -17,0 +16,0 @@ } from "./intervalCollection";

@@ -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";