@itwin/core-bentley 5.9.0-dev.8 → 5.10.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,7 +14,7 @@ import { UnexpectedErrors } from "./UnexpectedErrors";
14
14
  */
15
15
  export class BeEvent {
16
16
  _listeners = [];
17
- _insideRaiseEvent = false;
17
+ _emitDepth = 0;
18
18
  /** The number of listeners currently subscribed to the event. */
19
19
  get numberOfListeners() { return this._listeners.length; }
20
20
  /**
@@ -51,7 +51,7 @@ export class BeEvent {
51
51
  for (let i = 0; i < listeners.length; ++i) {
52
52
  const context = listeners[i];
53
53
  if (context.listener === listener && context.scope === scope) {
54
- if (this._insideRaiseEvent) {
54
+ if (this._emitDepth > 0) {
55
55
  context.listener = undefined;
56
56
  }
57
57
  else {
@@ -68,7 +68,7 @@ export class BeEvent {
68
68
  * @see [[BeEvent.removeListener]], [[BeEvent.addListener]]
69
69
  */
70
70
  raiseEvent(...args) {
71
- this._insideRaiseEvent = true;
71
+ this._emitDepth++;
72
72
  const listeners = this._listeners;
73
73
  const length = listeners.length;
74
74
  let dropped = false;
@@ -84,16 +84,21 @@ export class BeEvent {
84
84
  catch (e) {
85
85
  UnexpectedErrors.handle(e);
86
86
  }
87
- if (context.once) {
87
+ if (!context.listener) {
88
+ // listener was removed during its own callback
89
+ dropped = true;
90
+ }
91
+ else if (context.once) {
88
92
  context.listener = undefined;
89
93
  dropped = true;
90
94
  }
91
95
  }
92
96
  }
93
- // if we had dropped listeners, remove them now
94
- if (dropped)
97
+ this._emitDepth--;
98
+ // Only sweep tombstoned entries when the outermost emit completes,
99
+ // so nested raiseEvent calls never mutate the array mid-iteration.
100
+ if (dropped && this._emitDepth === 0)
95
101
  this._listeners = this._listeners.filter((ctx) => ctx.listener !== undefined);
96
- this._insideRaiseEvent = false;
97
102
  }
98
103
  /** Determine whether this BeEvent has a specified listener registered.
99
104
  * @param listener The listener to check.
@@ -117,6 +122,102 @@ export class BeUiEvent extends BeEvent {
117
122
  /** Raises event with single strongly typed argument. */
118
123
  emit(args) { this.raiseEvent(args); }
119
124
  }
125
+ /**
126
+ * Manages a set of *listeners* for a particular event and notifies them when the event is raised.
127
+ * Unlike [[BeEvent]], this class uses a `Set` internally to support safe concurrent modification
128
+ * during emit. When a listener is removed during emit, it is marked for deferred removal instead
129
+ * of mutating the set immediately.
130
+ *
131
+ * Listeners are managed exclusively through the disposal closure returned by [[addListener]] and
132
+ * [[addOnce]]. There is no `removeListener` or `has` method — callers must capture the returned
133
+ * closure to unsubscribe.
134
+ * @beta
135
+ */
136
+ export class BeUnorderedEvent {
137
+ _listeners = new Set();
138
+ _emitDepth = 0;
139
+ _hasTombstones = false;
140
+ /** The number of listeners currently subscribed to the event.
141
+ * @note During `raiseEvent()`, this may include listeners that have been removed or are one-shot
142
+ * but are awaiting deferred cleanup. The count is accurate outside of `raiseEvent()`.
143
+ */
144
+ get numberOfListeners() { return this._listeners.size; }
145
+ /**
146
+ * Registers a Listener to be executed whenever this event is raised.
147
+ * @param listener The function to be executed when the event is raised.
148
+ * @param scope An optional object scope to serve as the 'this' pointer when listener is invoked.
149
+ * @returns A function that will remove this event listener in O(1).
150
+ */
151
+ addListener(listener, scope) {
152
+ const ctx = { listener, scope, once: false };
153
+ this._listeners.add(ctx);
154
+ return () => this._removeCtx(ctx);
155
+ }
156
+ /**
157
+ * Registers a callback function to be executed *only once* when the event is raised.
158
+ * @param listener The function to be executed once when the event is raised.
159
+ * @param scope An optional object scope to serve as the `this` pointer in which the listener function will execute.
160
+ * @returns A function that will remove this event listener in O(1).
161
+ */
162
+ addOnce(listener, scope) {
163
+ const ctx = { listener, scope, once: true };
164
+ this._listeners.add(ctx);
165
+ return () => this._removeCtx(ctx);
166
+ }
167
+ /** Remove a specific context entry, deferring during emit. */
168
+ _removeCtx(ctx) {
169
+ if (this._emitDepth > 0) {
170
+ ctx.listener = undefined; // tombstone for deferred cleanup
171
+ this._hasTombstones = true;
172
+ }
173
+ else {
174
+ this._listeners.delete(ctx);
175
+ }
176
+ }
177
+ /**
178
+ * Raises the event by calling each registered listener with the supplied arguments.
179
+ * @param args This method takes any number of parameters and passes them through to the listeners.
180
+ */
181
+ raiseEvent(...args) {
182
+ this._emitDepth++;
183
+ for (const ctx of this._listeners) {
184
+ if (!ctx.listener) {
185
+ continue;
186
+ }
187
+ try {
188
+ ctx.listener.apply(ctx.scope, args);
189
+ }
190
+ catch (e) {
191
+ UnexpectedErrors.handle(e);
192
+ }
193
+ if (ctx.listener && ctx.once) {
194
+ ctx.listener = undefined;
195
+ this._hasTombstones = true;
196
+ }
197
+ }
198
+ this._emitDepth--;
199
+ // Only clean up tombstoned entries when we're back at the outermost emit
200
+ if (this._hasTombstones && this._emitDepth === 0) {
201
+ this._hasTombstones = false;
202
+ for (const ctx of this._listeners) {
203
+ if (ctx.listener === undefined)
204
+ this._listeners.delete(ctx);
205
+ }
206
+ }
207
+ }
208
+ /** Clear all listeners from this BeUnorderedEvent.
209
+ * @note If called during `raiseEvent`, remaining listeners in the current iteration are skipped
210
+ * immediately rather than being tombstoned.
211
+ */
212
+ clear() { this._listeners.clear(); }
213
+ }
214
+ /** Specialization of BeUnorderedEvent for events that take a single strongly typed argument, primarily used for UI events.
215
+ * @beta
216
+ */
217
+ export class BeUnorderedUiEvent extends BeUnorderedEvent {
218
+ /** Raises event with single strongly typed argument. */
219
+ emit(args) { this.raiseEvent(args); }
220
+ }
120
221
  /**
121
222
  * A list of BeEvent objects, accessible by an event name.
122
223
  * This class may be used instead of explicitly declaring each BeEvent as a member of a containing class.
@@ -1 +1 @@
1
- {"version":3,"file":"BeEvent.js","sourceRoot":"","sources":["../../src/BeEvent.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAatD;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IACV,UAAU,GAAmB,EAAE,CAAC;IAChC,iBAAiB,GAAY,KAAK,CAAC;IAE3C,iEAAiE;IACjE,IAAW,iBAAiB,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjE;;;;;;OAMG;IACI,WAAW,CAAC,QAAW,EAAE,KAAW;QACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACI,OAAO,CAAC,QAAW,EAAE,KAAW;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACI,cAAc,CAAC,QAAW,EAAE,KAAW;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC3B,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACI,UAAU,CAAC,GAAG,IAAmB;QACtC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC9C,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;gBACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;oBAC7B,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,IAAI,OAAO;YACT,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAEhF,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,GAAG,CAAC,QAAW,EAAE,KAAW;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6CAA6C;IACtC,KAAK,KAAW,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,OAAO,SAAsB,SAAQ,OAAmC;IAC5E,wDAAwD;IACjD,IAAI,CAAC,IAAgB,IAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACd,OAAO,GAA+C,EAAE,CAAC;IAEjE;;;OAGG;IACI,GAAG,CAAC,IAAY;QACrB,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK;YACP,OAAO,KAAK,CAAC;QAEf,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,IAAY;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IACjC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Events\r\n */\r\n\r\nimport { UnexpectedErrors } from \"./UnexpectedErrors\";\r\n\r\n/** A function invoked when a BeEvent is raised.\r\n * @public\r\n */\r\nexport type Listener = (...arg: any[]) => void;\r\n\r\ninterface EventContext {\r\n listener: Listener | undefined;\r\n scope: any;\r\n once: boolean;\r\n}\r\n\r\n/**\r\n * Manages a set of *listeners* for a particular event and notifies them when the event is raised.\r\n * This class is usually instantiated inside of a container class and\r\n * exposed as a property for others to *subscribe* via [[BeEvent.addListener]].\r\n * @public\r\n */\r\nexport class BeEvent<T extends Listener> {\r\n private _listeners: EventContext[] = [];\r\n private _insideRaiseEvent: boolean = false;\r\n\r\n /** The number of listeners currently subscribed to the event. */\r\n public get numberOfListeners() { return this._listeners.length; }\r\n\r\n /**\r\n * Registers a Listener to be executed whenever this event is raised.\r\n * @param listener The function to be executed when the event is raised.\r\n * @param scope An optional object scope to serve as the 'this' pointer when listener is invoked.\r\n * @returns A function that will remove this event listener.\r\n * @see [[BeEvent.raiseEvent]], [[BeEvent.removeListener]]\r\n */\r\n public addListener(listener: T, scope?: any): () => void {\r\n this._listeners.push({ listener, scope, once: false });\r\n return () => this.removeListener(listener, scope);\r\n }\r\n\r\n /**\r\n * Registers a callback function to be executed *only once* when the event is raised.\r\n * @param listener The function to be executed once when the event is raised.\r\n * @param scope An optional object scope to serve as the `this` pointer in which the listener function will execute.\r\n * @returns A function that will remove this event listener.\r\n * @see [[BeEvent.raiseEvent]], [[BeEvent.removeListener]]\r\n */\r\n public addOnce(listener: T, scope?: any): () => void {\r\n this._listeners.push({ listener, scope, once: true });\r\n return () => this.removeListener(listener, scope);\r\n }\r\n\r\n /**\r\n * Un-register a previously registered listener.\r\n * @param listener The listener to be unregistered.\r\n * @param scope The scope that was originally passed to addListener.\r\n * @returns 'true' if the listener was removed; 'false' if the listener and scope are not registered with the event.\r\n * @see [[BeEvent.raiseEvent]], [[BeEvent.addListener]]\r\n */\r\n public removeListener(listener: T, scope?: any): boolean {\r\n const listeners = this._listeners;\r\n\r\n for (let i = 0; i < listeners.length; ++i) {\r\n const context = listeners[i];\r\n if (context.listener === listener && context.scope === scope) {\r\n if (this._insideRaiseEvent) {\r\n context.listener = undefined;\r\n } else {\r\n listeners.splice(i, 1);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Raises the event by calling each registered listener with the supplied arguments.\r\n * @param args This method takes any number of parameters and passes them through to the listeners.\r\n * @see [[BeEvent.removeListener]], [[BeEvent.addListener]]\r\n */\r\n public raiseEvent(...args: Parameters<T>) {\r\n this._insideRaiseEvent = true;\r\n\r\n const listeners = this._listeners;\r\n const length = listeners.length;\r\n let dropped = false;\r\n\r\n for (let i = 0; i < length; ++i) {\r\n const context = listeners[i];\r\n if (!context.listener) {\r\n dropped = true;\r\n } else {\r\n try {\r\n context.listener.apply(context.scope, args);\r\n } catch (e) {\r\n UnexpectedErrors.handle(e);\r\n }\r\n if (context.once) {\r\n context.listener = undefined;\r\n dropped = true;\r\n }\r\n }\r\n }\r\n\r\n // if we had dropped listeners, remove them now\r\n if (dropped)\r\n this._listeners = this._listeners.filter((ctx) => ctx.listener !== undefined);\r\n\r\n this._insideRaiseEvent = false;\r\n }\r\n\r\n /** Determine whether this BeEvent has a specified listener registered.\r\n * @param listener The listener to check.\r\n * @param scope optional scope argument to match call to addListener\r\n */\r\n public has(listener: T, scope?: any): boolean {\r\n for (const ctx of this._listeners) {\r\n if (ctx.listener === listener && ctx.scope === scope) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /** Clear all Listeners from this BeEvent. */\r\n public clear(): void { this._listeners.length = 0; }\r\n}\r\n\r\n/** Specialization of BeEvent for events that take a single strongly typed argument, primarily used for UI events.\r\n * @public\r\n */\r\nexport class BeUiEvent<TEventArgs> extends BeEvent<(args: TEventArgs) => void> {\r\n /** Raises event with single strongly typed argument. */\r\n public emit(args: TEventArgs): void { this.raiseEvent(args); }\r\n}\r\n\r\n/**\r\n * A list of BeEvent objects, accessible by an event name.\r\n * This class may be used instead of explicitly declaring each BeEvent as a member of a containing class.\r\n * @public\r\n */\r\nexport class BeEventList<T extends Listener> {\r\n private _events: { [name: string]: BeEvent<T> | undefined } = {};\r\n\r\n /**\r\n * Gets the event associated with the specified name, creating the event if it does not already exist.\r\n * @param name The name of the event.\r\n */\r\n public get(name: string): BeEvent<T> {\r\n let event = this._events[name];\r\n if (event)\r\n return event;\r\n\r\n event = new BeEvent();\r\n this._events[name] = event;\r\n return event;\r\n }\r\n\r\n /**\r\n * Removes the event associated with a name.\r\n * @param name The name of the event.\r\n */\r\n public remove(name: string): void {\r\n this._events[name] = undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves the type of the callback function for an event type like [[BeEvent]].\r\n * For example:\r\n * ```ts\r\n * const event = new BeEvent<(x: number, y: string) => void>();\r\n * const callback: ListenerType<typeof event> = (x, y) => {\r\n * console.log(`${x}, ${y}`);\r\n * };\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport type ListenerType<TEvent extends {\r\n addListener(listener: Listener): () => void;\r\n}> =\r\n TEvent extends {\r\n addListener(listener: infer TListener): () => void;\r\n } ? TListener : never;\r\n"]}
1
+ {"version":3,"file":"BeEvent.js","sourceRoot":"","sources":["../../src/BeEvent.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Events\r\n */\r\n\r\nimport { UnexpectedErrors } from \"./UnexpectedErrors\";\r\n\r\n/** A function invoked when a BeEvent is raised.\r\n * @public\r\n */\r\nexport type Listener = (...arg: any[]) => void;\r\n\r\ninterface EventContext {\r\n listener: Listener | undefined;\r\n scope: any;\r\n once: boolean;\r\n}\r\n\r\n/**\r\n * Manages a set of *listeners* for a particular event and notifies them when the event is raised.\r\n * This class is usually instantiated inside of a container class and\r\n * exposed as a property for others to *subscribe* via [[BeEvent.addListener]].\r\n * @public\r\n */\r\nexport class BeEvent<T extends Listener> {\r\n private _listeners: EventContext[] = [];\r\n private _emitDepth: number = 0;\r\n\r\n /** The number of listeners currently subscribed to the event. */\r\n public get numberOfListeners() { return this._listeners.length; }\r\n\r\n /**\r\n * Registers a Listener to be executed whenever this event is raised.\r\n * @param listener The function to be executed when the event is raised.\r\n * @param scope An optional object scope to serve as the 'this' pointer when listener is invoked.\r\n * @returns A function that will remove this event listener.\r\n * @see [[BeEvent.raiseEvent]], [[BeEvent.removeListener]]\r\n */\r\n public addListener(listener: T, scope?: any): () => void {\r\n this._listeners.push({ listener, scope, once: false });\r\n return () => this.removeListener(listener, scope);\r\n }\r\n\r\n /**\r\n * Registers a callback function to be executed *only once* when the event is raised.\r\n * @param listener The function to be executed once when the event is raised.\r\n * @param scope An optional object scope to serve as the `this` pointer in which the listener function will execute.\r\n * @returns A function that will remove this event listener.\r\n * @see [[BeEvent.raiseEvent]], [[BeEvent.removeListener]]\r\n */\r\n public addOnce(listener: T, scope?: any): () => void {\r\n this._listeners.push({ listener, scope, once: true });\r\n return () => this.removeListener(listener, scope);\r\n }\r\n\r\n /**\r\n * Un-register a previously registered listener.\r\n * @param listener The listener to be unregistered.\r\n * @param scope The scope that was originally passed to addListener.\r\n * @returns 'true' if the listener was removed; 'false' if the listener and scope are not registered with the event.\r\n * @see [[BeEvent.raiseEvent]], [[BeEvent.addListener]]\r\n */\r\n public removeListener(listener: T, scope?: any): boolean {\r\n const listeners = this._listeners;\r\n\r\n for (let i = 0; i < listeners.length; ++i) {\r\n const context = listeners[i];\r\n if (context.listener === listener && context.scope === scope) {\r\n if (this._emitDepth > 0) {\r\n context.listener = undefined;\r\n } else {\r\n listeners.splice(i, 1);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Raises the event by calling each registered listener with the supplied arguments.\r\n * @param args This method takes any number of parameters and passes them through to the listeners.\r\n * @see [[BeEvent.removeListener]], [[BeEvent.addListener]]\r\n */\r\n public raiseEvent(...args: Parameters<T>) {\r\n this._emitDepth++;\r\n\r\n const listeners = this._listeners;\r\n const length = listeners.length;\r\n let dropped = false;\r\n\r\n for (let i = 0; i < length; ++i) {\r\n const context = listeners[i];\r\n if (!context.listener) {\r\n dropped = true;\r\n } else {\r\n try {\r\n context.listener.apply(context.scope, args);\r\n } catch (e) {\r\n UnexpectedErrors.handle(e);\r\n }\r\n if (!context.listener) {\r\n // listener was removed during its own callback\r\n dropped = true;\r\n } else if (context.once) {\r\n context.listener = undefined;\r\n dropped = true;\r\n }\r\n }\r\n }\r\n\r\n this._emitDepth--;\r\n\r\n // Only sweep tombstoned entries when the outermost emit completes,\r\n // so nested raiseEvent calls never mutate the array mid-iteration.\r\n if (dropped && this._emitDepth === 0)\r\n this._listeners = this._listeners.filter((ctx) => ctx.listener !== undefined);\r\n }\r\n\r\n /** Determine whether this BeEvent has a specified listener registered.\r\n * @param listener The listener to check.\r\n * @param scope optional scope argument to match call to addListener\r\n */\r\n public has(listener: T, scope?: any): boolean {\r\n for (const ctx of this._listeners) {\r\n if (ctx.listener === listener && ctx.scope === scope) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /** Clear all Listeners from this BeEvent. */\r\n public clear(): void { this._listeners.length = 0; }\r\n}\r\n\r\n/** Specialization of BeEvent for events that take a single strongly typed argument, primarily used for UI events.\r\n * @public\r\n */\r\nexport class BeUiEvent<TEventArgs> extends BeEvent<(args: TEventArgs) => void> {\r\n /** Raises event with single strongly typed argument. */\r\n public emit(args: TEventArgs): void { this.raiseEvent(args); }\r\n}\r\n\r\ninterface UnorderedEventContext {\r\n listener: Listener | undefined;\r\n scope: any;\r\n once: boolean;\r\n}\r\n\r\n/**\r\n * Manages a set of *listeners* for a particular event and notifies them when the event is raised.\r\n * Unlike [[BeEvent]], this class uses a `Set` internally to support safe concurrent modification\r\n * during emit. When a listener is removed during emit, it is marked for deferred removal instead\r\n * of mutating the set immediately.\r\n *\r\n * Listeners are managed exclusively through the disposal closure returned by [[addListener]] and\r\n * [[addOnce]]. There is no `removeListener` or `has` method — callers must capture the returned\r\n * closure to unsubscribe.\r\n * @beta\r\n */\r\nexport class BeUnorderedEvent<T extends Listener> {\r\n private _listeners: Set<UnorderedEventContext> = new Set();\r\n private _emitDepth: number = 0;\r\n private _hasTombstones: boolean = false;\r\n\r\n /** The number of listeners currently subscribed to the event.\r\n * @note During `raiseEvent()`, this may include listeners that have been removed or are one-shot\r\n * but are awaiting deferred cleanup. The count is accurate outside of `raiseEvent()`.\r\n */\r\n public get numberOfListeners() { return this._listeners.size; }\r\n\r\n /**\r\n * Registers a Listener to be executed whenever this event is raised.\r\n * @param listener The function to be executed when the event is raised.\r\n * @param scope An optional object scope to serve as the 'this' pointer when listener is invoked.\r\n * @returns A function that will remove this event listener in O(1).\r\n */\r\n public addListener(listener: T, scope?: any): () => void {\r\n const ctx: UnorderedEventContext = { listener, scope, once: false };\r\n this._listeners.add(ctx);\r\n return () => this._removeCtx(ctx);\r\n }\r\n\r\n /**\r\n * Registers a callback function to be executed *only once* when the event is raised.\r\n * @param listener The function to be executed once when the event is raised.\r\n * @param scope An optional object scope to serve as the `this` pointer in which the listener function will execute.\r\n * @returns A function that will remove this event listener in O(1).\r\n */\r\n public addOnce(listener: T, scope?: any): () => void {\r\n const ctx: UnorderedEventContext = { listener, scope, once: true };\r\n this._listeners.add(ctx);\r\n return () => this._removeCtx(ctx);\r\n }\r\n\r\n /** Remove a specific context entry, deferring during emit. */\r\n private _removeCtx(ctx: UnorderedEventContext): void {\r\n if (this._emitDepth > 0) {\r\n ctx.listener = undefined; // tombstone for deferred cleanup\r\n this._hasTombstones = true;\r\n } else {\r\n this._listeners.delete(ctx);\r\n }\r\n }\r\n\r\n /**\r\n * Raises the event by calling each registered listener with the supplied arguments.\r\n * @param args This method takes any number of parameters and passes them through to the listeners.\r\n */\r\n public raiseEvent(...args: Parameters<T>) {\r\n this._emitDepth++;\r\n\r\n for (const ctx of this._listeners) {\r\n if (!ctx.listener) {\r\n continue;\r\n }\r\n try {\r\n ctx.listener.apply(ctx.scope, args);\r\n } catch (e) {\r\n UnexpectedErrors.handle(e);\r\n }\r\n if (ctx.listener && ctx.once) {\r\n ctx.listener = undefined;\r\n this._hasTombstones = true;\r\n }\r\n }\r\n\r\n this._emitDepth--;\r\n\r\n // Only clean up tombstoned entries when we're back at the outermost emit\r\n if (this._hasTombstones && this._emitDepth === 0) {\r\n this._hasTombstones = false;\r\n for (const ctx of this._listeners) {\r\n if (ctx.listener === undefined)\r\n this._listeners.delete(ctx);\r\n }\r\n }\r\n }\r\n\r\n /** Clear all listeners from this BeUnorderedEvent.\r\n * @note If called during `raiseEvent`, remaining listeners in the current iteration are skipped\r\n * immediately rather than being tombstoned.\r\n */\r\n public clear(): void { this._listeners.clear(); }\r\n}\r\n\r\n/** Specialization of BeUnorderedEvent for events that take a single strongly typed argument, primarily used for UI events.\r\n * @beta\r\n */\r\nexport class BeUnorderedUiEvent<TEventArgs> extends BeUnorderedEvent<(args: TEventArgs) => void> {\r\n /** Raises event with single strongly typed argument. */\r\n public emit(args: TEventArgs): void { this.raiseEvent(args); }\r\n}\r\n\r\n/**\r\n * A list of BeEvent objects, accessible by an event name.\r\n * This class may be used instead of explicitly declaring each BeEvent as a member of a containing class.\r\n * @public\r\n */\r\nexport class BeEventList<T extends Listener> {\r\n private _events: { [name: string]: BeEvent<T> | undefined } = {};\r\n\r\n /**\r\n * Gets the event associated with the specified name, creating the event if it does not already exist.\r\n * @param name The name of the event.\r\n */\r\n public get(name: string): BeEvent<T> {\r\n let event = this._events[name];\r\n if (event)\r\n return event;\r\n\r\n event = new BeEvent();\r\n this._events[name] = event;\r\n return event;\r\n }\r\n\r\n /**\r\n * Removes the event associated with a name.\r\n * @param name The name of the event.\r\n */\r\n public remove(name: string): void {\r\n this._events[name] = undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves the type of the callback function for an event type like [[BeEvent]].\r\n * For example:\r\n * ```ts\r\n * const event = new BeEvent<(x: number, y: string) => void>();\r\n * const callback: ListenerType<typeof event> = (x, y) => {\r\n * console.log(`${x}, ${y}`);\r\n * };\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport type ListenerType<TEvent extends {\r\n addListener(listener: Listener): () => void;\r\n}> =\r\n TEvent extends {\r\n addListener(listener: infer TListener): () => void;\r\n } ? TListener : never;\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Id.d.ts","sourceRoot":"","sources":["../../src/Id.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Id.d.ts","sourceRoot":"","sources":["../../src/Id.ts"],"names":[],"mappings":"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"}
package/lib/esm/Id.js CHANGED
@@ -298,9 +298,7 @@ export var Id64;
298
298
  * ```
299
299
  */
300
300
  function iterable(ids) {
301
- return {
302
- [Symbol.iterator]: () => iterator(ids),
303
- };
301
+ return typeof ids === "string" ? [ids] : ids;
304
302
  }
305
303
  Id64.iterable = iterable;
306
304
  /** Return the first [[Id64String]] of an [[Id64Arg]]. */
package/lib/esm/Id.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Id.js","sourceRoot":"","sources":["../../src/Id.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Ids\r\n */\r\n\r\n/** A string containing a well-formed string representation of an [Id64]($core-bentley).\r\n * See [Working with Ids]($docs/learning/common/Id64.md).\r\n * @public\r\n */\r\nexport type Id64String = string;\r\n\r\n/** A string containing a well-formed string representation of a [Guid]($core-bentley).\r\n * @public\r\n */\r\nexport type GuidString = string;\r\n\r\n/** A set of [[Id64String]]s.\r\n * @public\r\n */\r\nexport type Id64Set = Set<Id64String>;\r\n\r\n/** An array of [[Id64String]]s.\r\n * @public\r\n */\r\nexport type Id64Array = Id64String[];\r\n\r\n/** Used as an argument to a function that can accept one or more [[Id64String]]s.\r\n * @public\r\n */\r\nexport type Id64Arg = Id64String | Id64Set | Id64Array;\r\n\r\nfunction toHex(str: string): number {\r\n const v = parseInt(str, 16);\r\n return Number.isNaN(v) ? 0 : v;\r\n}\r\n\r\nfunction isLowerCaseNonZeroHexDigit(str: string, index: number) {\r\n return isLowerCaseHexDigit(str, index, false);\r\n}\r\n\r\nfunction isLowerCaseHexDigit(str: string, index: number, allowZero: boolean = true): boolean {\r\n const charCode = str.charCodeAt(index);\r\n const minDecimalDigit = allowZero ? 0x30 : 0x31; // '0' or '1'...\r\n return (charCode >= minDecimalDigit && charCode <= 0x39) || (charCode >= 0x61 && charCode <= 0x66); // '0'-'9, 'a' -'f'\r\n}\r\n\r\nfunction isValidHexString(id: string, startIndex: number, len: number) {\r\n if (len === 0)\r\n return false;\r\n\r\n // No leading zeroes...\r\n if (!isLowerCaseNonZeroHexDigit(id, startIndex))\r\n return false;\r\n\r\n // ...followed by len-1 lowercase hexadecimal digits.\r\n for (let i = 1; i < len; i++)\r\n if (!isLowerCaseHexDigit(id, startIndex + i))\r\n return false;\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * The Id64 namespace provides facilities for working with 64-bit identifiers. These Ids are stored as 64-bit integers inside an [[IModelDb]], but must be represented\r\n * as strings in JavaScript because JavaScript does not intrinsically support 64-bit integers.\r\n *\r\n * The [[Id64String]] type alias is used to indicate function arguments, return types, and variables which are known to contain a well-formed representation of a 64-bit Id.\r\n *\r\n * See [Working with Ids]($docs/learning/common/Id64.md) for a detailed description and code examples.\r\n * @public\r\n */\r\nexport namespace Id64 {\r\n /** Extract the \"local\" Id portion of an Id64String, contained in the lower 40 bits of the 64-bit value. */\r\n export function getLocalId(id: Id64String): number {\r\n if (isInvalid(id))\r\n return 0;\r\n\r\n const len = id.length;\r\n const start = (len > 12) ? (len - 10) : 2;\r\n return toHex(id.slice(start));\r\n }\r\n\r\n /** Extract the briefcase Id portion of an Id64String, contained in the upper 24 bits of the 64-bit value. */\r\n export function getBriefcaseId(id: Id64String): number {\r\n if (isInvalid(id))\r\n return 0;\r\n\r\n const len = id.length;\r\n return (len <= 12) ? 0 : toHex(id.slice(2, len - 10));\r\n }\r\n\r\n /** Create an Id64String from its JSON representation.\r\n * @param prop The JSON representation of an Id.\r\n * @returns A well-formed Id string.\r\n * @note if the input is undefined, the result is \"0\", indicating an invalid Id.\r\n * @note if the input is not undefined, the result is the same as that of [[Id64.fromString]].\r\n */\r\n export function fromJSON(prop?: string): Id64String {\r\n return typeof prop === \"string\" ? Id64.fromString(prop) : Id64.invalid;\r\n }\r\n\r\n /** Given a string value, attempt to normalize it into a well-formed Id string.\r\n * If the input is already a well-formed Id string, it is returned unmodified.\r\n * Otherwise, the input is trimmed of leading and trailing whitespace, converted to lowercase, and an attempt is made to parse it as a 64-bit hexadecimal integer.\r\n * If parsing succeeds the normalized result is returned; otherwise the result is \"0\", indicating an invalid Id.\r\n *\r\n * For a description of \"well-formed\", see [Working with Ids]($docs/learning/common/Id64.md).\r\n */\r\n export function fromString(val: string): Id64String {\r\n // NB: in case this is called from JavaScript, we must check the run-time type...\r\n if (typeof val !== \"string\")\r\n return invalid;\r\n\r\n // Skip the common case in which the input is already a well-formed Id string\r\n if (Id64.isId64(val))\r\n return val;\r\n\r\n // Attempt to normalize the input into a well-formed Id string\r\n val = val.toLowerCase().trim();\r\n const len = val.length;\r\n if (len < 2 || val[0] !== \"0\" || val[1] !== \"x\")\r\n return invalid;\r\n\r\n let low = 0;\r\n let high = 0;\r\n let start = 2;\r\n if (len > 12) {\r\n start = (len - 10);\r\n high = toHex(val.slice(2, start));\r\n }\r\n\r\n low = toHex(val.slice(start));\r\n return fromLocalAndBriefcaseIds(low, high);\r\n }\r\n\r\n // Used when constructing local ID portion of Id64String. Performance optimization.\r\n const _localIdPrefixByLocalIdLength = [\r\n \"0000000000\",\r\n \"000000000\",\r\n \"00000000\",\r\n \"0000000\",\r\n \"000000\",\r\n \"00000\",\r\n \"0000\",\r\n \"000\",\r\n \"00\",\r\n \"0\",\r\n \"\",\r\n ];\r\n\r\n /** Produce an Id string from a local and briefcase Id.\r\n * @param localId The non-zero local Id as an unsigned 40-bit integer.\r\n * @param briefcaseId The briefcase Id as an unsigned 24-bit integer.\r\n * @returns an Id64String containing the hexadecimal string representation of the unsigned 64-bit integer which would result from the\r\n * operation `localId | (briefcaseId << 40)`, or an invalid Id \"0\" if the inputs are invalid.\r\n */\r\n export function fromLocalAndBriefcaseIds(localId: number, briefcaseId: number): Id64String {\r\n // NB: Yes, we must check the run-time type...\r\n if (typeof localId !== \"number\" || typeof briefcaseId !== \"number\")\r\n return invalid;\r\n\r\n localId = Math.floor(localId);\r\n if (0 === localId)\r\n return invalid;\r\n\r\n briefcaseId = Math.floor(briefcaseId);\r\n const lowStr = localId.toString(16);\r\n return `0x${(briefcaseId === 0) ? lowStr : (briefcaseId.toString(16) + (_localIdPrefixByLocalIdLength[lowStr.length] + lowStr))}`;\r\n }\r\n\r\n // Used as a buffer when converting a pair of 32-bit integers to an Id64String. Significant performance optimization.\r\n const scratchCharCodes = [\r\n 0x30, // \"0\"\r\n 0x78, // \"x\"\r\n 0x30, // \"0\"\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n ];\r\n\r\n // Convert 4-bit unsigned integer to char code representing lower-case hexadecimal digit.\r\n function uint4ToCharCode(uint4: number): number {\r\n return uint4 + (uint4 < 10 ? 0x30 : 0x57);\r\n }\r\n\r\n // Convert char code representing lower-case hexadecimal digit to 4-bit unsigned integer.\r\n function charCodeToUint4(char: number): number {\r\n return char - (char >= 0x57 ? 0x57 : 0x30);\r\n }\r\n\r\n // Convert a substring to a uint32. This is twice as fast as using Number.parseInt().\r\n function substringToUint32(id: Id64String, start: number, end: number): number {\r\n let uint32 = 0;\r\n for (let i = start; i < end; i++) {\r\n const uint4 = charCodeToUint4(id.charCodeAt(i));\r\n const shift = (end - i - 1) << 2;\r\n const mask = uint4 << shift;\r\n uint32 = (uint32 | mask) >>> 0; // >>> 0 to force unsigned because javascript\r\n }\r\n\r\n return uint32;\r\n }\r\n\r\n /** Create an Id64String from a pair of unsigned 32-bit integers.\r\n * @param lowBytes The lower 4 bytes of the Id\r\n * @param highBytes The upper 4 bytes of the Id\r\n * @returns an Id64String containing the hexadecimal string representation of the unsigned 64-bit integer which would result from the\r\n * operation `lowBytes | (highBytes << 32)`.\r\n * @see [[Id64.fromUint32PairObject]] if you have a [[Id64.Uint32Pair]] object.\r\n */\r\n export function fromUint32Pair(lowBytes: number, highBytes: number): Id64String {\r\n const localIdLow = lowBytes >>> 0;\r\n const localIdHigh = (highBytes & 0x000000ff) * (0xffffffff + 1); // aka (highBytes & 0xff) << 32\r\n const localId = localIdLow + localIdHigh; // aka localIdLow | localIdHigh\r\n if (0 === localId)\r\n return invalid;\r\n\r\n // Need to omit or preserve leading zeroes...\r\n const buffer = scratchCharCodes;\r\n let index = 2;\r\n for (let i = 7; i >= 0; i--) {\r\n const shift = i << 2;\r\n const mask = 0xf << shift;\r\n const uint4 = (highBytes & mask) >>> shift;\r\n if (index > 2 || 0 !== uint4)\r\n buffer[index++] = uint4ToCharCode(uint4);\r\n }\r\n\r\n for (let i = 7; i >= 0; i--) {\r\n const shift = i << 2;\r\n const mask = 0xf << shift;\r\n const uint4 = (lowBytes & mask) >>> shift;\r\n if (index > 2 || 0 !== uint4)\r\n buffer[index++] = uint4ToCharCode(uint4);\r\n }\r\n\r\n if (buffer.length !== index)\r\n buffer.length = index;\r\n\r\n return String.fromCharCode(...scratchCharCodes);\r\n }\r\n\r\n /** Create an Id64String from a [[Id64.Uint32Pair]].\r\n * @see [[Id64.fromUint32Pair]].\r\n */\r\n export function fromUint32PairObject(pair: Uint32Pair): Id64String {\r\n return fromUint32Pair(pair.lower, pair.upper);\r\n }\r\n\r\n /** Returns true if the inputs represent two halves of a valid 64-bit Id.\r\n * @see [[Id64.Uint32Pair]].\r\n */\r\n export function isValidUint32Pair(lowBytes: number, highBytes: number): boolean {\r\n // Detect local ID of zero\r\n return 0 !== lowBytes || 0 !== (highBytes & 0x000000ff);\r\n }\r\n\r\n /** Represents an [[Id64]] as a pair of unsigned 32-bit integers. Because Javascript lacks efficient support for 64-bit integers,\r\n * this representation can be useful in performance-sensitive code like the render loop.\r\n * @see [[Id64.getUint32Pair]] to convert an [[Id64String]] to a Uint32Pair.\r\n * @see [[Id64.fromUint32Pair]] to convert a Uint32Pair to an [[Id64String]].\r\n * @see [[Id64.Uint32Set]] and [[Id64.Uint32Map]] for collections based on Uint32Pairs.\r\n */\r\n export interface Uint32Pair {\r\n /** The lower 4 bytes of the 64-bit integer. */\r\n lower: number;\r\n /** The upper 4 bytes of the 64-bit integer. */\r\n upper: number;\r\n }\r\n\r\n /** Convert an Id64String to a 64-bit unsigned integer represented as a pair of unsigned 32-bit integers.\r\n * @param id The well-formed string representation of a 64-bit Id.\r\n * @param out Used as the return value if supplied; otherwise a new object is returned.\r\n * @returns An object containing the parsed lower and upper 32-bit integers comprising the 64-bit Id.\r\n */\r\n export function getUint32Pair(id: Id64String, out?: Uint32Pair): Uint32Pair {\r\n if (!out)\r\n out = { lower: 0, upper: 0 };\r\n\r\n out.lower = getLowerUint32(id);\r\n out.upper = getUpperUint32(id);\r\n return out;\r\n }\r\n\r\n /** Extract an unsigned 32-bit integer from the lower 4 bytes of an Id64String. */\r\n export function getLowerUint32(id: Id64String): number {\r\n if (isInvalid(id))\r\n return 0;\r\n\r\n const end = id.length;\r\n const start = end > 10 ? end - 8 : 2;\r\n return substringToUint32(id, start, end);\r\n }\r\n\r\n /** Extract an unsigned 32-bit integer from the upper 4 bytes of an Id64String. */\r\n export function getUpperUint32(id: Id64String): number {\r\n const len = id.length;\r\n if (len <= 10 || isInvalid(id))\r\n return 0;\r\n\r\n return substringToUint32(id, 2, len - 8);\r\n }\r\n\r\n /** Convert an [[Id64Arg]] into an [[Id64Set]].\r\n *\r\n * This method can be used by functions that accept an Id64Arg to conveniently process the value(s). For example:\r\n * ```ts\r\n * public addCategories(arg: Id64Arg) { Id64.toIdSet(arg).forEach((id) => this.categories.add(id)); }\r\n * ```\r\n *\r\n * Alternatively, to avoid allocating a new Id64Set, use [[Id64.iterable]].\r\n *\r\n * @param arg The Ids to convert to an Id64Set.\r\n * @param makeCopy If true, and the input is already an Id64Set, returns a deep copy of the input.\r\n * @returns An Id64Set containing the set of [[Id64String]]s represented by the Id64Arg.\r\n */\r\n export function toIdSet(arg: Id64Arg, makeCopy: boolean = false): Id64Set {\r\n if (arg instanceof Set)\r\n return makeCopy ? new Set<string>(arg) : arg;\r\n\r\n const ids = new Set<Id64String>();\r\n if (typeof arg === \"string\")\r\n ids.add(arg);\r\n else if (Array.isArray(arg)) {\r\n arg.forEach((id: Id64String) => {\r\n if (typeof id === \"string\")\r\n ids.add(id);\r\n });\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n /** Obtain iterator over the specified Ids.\r\n * @see [[Id64.iterable]].\r\n */\r\n export function* iterator(ids: Id64Arg): Iterator<Id64String> {\r\n if (typeof ids === \"string\") {\r\n yield ids;\r\n } else {\r\n for (const id of ids)\r\n yield id;\r\n }\r\n }\r\n\r\n /** Obtain an iterable over the specified Ids. Example usage:\r\n * ```ts\r\n * const ids = [\"0x123\", \"0xfed\"];\r\n * for (const id of Id64.iterable(ids))\r\n * console.log(id);\r\n * ```\r\n */\r\n export function iterable(ids: Id64Arg): Iterable<Id64String> {\r\n return {\r\n [Symbol.iterator]: () => iterator(ids),\r\n };\r\n }\r\n\r\n /** Return the first [[Id64String]] of an [[Id64Arg]]. */\r\n export function getFirst(arg: Id64Arg): Id64String {\r\n return typeof arg === \"string\" ? arg : (Array.isArray(arg) ? arg[0] : arg.values().next().value) ?? Id64.invalid;\r\n }\r\n\r\n /** Return the number of [[Id64String]]s represented by an [[Id64Arg]]. */\r\n export function sizeOf(arg: Id64Arg): number {\r\n return typeof arg === \"string\" ? 1 : (Array.isArray(arg) ? arg.length : arg.size);\r\n }\r\n\r\n /** Returns true if the [[Id64Arg]] contains the specified Id. */\r\n export function has(arg: Id64Arg, id: Id64String): boolean {\r\n if (typeof arg === \"string\")\r\n return arg === id;\r\n if (Array.isArray(arg))\r\n return -1 !== arg.indexOf(id);\r\n\r\n return arg.has(id);\r\n }\r\n\r\n /** The string representation of an invalid Id. */\r\n export const invalid = \"0\";\r\n\r\n /** Determine if the supplied id string represents a transient Id.\r\n * @param id A well-formed Id string.\r\n * @returns true if the Id represents a transient Id.\r\n * @note This method assumes the input is a well-formed Id string.\r\n * @see [[Id64.isTransientId64]]\r\n * @see [[TransientIdSequence]]\r\n */\r\n export function isTransient(id: Id64String): boolean {\r\n // A transient Id is of the format \"0xffffffxxxxxxxxxx\" where the leading 6 digits indicate an invalid briefcase Id.\r\n return 18 === id.length && id.startsWith(\"0xffffff\");\r\n }\r\n\r\n /** Determine if the input is a well-formed [[Id64String]] and represents a transient Id.\r\n * @see [[Id64.isTransient]]\r\n * @see [[Id64.isId64]]\r\n * @see [[TransientIdSequence]]\r\n */\r\n export function isTransientId64(id: string): boolean {\r\n return isValidId64(id) && isTransient(id);\r\n }\r\n\r\n /** Determine if the input is a well-formed [[Id64String]].\r\n *\r\n * For a description of \"well-formed\", see [Working with Ids]($docs/learning/common/Id64.md).\r\n * @see [[Id64.isValidId64]]\r\n */\r\n export function isId64(id: string): boolean {\r\n const len = id.length;\r\n if (0 === len || 18 < len)\r\n return false;\r\n\r\n if (\"0\" !== id[0])\r\n return false;\r\n\r\n // Well-formed invalid Id: \"0\"\r\n if (1 === len)\r\n return true;\r\n\r\n // Valid Ids begin with \"0x\" followed by at least one lower-case hexadecimal digit.\r\n if (2 === len || \"x\" !== id[1])\r\n return false;\r\n\r\n // If briefcase Id is present, it occupies at least one digit, followed by 10 digits for local Id\r\n let localIdStart = 2;\r\n if (len > 12) {\r\n localIdStart = len - 10;\r\n\r\n // Verify briefcase Id\r\n if (!isValidHexString(id, 2, localIdStart - 2))\r\n return false;\r\n\r\n // Skip leading zeroes in local Id\r\n for (let i = localIdStart; i < len; i++) {\r\n if (0x30 !== id.charCodeAt(i)) // '0'\r\n break;\r\n else\r\n localIdStart++;\r\n }\r\n\r\n if (localIdStart >= len)\r\n return false;\r\n }\r\n\r\n return isValidHexString(id, localIdStart, len - localIdStart);\r\n }\r\n\r\n /** Returns true if the input is not equal to the representation of an invalid Id.\r\n * @note This method assumes the input is a well-formed Id string.\r\n * @see [[Id64.isInvalid]]\r\n * @see [[Id64.isValidId64]]\r\n */\r\n export function isValid(id: Id64String): boolean {\r\n return Id64.invalid !== id;\r\n }\r\n\r\n /** Returns true if the input is a well-formed [[Id64String]] representing a valid Id.\r\n * @see [[Id64.isValid]]\r\n * @see [[Id64.isId64]]\r\n */\r\n export function isValidId64(id: string): boolean {\r\n return Id64.invalid !== id && Id64.isId64(id);\r\n }\r\n\r\n /** Returns true if the input is a well-formed [[Id64String]] representing an invalid Id.\r\n * @see [[Id64.isValid]]\r\n */\r\n export function isInvalid(id: Id64String): boolean {\r\n return Id64.invalid === id;\r\n }\r\n\r\n /** A specialized replacement for Set<Id64String> optimized for performance-critical code which represents large sets of [[Id64]]s as pairs of\r\n * 32-bit integers.\r\n * The internal representation is a Map<number, Set<number>> where the Map key is the upper 4 bytes of the IDs and the Set elements are the lower 4 bytes of the IDs.\r\n * Because the upper 4 bytes store the 24-bit briefcase ID plus the upper 8 bits of the local ID, there will be a very small distribution of unique Map keys.\r\n * To further optimize this data type, the following assumptions are made regarding the { lower, upper } inputs, and no validation is performed to confirm them:\r\n * - The inputs are unsigned 32-bit integers;\r\n * - The inputs represent a valid Id64String (e.g., local ID is not zero).\r\n * @see [[Id64.Uint32Map]] for a similarly-optimized replacement for Map<Id64String, T>\r\n * @public\r\n */\r\n export class Uint32Set {\r\n protected readonly _map = new Map<number, Set<number>>();\r\n\r\n /** Construct a new Uint32Set.\r\n * @param ids If supplied, all of the specified Ids will be added to the new set.\r\n */\r\n public constructor(ids?: Id64Arg) {\r\n if (undefined !== ids)\r\n this.addIds(ids);\r\n }\r\n\r\n /** Return true if `this` and `other` contain the same set of Ids. */\r\n public equals(other: Uint32Set): boolean {\r\n if (this === other) {\r\n return true;\r\n }\r\n\r\n if (this.size !== other.size) {\r\n return false;\r\n }\r\n\r\n for (const [key, thisValue] of this._map) {\r\n const otherValue = other._map.get(key);\r\n if (!otherValue || thisValue.size !== otherValue.size) {\r\n return false;\r\n }\r\n\r\n for (const value of thisValue) {\r\n if (!otherValue.has(value)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Remove all contents of this set. */\r\n public clear(): void {\r\n this._map.clear();\r\n }\r\n\r\n /** Add an Id to the set. */\r\n public addId(id: Id64String): void {\r\n this.add(Id64.getLowerUint32(id), Id64.getUpperUint32(id));\r\n }\r\n\r\n /** Add any number of Ids to the set. */\r\n public addIds(ids: Id64Arg): void {\r\n for (const id of Id64.iterable(ids))\r\n this.addId(id);\r\n }\r\n\r\n /** Returns true if the set contains the specified Id. */\r\n public hasId(id: Id64String): boolean { return this.has(Id64.getLowerUint32(id), Id64.getUpperUint32(id)); }\r\n\r\n /** Add an Id to the set. */\r\n public add(low: number, high: number): void {\r\n let set = this._map.get(high);\r\n if (undefined === set) {\r\n set = new Set<number>();\r\n this._map.set(high, set);\r\n }\r\n\r\n set.add(low);\r\n }\r\n\r\n /** Remove an Id from the set. */\r\n public deleteId(id: Id64String): void {\r\n this.delete(Id64.getLowerUint32(id), Id64.getUpperUint32(id));\r\n }\r\n\r\n /** Remove any number of Ids from the set. */\r\n public deleteIds(ids: Id64Arg): void {\r\n for (const id of Id64.iterable(ids))\r\n this.deleteId(id);\r\n }\r\n\r\n /** Remove an Id from the set. */\r\n public delete(low: number, high: number): void {\r\n const set = this._map.get(high);\r\n if (undefined !== set) {\r\n set.delete(low);\r\n if (set.size === 0)\r\n this._map.delete(high);\r\n }\r\n }\r\n\r\n /** Returns true if the set contains the specified Id. */\r\n public has(low: number, high: number): boolean {\r\n const set = this._map.get(high);\r\n return undefined !== set && set.has(low);\r\n }\r\n\r\n /** Returns true if the set contains the Id specified by `pair`. */\r\n public hasPair(pair: Uint32Pair): boolean {\r\n return this.has(pair.lower, pair.upper);\r\n }\r\n\r\n /** Returns true if the set contains no Ids. */\r\n public get isEmpty(): boolean { return 0 === this._map.size; }\r\n\r\n /** Returns the number of Ids contained in the set. */\r\n public get size(): number {\r\n let size = 0;\r\n for (const entry of this._map)\r\n size += entry[1].size;\r\n\r\n return size;\r\n }\r\n\r\n /** Populates and returns an array of all Ids contained in the set. */\r\n public toId64Array(): Id64Array {\r\n const ids: Id64Array = [];\r\n for (const entry of this._map)\r\n for (const low of entry[1])\r\n ids.push(Id64.fromUint32Pair(low, entry[0]));\r\n\r\n return ids;\r\n }\r\n\r\n /** Populates and returns a set of all Ids contained in the set. */\r\n public toId64Set(): Id64Set {\r\n const ids = new Set<string>();\r\n for (const entry of this._map)\r\n for (const low of entry[1])\r\n ids.add(Id64.fromUint32Pair(low, entry[0]));\r\n\r\n return ids;\r\n }\r\n\r\n /** Execute a function against each Id in this set. */\r\n public forEach(func: (lo: number, hi: number) => void): void {\r\n for (const entry of this._map)\r\n for (const lo of entry[1])\r\n func(lo, entry[0]);\r\n }\r\n }\r\n\r\n /** A specialized replacement for Map<Id64String, T> optimized for performance-critical code.\r\n * @see [[Id64.Uint32Set]] for implementation details.\r\n * @public\r\n */\r\n export class Uint32Map<T> {\r\n protected readonly _map = new Map<number, Map<number, T>>();\r\n\r\n /** Remove all entries from the map. */\r\n public clear(): void { this._map.clear(); }\r\n /** Find an entry in the map by Id. */\r\n public getById(id: Id64String): T | undefined { return this.get(Id64.getLowerUint32(id), Id64.getUpperUint32(id)); }\r\n /** Set an entry in the map by Id. */\r\n public setById(id: Id64String, value: T): void { this.set(Id64.getLowerUint32(id), Id64.getUpperUint32(id), value); }\r\n\r\n /** Set an entry in the map by Id components. */\r\n public set(low: number, high: number, value: T): void {\r\n let map = this._map.get(high);\r\n if (undefined === map) {\r\n map = new Map<number, T>();\r\n this._map.set(high, map);\r\n }\r\n\r\n map.set(low, value);\r\n }\r\n\r\n /** Get an entry from the map by Id components. */\r\n public get(low: number, high: number): T | undefined {\r\n const map = this._map.get(high);\r\n return undefined !== map ? map.get(low) : undefined;\r\n }\r\n\r\n /** Returns true if the map contains no entries. */\r\n public get isEmpty(): boolean { return 0 === this._map.size; }\r\n /** Returns the number of entries in the map. */\r\n public get size(): number {\r\n let size = 0;\r\n for (const entry of this._map)\r\n size += entry[1].size;\r\n\r\n return size;\r\n }\r\n\r\n /** Execute a function against each entry in this map. */\r\n public forEach(func: (lo: number, hi: number, value: T) => void): void {\r\n for (const outerEntry of this._map)\r\n for (const innerEntry of outerEntry[1])\r\n func(innerEntry[0], outerEntry[0], innerEntry[1]);\r\n }\r\n }\r\n}\r\n\r\n/** JSON representation of a [[TransientIdSequence]], primarily useful for transferring sequences to and from a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).\r\n * It stores two \"local\" 40-bit Ids describing the range of [Id64String]($docs/learning/common/Id64.md)s generated by the sequence.\r\n * @public\r\n */\r\nexport interface TransientIdSequenceProps {\r\n /** The starting local Id. The sequence begins at `initialLocalId + 1`. */\r\n initialLocalId: number;\r\n /** The maximum local Id generated by the sequence thus far. It is never less than [[initialLocalId]]. If it is equal to [[initialLocalId]], then the sequence has\r\n * not yet generated any Ids.\r\n * The next local Id generated by the sequence will be `currentLocalId + 1`.\r\n */\r\n currentLocalId: number;\r\n}\r\n\r\nfunction validateLocalId(num: number): void {\r\n if (num < 0 || Math.round(num) !== num) {\r\n throw new Error(\"Local Id must be a non-negative integer\");\r\n }\r\n}\r\n\r\n/** A function returned by [[TransientIdSequence.merge]] that remaps the local Id portion of an [Id64String]($docs/learning/common/Id64.md) generated by\r\n * the source sequence to the corresponding local Id in the target sequence.\r\n * It returns `sourceLocalId` if the input did not originate from the source sequence.\r\n* @public\r\n*/\r\nexport type RemapTransientLocalId = (sourceLocalId: number) => number;\r\n\r\n/**\r\n * Generates unique [[Id64String]] values in sequence, which are guaranteed not to conflict with Ids associated with persistent elements or models.\r\n * This is useful for associating stable, non-persistent identifiers with things like [Decorator]($frontend)s.\r\n * A TransientIdSequence can generate a maximum of (2^40)-2 unique Ids.\r\n * @public\r\n */\r\nexport class TransientIdSequence {\r\n /** The starting local Id provided to the constructor. The sequence begins at `initialLocalId + 1`. */\r\n public readonly initialLocalId: number;\r\n private _localId: number;\r\n\r\n /** Constructor.\r\n * @param initialLocalId The starting local Id. The local Id of the first [[Id64String]] generated by [[getNext]] will be `initialLocalId + 1`.\r\n */\r\n public constructor(initialLocalId = 0) {\r\n validateLocalId(initialLocalId);\r\n this.initialLocalId = initialLocalId;\r\n this._localId = initialLocalId;\r\n }\r\n\r\n /** The maximum local Id generated by the sequence thus far. It is never less than [[initialLocalId]]. If it is equal to [[initialLocalId]], then the sequence has\r\n * not yet generated any Ids.\r\n * Each call to [[getNext]] increments this by 1 and uses it as the local Id of the generated [[Id64String]].\r\n */\r\n public get currentLocalId(): number {\r\n return this._localId;\r\n }\r\n\r\n /** Generate and return the next transient Id64String in the sequence. */\r\n public getNext(): Id64String {\r\n return Id64.fromLocalAndBriefcaseIds(++this._localId, 0xffffff);\r\n }\r\n\r\n /** Preview the transient Id64String that will be returned by the next call to [[getNext]].\r\n * This is primarily useful for tests.\r\n */\r\n public peekNext(): Id64String {\r\n return Id64.fromLocalAndBriefcaseIds(this._localId + 1, 0xffffff);\r\n }\r\n\r\n /** Convert this sequence to its JSON representation. */\r\n public toJSON(): TransientIdSequenceProps {\r\n return {\r\n initialLocalId: this.initialLocalId,\r\n currentLocalId: this.currentLocalId,\r\n };\r\n }\r\n\r\n /** Create a sequence from its JSON representation. */\r\n public static fromJSON(props: TransientIdSequenceProps): TransientIdSequence {\r\n validateLocalId(props.currentLocalId);\r\n const sequence = new TransientIdSequence(props.initialLocalId);\r\n sequence._localId = props.currentLocalId;\r\n return sequence;\r\n }\r\n\r\n /** Obtain the JSON representation of a new sequence that diverges from this sequence, with its [[initialLocalId]] set to this sequence's [[currentLocalId]].\r\n * The two sequences can generate Ids independently. Later, you can [[merge]] the sequences, resolving conflicts where the two sequences generated identical Ids.\r\n * This is chiefly useful when generating transient Ids on a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).\r\n */\r\n public fork(): TransientIdSequenceProps {\r\n return {\r\n initialLocalId: this.currentLocalId,\r\n currentLocalId: this.currentLocalId,\r\n };\r\n }\r\n\r\n /** Integrate the Ids generated by a [[fork]] of this sequence. All of the Ids generated by `source` will be remapped to Ids at the end of this sequence.\r\n * This is chiefly useful when generating transient Ids on a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).\r\n * @param source The JSON representation of the [[fork]]ed sequence to be merged with this one.\r\n * @returns a function that permits you to remap the local Ids generated by `source` into the corresponding local Ids assigned by this sequence.\r\n * @throws Error if `source` is not a fork of this sequence or is malformed (e.g., contains negative and/or non-integer local Ids).\r\n */\r\n public merge(source: TransientIdSequenceProps): (sourceLocalId: number) => number {\r\n const { initialLocalId, currentLocalId } = source;\r\n\r\n validateLocalId(initialLocalId);\r\n validateLocalId(currentLocalId);\r\n\r\n if (initialLocalId > this.currentLocalId) {\r\n throw new Error(\"Transient Id sequences do not intersect\");\r\n }\r\n\r\n if (initialLocalId > currentLocalId) {\r\n throw new Error(\"Current local Id cannot be less than initial local Id\");\r\n }\r\n\r\n const delta = this.currentLocalId - initialLocalId;\r\n this._localId += currentLocalId - initialLocalId;\r\n\r\n return (sourceLocalId: number) => {\r\n if (sourceLocalId > initialLocalId && sourceLocalId <= currentLocalId) {\r\n return sourceLocalId + delta;\r\n }\r\n\r\n return sourceLocalId;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * The Guid namespace provides facilities for working with GUID strings using the \"8-4-4-4-12\" pattern.\r\n *\r\n * The [[GuidString]] type alias is used to indicate function arguments, return types, and variables which are known to\r\n * be in the GUID format.\r\n * @public\r\n */\r\nexport namespace Guid {\r\n const uuidPattern = new RegExp(\"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\");\r\n\r\n /** Represents the empty Guid 00000000-0000-0000-0000-000000000000 */\r\n export const empty: GuidString = \"00000000-0000-0000-0000-000000000000\";\r\n\r\n /** Determine whether the input string is \"guid-like\". That is, it follows the 8-4-4-4-12 pattern. This does not enforce\r\n * that the string is actually in valid UUID format.\r\n */\r\n export function isGuid(value: string): boolean {\r\n return uuidPattern.test(value);\r\n }\r\n\r\n /** Determine whether the input string is a valid V4 Guid string */\r\n export function isV4Guid(value: string): boolean {\r\n return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/.test(value);\r\n }\r\n\r\n /** Create a new V4 Guid value */\r\n export function createValue(): GuidString {\r\n return crypto.randomUUID();\r\n }\r\n\r\n /**\r\n * Normalize a Guid string if possible. Normalization consists of:\r\n * - Convert all characters to lower case\r\n * - Trim any leading or trailing whitespace\r\n * - Convert to the standard Guid format \"8-4-4-4-12\", repositioning the '-' characters as necessary, presuming there are exactly 32 hexadecimal digits.\r\n * @param value Input value that represents a Guid\r\n * @returns Normalized representation of the Guid string. If the normalization fails, return the *original* value unmodified (Note: it is *not* a valid Guid)\r\n */\r\n export function normalize(value: GuidString): GuidString {\r\n const lowerValue = value.toLowerCase().trim();\r\n\r\n // Return if it's already formatted to be a Guid\r\n if (isGuid(lowerValue))\r\n return lowerValue;\r\n\r\n // Remove any existing \"-\" characters and position them properly, if there remains exactly 32 hexadecimal digits\r\n const noDashValue = lowerValue.replace(/-/g, \"\");\r\n const noDashPattern = /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/;\r\n if (noDashPattern.test(noDashValue)) {\r\n return noDashValue.replace(noDashPattern,\r\n (_match: string, p1: string, p2: string, p3: string, p4: string, p5: string) =>\r\n `${p1}-${p2}-${p3}-${p4}-${p5}`);\r\n }\r\n\r\n // Return unmodified string - (note: it is *not* a valid Guid)\r\n return value;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Id.js","sourceRoot":"","sources":["../../src/Id.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Ids\r\n */\r\n\r\n/** A string containing a well-formed string representation of an [Id64]($core-bentley).\r\n * See [Working with Ids]($docs/learning/common/Id64.md).\r\n * @public\r\n */\r\nexport type Id64String = string;\r\n\r\n/** A string containing a well-formed string representation of a [Guid]($core-bentley).\r\n * @public\r\n */\r\nexport type GuidString = string;\r\n\r\n/** A set of [[Id64String]]s.\r\n * @public\r\n */\r\nexport type Id64Set = Set<Id64String>;\r\n\r\n/** An array of [[Id64String]]s.\r\n * @public\r\n */\r\nexport type Id64Array = Id64String[];\r\n\r\n/** Used as an argument to a function that can accept one or more [[Id64String]]s.\r\n * @public\r\n */\r\nexport type Id64Arg = Id64String | Id64Set | Id64Array;\r\n\r\nfunction toHex(str: string): number {\r\n const v = parseInt(str, 16);\r\n return Number.isNaN(v) ? 0 : v;\r\n}\r\n\r\nfunction isLowerCaseNonZeroHexDigit(str: string, index: number) {\r\n return isLowerCaseHexDigit(str, index, false);\r\n}\r\n\r\nfunction isLowerCaseHexDigit(str: string, index: number, allowZero: boolean = true): boolean {\r\n const charCode = str.charCodeAt(index);\r\n const minDecimalDigit = allowZero ? 0x30 : 0x31; // '0' or '1'...\r\n return (charCode >= minDecimalDigit && charCode <= 0x39) || (charCode >= 0x61 && charCode <= 0x66); // '0'-'9, 'a' -'f'\r\n}\r\n\r\nfunction isValidHexString(id: string, startIndex: number, len: number) {\r\n if (len === 0)\r\n return false;\r\n\r\n // No leading zeroes...\r\n if (!isLowerCaseNonZeroHexDigit(id, startIndex))\r\n return false;\r\n\r\n // ...followed by len-1 lowercase hexadecimal digits.\r\n for (let i = 1; i < len; i++)\r\n if (!isLowerCaseHexDigit(id, startIndex + i))\r\n return false;\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * The Id64 namespace provides facilities for working with 64-bit identifiers. These Ids are stored as 64-bit integers inside an [[IModelDb]], but must be represented\r\n * as strings in JavaScript because JavaScript does not intrinsically support 64-bit integers.\r\n *\r\n * The [[Id64String]] type alias is used to indicate function arguments, return types, and variables which are known to contain a well-formed representation of a 64-bit Id.\r\n *\r\n * See [Working with Ids]($docs/learning/common/Id64.md) for a detailed description and code examples.\r\n * @public\r\n */\r\nexport namespace Id64 {\r\n /** Extract the \"local\" Id portion of an Id64String, contained in the lower 40 bits of the 64-bit value. */\r\n export function getLocalId(id: Id64String): number {\r\n if (isInvalid(id))\r\n return 0;\r\n\r\n const len = id.length;\r\n const start = (len > 12) ? (len - 10) : 2;\r\n return toHex(id.slice(start));\r\n }\r\n\r\n /** Extract the briefcase Id portion of an Id64String, contained in the upper 24 bits of the 64-bit value. */\r\n export function getBriefcaseId(id: Id64String): number {\r\n if (isInvalid(id))\r\n return 0;\r\n\r\n const len = id.length;\r\n return (len <= 12) ? 0 : toHex(id.slice(2, len - 10));\r\n }\r\n\r\n /** Create an Id64String from its JSON representation.\r\n * @param prop The JSON representation of an Id.\r\n * @returns A well-formed Id string.\r\n * @note if the input is undefined, the result is \"0\", indicating an invalid Id.\r\n * @note if the input is not undefined, the result is the same as that of [[Id64.fromString]].\r\n */\r\n export function fromJSON(prop?: string): Id64String {\r\n return typeof prop === \"string\" ? Id64.fromString(prop) : Id64.invalid;\r\n }\r\n\r\n /** Given a string value, attempt to normalize it into a well-formed Id string.\r\n * If the input is already a well-formed Id string, it is returned unmodified.\r\n * Otherwise, the input is trimmed of leading and trailing whitespace, converted to lowercase, and an attempt is made to parse it as a 64-bit hexadecimal integer.\r\n * If parsing succeeds the normalized result is returned; otherwise the result is \"0\", indicating an invalid Id.\r\n *\r\n * For a description of \"well-formed\", see [Working with Ids]($docs/learning/common/Id64.md).\r\n */\r\n export function fromString(val: string): Id64String {\r\n // NB: in case this is called from JavaScript, we must check the run-time type...\r\n if (typeof val !== \"string\")\r\n return invalid;\r\n\r\n // Skip the common case in which the input is already a well-formed Id string\r\n if (Id64.isId64(val))\r\n return val;\r\n\r\n // Attempt to normalize the input into a well-formed Id string\r\n val = val.toLowerCase().trim();\r\n const len = val.length;\r\n if (len < 2 || val[0] !== \"0\" || val[1] !== \"x\")\r\n return invalid;\r\n\r\n let low = 0;\r\n let high = 0;\r\n let start = 2;\r\n if (len > 12) {\r\n start = (len - 10);\r\n high = toHex(val.slice(2, start));\r\n }\r\n\r\n low = toHex(val.slice(start));\r\n return fromLocalAndBriefcaseIds(low, high);\r\n }\r\n\r\n // Used when constructing local ID portion of Id64String. Performance optimization.\r\n const _localIdPrefixByLocalIdLength = [\r\n \"0000000000\",\r\n \"000000000\",\r\n \"00000000\",\r\n \"0000000\",\r\n \"000000\",\r\n \"00000\",\r\n \"0000\",\r\n \"000\",\r\n \"00\",\r\n \"0\",\r\n \"\",\r\n ];\r\n\r\n /** Produce an Id string from a local and briefcase Id.\r\n * @param localId The non-zero local Id as an unsigned 40-bit integer.\r\n * @param briefcaseId The briefcase Id as an unsigned 24-bit integer.\r\n * @returns an Id64String containing the hexadecimal string representation of the unsigned 64-bit integer which would result from the\r\n * operation `localId | (briefcaseId << 40)`, or an invalid Id \"0\" if the inputs are invalid.\r\n */\r\n export function fromLocalAndBriefcaseIds(localId: number, briefcaseId: number): Id64String {\r\n // NB: Yes, we must check the run-time type...\r\n if (typeof localId !== \"number\" || typeof briefcaseId !== \"number\")\r\n return invalid;\r\n\r\n localId = Math.floor(localId);\r\n if (0 === localId)\r\n return invalid;\r\n\r\n briefcaseId = Math.floor(briefcaseId);\r\n const lowStr = localId.toString(16);\r\n return `0x${(briefcaseId === 0) ? lowStr : (briefcaseId.toString(16) + (_localIdPrefixByLocalIdLength[lowStr.length] + lowStr))}`;\r\n }\r\n\r\n // Used as a buffer when converting a pair of 32-bit integers to an Id64String. Significant performance optimization.\r\n const scratchCharCodes = [\r\n 0x30, // \"0\"\r\n 0x78, // \"x\"\r\n 0x30, // \"0\"\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n 0x30,\r\n ];\r\n\r\n // Convert 4-bit unsigned integer to char code representing lower-case hexadecimal digit.\r\n function uint4ToCharCode(uint4: number): number {\r\n return uint4 + (uint4 < 10 ? 0x30 : 0x57);\r\n }\r\n\r\n // Convert char code representing lower-case hexadecimal digit to 4-bit unsigned integer.\r\n function charCodeToUint4(char: number): number {\r\n return char - (char >= 0x57 ? 0x57 : 0x30);\r\n }\r\n\r\n // Convert a substring to a uint32. This is twice as fast as using Number.parseInt().\r\n function substringToUint32(id: Id64String, start: number, end: number): number {\r\n let uint32 = 0;\r\n for (let i = start; i < end; i++) {\r\n const uint4 = charCodeToUint4(id.charCodeAt(i));\r\n const shift = (end - i - 1) << 2;\r\n const mask = uint4 << shift;\r\n uint32 = (uint32 | mask) >>> 0; // >>> 0 to force unsigned because javascript\r\n }\r\n\r\n return uint32;\r\n }\r\n\r\n /** Create an Id64String from a pair of unsigned 32-bit integers.\r\n * @param lowBytes The lower 4 bytes of the Id\r\n * @param highBytes The upper 4 bytes of the Id\r\n * @returns an Id64String containing the hexadecimal string representation of the unsigned 64-bit integer which would result from the\r\n * operation `lowBytes | (highBytes << 32)`.\r\n * @see [[Id64.fromUint32PairObject]] if you have a [[Id64.Uint32Pair]] object.\r\n */\r\n export function fromUint32Pair(lowBytes: number, highBytes: number): Id64String {\r\n const localIdLow = lowBytes >>> 0;\r\n const localIdHigh = (highBytes & 0x000000ff) * (0xffffffff + 1); // aka (highBytes & 0xff) << 32\r\n const localId = localIdLow + localIdHigh; // aka localIdLow | localIdHigh\r\n if (0 === localId)\r\n return invalid;\r\n\r\n // Need to omit or preserve leading zeroes...\r\n const buffer = scratchCharCodes;\r\n let index = 2;\r\n for (let i = 7; i >= 0; i--) {\r\n const shift = i << 2;\r\n const mask = 0xf << shift;\r\n const uint4 = (highBytes & mask) >>> shift;\r\n if (index > 2 || 0 !== uint4)\r\n buffer[index++] = uint4ToCharCode(uint4);\r\n }\r\n\r\n for (let i = 7; i >= 0; i--) {\r\n const shift = i << 2;\r\n const mask = 0xf << shift;\r\n const uint4 = (lowBytes & mask) >>> shift;\r\n if (index > 2 || 0 !== uint4)\r\n buffer[index++] = uint4ToCharCode(uint4);\r\n }\r\n\r\n if (buffer.length !== index)\r\n buffer.length = index;\r\n\r\n return String.fromCharCode(...scratchCharCodes);\r\n }\r\n\r\n /** Create an Id64String from a [[Id64.Uint32Pair]].\r\n * @see [[Id64.fromUint32Pair]].\r\n */\r\n export function fromUint32PairObject(pair: Uint32Pair): Id64String {\r\n return fromUint32Pair(pair.lower, pair.upper);\r\n }\r\n\r\n /** Returns true if the inputs represent two halves of a valid 64-bit Id.\r\n * @see [[Id64.Uint32Pair]].\r\n */\r\n export function isValidUint32Pair(lowBytes: number, highBytes: number): boolean {\r\n // Detect local ID of zero\r\n return 0 !== lowBytes || 0 !== (highBytes & 0x000000ff);\r\n }\r\n\r\n /** Represents an [[Id64]] as a pair of unsigned 32-bit integers. Because Javascript lacks efficient support for 64-bit integers,\r\n * this representation can be useful in performance-sensitive code like the render loop.\r\n * @see [[Id64.getUint32Pair]] to convert an [[Id64String]] to a Uint32Pair.\r\n * @see [[Id64.fromUint32Pair]] to convert a Uint32Pair to an [[Id64String]].\r\n * @see [[Id64.Uint32Set]] and [[Id64.Uint32Map]] for collections based on Uint32Pairs.\r\n */\r\n export interface Uint32Pair {\r\n /** The lower 4 bytes of the 64-bit integer. */\r\n lower: number;\r\n /** The upper 4 bytes of the 64-bit integer. */\r\n upper: number;\r\n }\r\n\r\n /** Convert an Id64String to a 64-bit unsigned integer represented as a pair of unsigned 32-bit integers.\r\n * @param id The well-formed string representation of a 64-bit Id.\r\n * @param out Used as the return value if supplied; otherwise a new object is returned.\r\n * @returns An object containing the parsed lower and upper 32-bit integers comprising the 64-bit Id.\r\n */\r\n export function getUint32Pair(id: Id64String, out?: Uint32Pair): Uint32Pair {\r\n if (!out)\r\n out = { lower: 0, upper: 0 };\r\n\r\n out.lower = getLowerUint32(id);\r\n out.upper = getUpperUint32(id);\r\n return out;\r\n }\r\n\r\n /** Extract an unsigned 32-bit integer from the lower 4 bytes of an Id64String. */\r\n export function getLowerUint32(id: Id64String): number {\r\n if (isInvalid(id))\r\n return 0;\r\n\r\n const end = id.length;\r\n const start = end > 10 ? end - 8 : 2;\r\n return substringToUint32(id, start, end);\r\n }\r\n\r\n /** Extract an unsigned 32-bit integer from the upper 4 bytes of an Id64String. */\r\n export function getUpperUint32(id: Id64String): number {\r\n const len = id.length;\r\n if (len <= 10 || isInvalid(id))\r\n return 0;\r\n\r\n return substringToUint32(id, 2, len - 8);\r\n }\r\n\r\n /** Convert an [[Id64Arg]] into an [[Id64Set]].\r\n *\r\n * This method can be used by functions that accept an Id64Arg to conveniently process the value(s). For example:\r\n * ```ts\r\n * public addCategories(arg: Id64Arg) { Id64.toIdSet(arg).forEach((id) => this.categories.add(id)); }\r\n * ```\r\n *\r\n * Alternatively, to avoid allocating a new Id64Set, use [[Id64.iterable]].\r\n *\r\n * @param arg The Ids to convert to an Id64Set.\r\n * @param makeCopy If true, and the input is already an Id64Set, returns a deep copy of the input.\r\n * @returns An Id64Set containing the set of [[Id64String]]s represented by the Id64Arg.\r\n */\r\n export function toIdSet(arg: Id64Arg, makeCopy: boolean = false): Id64Set {\r\n if (arg instanceof Set)\r\n return makeCopy ? new Set<string>(arg) : arg;\r\n\r\n const ids = new Set<Id64String>();\r\n if (typeof arg === \"string\")\r\n ids.add(arg);\r\n else if (Array.isArray(arg)) {\r\n arg.forEach((id: Id64String) => {\r\n if (typeof id === \"string\")\r\n ids.add(id);\r\n });\r\n }\r\n\r\n return ids;\r\n }\r\n\r\n /** Obtain iterator over the specified Ids.\r\n * @see [[Id64.iterable]].\r\n */\r\n export function* iterator(ids: Id64Arg): Iterator<Id64String> {\r\n if (typeof ids === \"string\") {\r\n yield ids;\r\n } else {\r\n for (const id of ids)\r\n yield id;\r\n }\r\n }\r\n\r\n /** Obtain an iterable over the specified Ids. Example usage:\r\n * ```ts\r\n * const ids = [\"0x123\", \"0xfed\"];\r\n * for (const id of Id64.iterable(ids))\r\n * console.log(id);\r\n * ```\r\n */\r\n export function iterable(ids: Id64Arg): Iterable<Id64String> {\r\n return typeof ids === \"string\" ? [ids] : ids;\r\n }\r\n\r\n /** Return the first [[Id64String]] of an [[Id64Arg]]. */\r\n export function getFirst(arg: Id64Arg): Id64String {\r\n return typeof arg === \"string\" ? arg : (Array.isArray(arg) ? arg[0] : arg.values().next().value) ?? Id64.invalid;\r\n }\r\n\r\n /** Return the number of [[Id64String]]s represented by an [[Id64Arg]]. */\r\n export function sizeOf(arg: Id64Arg): number {\r\n return typeof arg === \"string\" ? 1 : (Array.isArray(arg) ? arg.length : arg.size);\r\n }\r\n\r\n /** Returns true if the [[Id64Arg]] contains the specified Id. */\r\n export function has(arg: Id64Arg, id: Id64String): boolean {\r\n if (typeof arg === \"string\")\r\n return arg === id;\r\n if (Array.isArray(arg))\r\n return -1 !== arg.indexOf(id);\r\n\r\n return arg.has(id);\r\n }\r\n\r\n /** The string representation of an invalid Id. */\r\n export const invalid = \"0\";\r\n\r\n /** Determine if the supplied id string represents a transient Id.\r\n * @param id A well-formed Id string.\r\n * @returns true if the Id represents a transient Id.\r\n * @note This method assumes the input is a well-formed Id string.\r\n * @see [[Id64.isTransientId64]]\r\n * @see [[TransientIdSequence]]\r\n */\r\n export function isTransient(id: Id64String): boolean {\r\n // A transient Id is of the format \"0xffffffxxxxxxxxxx\" where the leading 6 digits indicate an invalid briefcase Id.\r\n return 18 === id.length && id.startsWith(\"0xffffff\");\r\n }\r\n\r\n /** Determine if the input is a well-formed [[Id64String]] and represents a transient Id.\r\n * @see [[Id64.isTransient]]\r\n * @see [[Id64.isId64]]\r\n * @see [[TransientIdSequence]]\r\n */\r\n export function isTransientId64(id: string): boolean {\r\n return isValidId64(id) && isTransient(id);\r\n }\r\n\r\n /** Determine if the input is a well-formed [[Id64String]].\r\n *\r\n * For a description of \"well-formed\", see [Working with Ids]($docs/learning/common/Id64.md).\r\n * @see [[Id64.isValidId64]]\r\n */\r\n export function isId64(id: string): boolean {\r\n const len = id.length;\r\n if (0 === len || 18 < len)\r\n return false;\r\n\r\n if (\"0\" !== id[0])\r\n return false;\r\n\r\n // Well-formed invalid Id: \"0\"\r\n if (1 === len)\r\n return true;\r\n\r\n // Valid Ids begin with \"0x\" followed by at least one lower-case hexadecimal digit.\r\n if (2 === len || \"x\" !== id[1])\r\n return false;\r\n\r\n // If briefcase Id is present, it occupies at least one digit, followed by 10 digits for local Id\r\n let localIdStart = 2;\r\n if (len > 12) {\r\n localIdStart = len - 10;\r\n\r\n // Verify briefcase Id\r\n if (!isValidHexString(id, 2, localIdStart - 2))\r\n return false;\r\n\r\n // Skip leading zeroes in local Id\r\n for (let i = localIdStart; i < len; i++) {\r\n if (0x30 !== id.charCodeAt(i)) // '0'\r\n break;\r\n else\r\n localIdStart++;\r\n }\r\n\r\n if (localIdStart >= len)\r\n return false;\r\n }\r\n\r\n return isValidHexString(id, localIdStart, len - localIdStart);\r\n }\r\n\r\n /** Returns true if the input is not equal to the representation of an invalid Id.\r\n * @note This method assumes the input is a well-formed Id string.\r\n * @see [[Id64.isInvalid]]\r\n * @see [[Id64.isValidId64]]\r\n */\r\n export function isValid(id: Id64String): boolean {\r\n return Id64.invalid !== id;\r\n }\r\n\r\n /** Returns true if the input is a well-formed [[Id64String]] representing a valid Id.\r\n * @see [[Id64.isValid]]\r\n * @see [[Id64.isId64]]\r\n */\r\n export function isValidId64(id: string): boolean {\r\n return Id64.invalid !== id && Id64.isId64(id);\r\n }\r\n\r\n /** Returns true if the input is a well-formed [[Id64String]] representing an invalid Id.\r\n * @see [[Id64.isValid]]\r\n */\r\n export function isInvalid(id: Id64String): boolean {\r\n return Id64.invalid === id;\r\n }\r\n\r\n /** A specialized replacement for Set<Id64String> optimized for performance-critical code which represents large sets of [[Id64]]s as pairs of\r\n * 32-bit integers.\r\n * The internal representation is a Map<number, Set<number>> where the Map key is the upper 4 bytes of the IDs and the Set elements are the lower 4 bytes of the IDs.\r\n * Because the upper 4 bytes store the 24-bit briefcase ID plus the upper 8 bits of the local ID, there will be a very small distribution of unique Map keys.\r\n * To further optimize this data type, the following assumptions are made regarding the { lower, upper } inputs, and no validation is performed to confirm them:\r\n * - The inputs are unsigned 32-bit integers;\r\n * - The inputs represent a valid Id64String (e.g., local ID is not zero).\r\n * @see [[Id64.Uint32Map]] for a similarly-optimized replacement for Map<Id64String, T>\r\n * @public\r\n */\r\n export class Uint32Set {\r\n protected readonly _map = new Map<number, Set<number>>();\r\n\r\n /** Construct a new Uint32Set.\r\n * @param ids If supplied, all of the specified Ids will be added to the new set.\r\n */\r\n public constructor(ids?: Id64Arg) {\r\n if (undefined !== ids)\r\n this.addIds(ids);\r\n }\r\n\r\n /** Return true if `this` and `other` contain the same set of Ids. */\r\n public equals(other: Uint32Set): boolean {\r\n if (this === other) {\r\n return true;\r\n }\r\n\r\n if (this.size !== other.size) {\r\n return false;\r\n }\r\n\r\n for (const [key, thisValue] of this._map) {\r\n const otherValue = other._map.get(key);\r\n if (!otherValue || thisValue.size !== otherValue.size) {\r\n return false;\r\n }\r\n\r\n for (const value of thisValue) {\r\n if (!otherValue.has(value)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Remove all contents of this set. */\r\n public clear(): void {\r\n this._map.clear();\r\n }\r\n\r\n /** Add an Id to the set. */\r\n public addId(id: Id64String): void {\r\n this.add(Id64.getLowerUint32(id), Id64.getUpperUint32(id));\r\n }\r\n\r\n /** Add any number of Ids to the set. */\r\n public addIds(ids: Id64Arg): void {\r\n for (const id of Id64.iterable(ids))\r\n this.addId(id);\r\n }\r\n\r\n /** Returns true if the set contains the specified Id. */\r\n public hasId(id: Id64String): boolean { return this.has(Id64.getLowerUint32(id), Id64.getUpperUint32(id)); }\r\n\r\n /** Add an Id to the set. */\r\n public add(low: number, high: number): void {\r\n let set = this._map.get(high);\r\n if (undefined === set) {\r\n set = new Set<number>();\r\n this._map.set(high, set);\r\n }\r\n\r\n set.add(low);\r\n }\r\n\r\n /** Remove an Id from the set. */\r\n public deleteId(id: Id64String): void {\r\n this.delete(Id64.getLowerUint32(id), Id64.getUpperUint32(id));\r\n }\r\n\r\n /** Remove any number of Ids from the set. */\r\n public deleteIds(ids: Id64Arg): void {\r\n for (const id of Id64.iterable(ids))\r\n this.deleteId(id);\r\n }\r\n\r\n /** Remove an Id from the set. */\r\n public delete(low: number, high: number): void {\r\n const set = this._map.get(high);\r\n if (undefined !== set) {\r\n set.delete(low);\r\n if (set.size === 0)\r\n this._map.delete(high);\r\n }\r\n }\r\n\r\n /** Returns true if the set contains the specified Id. */\r\n public has(low: number, high: number): boolean {\r\n const set = this._map.get(high);\r\n return undefined !== set && set.has(low);\r\n }\r\n\r\n /** Returns true if the set contains the Id specified by `pair`. */\r\n public hasPair(pair: Uint32Pair): boolean {\r\n return this.has(pair.lower, pair.upper);\r\n }\r\n\r\n /** Returns true if the set contains no Ids. */\r\n public get isEmpty(): boolean { return 0 === this._map.size; }\r\n\r\n /** Returns the number of Ids contained in the set. */\r\n public get size(): number {\r\n let size = 0;\r\n for (const entry of this._map)\r\n size += entry[1].size;\r\n\r\n return size;\r\n }\r\n\r\n /** Populates and returns an array of all Ids contained in the set. */\r\n public toId64Array(): Id64Array {\r\n const ids: Id64Array = [];\r\n for (const entry of this._map)\r\n for (const low of entry[1])\r\n ids.push(Id64.fromUint32Pair(low, entry[0]));\r\n\r\n return ids;\r\n }\r\n\r\n /** Populates and returns a set of all Ids contained in the set. */\r\n public toId64Set(): Id64Set {\r\n const ids = new Set<string>();\r\n for (const entry of this._map)\r\n for (const low of entry[1])\r\n ids.add(Id64.fromUint32Pair(low, entry[0]));\r\n\r\n return ids;\r\n }\r\n\r\n /** Execute a function against each Id in this set. */\r\n public forEach(func: (lo: number, hi: number) => void): void {\r\n for (const entry of this._map)\r\n for (const lo of entry[1])\r\n func(lo, entry[0]);\r\n }\r\n }\r\n\r\n /** A specialized replacement for Map<Id64String, T> optimized for performance-critical code.\r\n * @see [[Id64.Uint32Set]] for implementation details.\r\n * @public\r\n */\r\n export class Uint32Map<T> {\r\n protected readonly _map = new Map<number, Map<number, T>>();\r\n\r\n /** Remove all entries from the map. */\r\n public clear(): void { this._map.clear(); }\r\n /** Find an entry in the map by Id. */\r\n public getById(id: Id64String): T | undefined { return this.get(Id64.getLowerUint32(id), Id64.getUpperUint32(id)); }\r\n /** Set an entry in the map by Id. */\r\n public setById(id: Id64String, value: T): void { this.set(Id64.getLowerUint32(id), Id64.getUpperUint32(id), value); }\r\n\r\n /** Set an entry in the map by Id components. */\r\n public set(low: number, high: number, value: T): void {\r\n let map = this._map.get(high);\r\n if (undefined === map) {\r\n map = new Map<number, T>();\r\n this._map.set(high, map);\r\n }\r\n\r\n map.set(low, value);\r\n }\r\n\r\n /** Get an entry from the map by Id components. */\r\n public get(low: number, high: number): T | undefined {\r\n const map = this._map.get(high);\r\n return undefined !== map ? map.get(low) : undefined;\r\n }\r\n\r\n /** Returns true if the map contains no entries. */\r\n public get isEmpty(): boolean { return 0 === this._map.size; }\r\n /** Returns the number of entries in the map. */\r\n public get size(): number {\r\n let size = 0;\r\n for (const entry of this._map)\r\n size += entry[1].size;\r\n\r\n return size;\r\n }\r\n\r\n /** Execute a function against each entry in this map. */\r\n public forEach(func: (lo: number, hi: number, value: T) => void): void {\r\n for (const outerEntry of this._map)\r\n for (const innerEntry of outerEntry[1])\r\n func(innerEntry[0], outerEntry[0], innerEntry[1]);\r\n }\r\n }\r\n}\r\n\r\n/** JSON representation of a [[TransientIdSequence]], primarily useful for transferring sequences to and from a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).\r\n * It stores two \"local\" 40-bit Ids describing the range of [Id64String]($docs/learning/common/Id64.md)s generated by the sequence.\r\n * @public\r\n */\r\nexport interface TransientIdSequenceProps {\r\n /** The starting local Id. The sequence begins at `initialLocalId + 1`. */\r\n initialLocalId: number;\r\n /** The maximum local Id generated by the sequence thus far. It is never less than [[initialLocalId]]. If it is equal to [[initialLocalId]], then the sequence has\r\n * not yet generated any Ids.\r\n * The next local Id generated by the sequence will be `currentLocalId + 1`.\r\n */\r\n currentLocalId: number;\r\n}\r\n\r\nfunction validateLocalId(num: number): void {\r\n if (num < 0 || Math.round(num) !== num) {\r\n throw new Error(\"Local Id must be a non-negative integer\");\r\n }\r\n}\r\n\r\n/** A function returned by [[TransientIdSequence.merge]] that remaps the local Id portion of an [Id64String]($docs/learning/common/Id64.md) generated by\r\n * the source sequence to the corresponding local Id in the target sequence.\r\n * It returns `sourceLocalId` if the input did not originate from the source sequence.\r\n* @public\r\n*/\r\nexport type RemapTransientLocalId = (sourceLocalId: number) => number;\r\n\r\n/**\r\n * Generates unique [[Id64String]] values in sequence, which are guaranteed not to conflict with Ids associated with persistent elements or models.\r\n * This is useful for associating stable, non-persistent identifiers with things like [Decorator]($frontend)s.\r\n * A TransientIdSequence can generate a maximum of (2^40)-2 unique Ids.\r\n * @public\r\n */\r\nexport class TransientIdSequence {\r\n /** The starting local Id provided to the constructor. The sequence begins at `initialLocalId + 1`. */\r\n public readonly initialLocalId: number;\r\n private _localId: number;\r\n\r\n /** Constructor.\r\n * @param initialLocalId The starting local Id. The local Id of the first [[Id64String]] generated by [[getNext]] will be `initialLocalId + 1`.\r\n */\r\n public constructor(initialLocalId = 0) {\r\n validateLocalId(initialLocalId);\r\n this.initialLocalId = initialLocalId;\r\n this._localId = initialLocalId;\r\n }\r\n\r\n /** The maximum local Id generated by the sequence thus far. It is never less than [[initialLocalId]]. If it is equal to [[initialLocalId]], then the sequence has\r\n * not yet generated any Ids.\r\n * Each call to [[getNext]] increments this by 1 and uses it as the local Id of the generated [[Id64String]].\r\n */\r\n public get currentLocalId(): number {\r\n return this._localId;\r\n }\r\n\r\n /** Generate and return the next transient Id64String in the sequence. */\r\n public getNext(): Id64String {\r\n return Id64.fromLocalAndBriefcaseIds(++this._localId, 0xffffff);\r\n }\r\n\r\n /** Preview the transient Id64String that will be returned by the next call to [[getNext]].\r\n * This is primarily useful for tests.\r\n */\r\n public peekNext(): Id64String {\r\n return Id64.fromLocalAndBriefcaseIds(this._localId + 1, 0xffffff);\r\n }\r\n\r\n /** Convert this sequence to its JSON representation. */\r\n public toJSON(): TransientIdSequenceProps {\r\n return {\r\n initialLocalId: this.initialLocalId,\r\n currentLocalId: this.currentLocalId,\r\n };\r\n }\r\n\r\n /** Create a sequence from its JSON representation. */\r\n public static fromJSON(props: TransientIdSequenceProps): TransientIdSequence {\r\n validateLocalId(props.currentLocalId);\r\n const sequence = new TransientIdSequence(props.initialLocalId);\r\n sequence._localId = props.currentLocalId;\r\n return sequence;\r\n }\r\n\r\n /** Obtain the JSON representation of a new sequence that diverges from this sequence, with its [[initialLocalId]] set to this sequence's [[currentLocalId]].\r\n * The two sequences can generate Ids independently. Later, you can [[merge]] the sequences, resolving conflicts where the two sequences generated identical Ids.\r\n * This is chiefly useful when generating transient Ids on a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).\r\n */\r\n public fork(): TransientIdSequenceProps {\r\n return {\r\n initialLocalId: this.currentLocalId,\r\n currentLocalId: this.currentLocalId,\r\n };\r\n }\r\n\r\n /** Integrate the Ids generated by a [[fork]] of this sequence. All of the Ids generated by `source` will be remapped to Ids at the end of this sequence.\r\n * This is chiefly useful when generating transient Ids on a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).\r\n * @param source The JSON representation of the [[fork]]ed sequence to be merged with this one.\r\n * @returns a function that permits you to remap the local Ids generated by `source` into the corresponding local Ids assigned by this sequence.\r\n * @throws Error if `source` is not a fork of this sequence or is malformed (e.g., contains negative and/or non-integer local Ids).\r\n */\r\n public merge(source: TransientIdSequenceProps): (sourceLocalId: number) => number {\r\n const { initialLocalId, currentLocalId } = source;\r\n\r\n validateLocalId(initialLocalId);\r\n validateLocalId(currentLocalId);\r\n\r\n if (initialLocalId > this.currentLocalId) {\r\n throw new Error(\"Transient Id sequences do not intersect\");\r\n }\r\n\r\n if (initialLocalId > currentLocalId) {\r\n throw new Error(\"Current local Id cannot be less than initial local Id\");\r\n }\r\n\r\n const delta = this.currentLocalId - initialLocalId;\r\n this._localId += currentLocalId - initialLocalId;\r\n\r\n return (sourceLocalId: number) => {\r\n if (sourceLocalId > initialLocalId && sourceLocalId <= currentLocalId) {\r\n return sourceLocalId + delta;\r\n }\r\n\r\n return sourceLocalId;\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * The Guid namespace provides facilities for working with GUID strings using the \"8-4-4-4-12\" pattern.\r\n *\r\n * The [[GuidString]] type alias is used to indicate function arguments, return types, and variables which are known to\r\n * be in the GUID format.\r\n * @public\r\n */\r\nexport namespace Guid {\r\n const uuidPattern = new RegExp(\"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\");\r\n\r\n /** Represents the empty Guid 00000000-0000-0000-0000-000000000000 */\r\n export const empty: GuidString = \"00000000-0000-0000-0000-000000000000\";\r\n\r\n /** Determine whether the input string is \"guid-like\". That is, it follows the 8-4-4-4-12 pattern. This does not enforce\r\n * that the string is actually in valid UUID format.\r\n */\r\n export function isGuid(value: string): boolean {\r\n return uuidPattern.test(value);\r\n }\r\n\r\n /** Determine whether the input string is a valid V4 Guid string */\r\n export function isV4Guid(value: string): boolean {\r\n return /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/.test(value);\r\n }\r\n\r\n /** Create a new V4 Guid value */\r\n export function createValue(): GuidString {\r\n return crypto.randomUUID();\r\n }\r\n\r\n /**\r\n * Normalize a Guid string if possible. Normalization consists of:\r\n * - Convert all characters to lower case\r\n * - Trim any leading or trailing whitespace\r\n * - Convert to the standard Guid format \"8-4-4-4-12\", repositioning the '-' characters as necessary, presuming there are exactly 32 hexadecimal digits.\r\n * @param value Input value that represents a Guid\r\n * @returns Normalized representation of the Guid string. If the normalization fails, return the *original* value unmodified (Note: it is *not* a valid Guid)\r\n */\r\n export function normalize(value: GuidString): GuidString {\r\n const lowerValue = value.toLowerCase().trim();\r\n\r\n // Return if it's already formatted to be a Guid\r\n if (isGuid(lowerValue))\r\n return lowerValue;\r\n\r\n // Remove any existing \"-\" characters and position them properly, if there remains exactly 32 hexadecimal digits\r\n const noDashValue = lowerValue.replace(/-/g, \"\");\r\n const noDashPattern = /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/;\r\n if (noDashPattern.test(noDashValue)) {\r\n return noDashValue.replace(noDashPattern,\r\n (_match: string, p1: string, p2: string, p3: string, p4: string, p5: string) =>\r\n `${p1}-${p2}-${p3}-${p4}-${p5}`);\r\n }\r\n\r\n // Return unmodified string - (note: it is *not* a valid Guid)\r\n return value;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,17 @@
1
+ /** @packageDocumentation
2
+ * @module Utils
3
+ */
4
+ /**
5
+ * Wrapper function designed to be used for callbacks called by setInterval or setTimeout in order to propagate any
6
+ * exceptions thrown in the callback to the main promise chain. It does this by creating a new promise for the callback
7
+ * invocation and adding it to the timerPromises set. The main promise chain can then await
8
+ * Promise.all(timerPromises) to catch any exceptions thrown in any of the callbacks. Note that if the callback
9
+ * completes successfully, the promise is resolved and removed from the set. If it throws an exception, the promise is
10
+ * rejected but not removed from the set, so that the main promise chain can detect that an error occurred and handle
11
+ * it appropriately.
12
+ * @param timerPromises A set of promises representing the currently active timer callbacks.
13
+ * @param callback The async callback to be executed within the timer.
14
+ * @beta
15
+ */
16
+ export declare function wrapTimerCallback(timerPromises: Set<Promise<void>>, callback: () => Promise<void>): Promise<void>;
17
+ //# sourceMappingURL=UtilityFunctions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UtilityFunctions.d.ts","sourceRoot":"","sources":["../../src/UtilityFunctions.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,iBAgCvG"}
@@ -0,0 +1,49 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ /** @packageDocumentation
6
+ * @module Utils
7
+ */
8
+ /**
9
+ * Wrapper function designed to be used for callbacks called by setInterval or setTimeout in order to propagate any
10
+ * exceptions thrown in the callback to the main promise chain. It does this by creating a new promise for the callback
11
+ * invocation and adding it to the timerPromises set. The main promise chain can then await
12
+ * Promise.all(timerPromises) to catch any exceptions thrown in any of the callbacks. Note that if the callback
13
+ * completes successfully, the promise is resolved and removed from the set. If it throws an exception, the promise is
14
+ * rejected but not removed from the set, so that the main promise chain can detect that an error occurred and handle
15
+ * it appropriately.
16
+ * @param timerPromises A set of promises representing the currently active timer callbacks.
17
+ * @param callback The async callback to be executed within the timer.
18
+ * @beta
19
+ */
20
+ export async function wrapTimerCallback(timerPromises, callback) {
21
+ let resolvePromise;
22
+ let rejectPromise;
23
+ // The callback of the Promise constructor does not have access to the promise itself, so all we do there is
24
+ // capture the resolve and reject functions for use in the async callback that would have otherwise been
25
+ // placed in the setInterval or setTimeout callback.
26
+ const timerPromise = new Promise((resolve, reject) => {
27
+ resolvePromise = resolve;
28
+ rejectPromise = reject;
29
+ });
30
+ // Note: when we get here, resolvePromise and rejectPromise will always be defined, but there is no way to
31
+ // convince TS of that fact without extra unnecessary checks, so we use ?. when accessing them.
32
+ // Prevent unhandled rejection warnings. The rejection is still observable
33
+ // when the consumer awaits Promise.all(promises).
34
+ timerPromise.catch(() => { });
35
+ timerPromises.add(timerPromise);
36
+ const cleanupAndResolve = () => {
37
+ resolvePromise?.();
38
+ // No need to keep track of this promise anymore since it's resolved.
39
+ timerPromises.delete(timerPromise);
40
+ };
41
+ try {
42
+ await callback();
43
+ cleanupAndResolve();
44
+ }
45
+ catch (err) {
46
+ rejectPromise?.(err);
47
+ }
48
+ }
49
+ //# sourceMappingURL=UtilityFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UtilityFunctions.js","sourceRoot":"","sources":["../../src/UtilityFunctions.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,aAAiC,EAAE,QAA6B;IACtG,IAAI,cAAwC,CAAC;IAC7C,IAAI,aAAmD,CAAC;IAExD,4GAA4G;IAC5G,wGAAwG;IACxG,oDAAoD;IACpD,MAAM,YAAY,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzD,cAAc,GAAG,OAAO,CAAC;QACzB,aAAa,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,0GAA0G;IAC1G,+FAA+F;IAE/F,0EAA0E;IAC1E,kDAAkD;IAClD,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAE7B,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEhC,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,cAAc,EAAE,EAAE,CAAC;QACnB,qEAAqE;QACrE,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,EAAE,CAAC;QACjB,iBAAiB,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Utils\r\n */\r\n\r\n/**\r\n * Wrapper function designed to be used for callbacks called by setInterval or setTimeout in order to propagate any\r\n * exceptions thrown in the callback to the main promise chain. It does this by creating a new promise for the callback\r\n * invocation and adding it to the timerPromises set. The main promise chain can then await\r\n * Promise.all(timerPromises) to catch any exceptions thrown in any of the callbacks. Note that if the callback\r\n * completes successfully, the promise is resolved and removed from the set. If it throws an exception, the promise is\r\n * rejected but not removed from the set, so that the main promise chain can detect that an error occurred and handle\r\n * it appropriately.\r\n * @param timerPromises A set of promises representing the currently active timer callbacks.\r\n * @param callback The async callback to be executed within the timer.\r\n * @beta\r\n */\r\nexport async function wrapTimerCallback(timerPromises: Set<Promise<void>>, callback: () => Promise<void>) {\r\n let resolvePromise: (() => void) | undefined;\r\n let rejectPromise: ((reason?: any) => void) | undefined;\r\n\r\n // The callback of the Promise constructor does not have access to the promise itself, so all we do there is\r\n // capture the resolve and reject functions for use in the async callback that would have otherwise been\r\n // placed in the setInterval or setTimeout callback.\r\n const timerPromise = new Promise<void>((resolve, reject) => {\r\n resolvePromise = resolve;\r\n rejectPromise = reject;\r\n });\r\n // Note: when we get here, resolvePromise and rejectPromise will always be defined, but there is no way to\r\n // convince TS of that fact without extra unnecessary checks, so we use ?. when accessing them.\r\n\r\n // Prevent unhandled rejection warnings. The rejection is still observable\r\n // when the consumer awaits Promise.all(promises).\r\n timerPromise.catch(() => {});\r\n\r\n timerPromises.add(timerPromise);\r\n\r\n const cleanupAndResolve = () => {\r\n resolvePromise?.();\r\n // No need to keep track of this promise anymore since it's resolved.\r\n timerPromises.delete(timerPromise);\r\n };\r\n\r\n try {\r\n await callback();\r\n cleanupAndResolve();\r\n } catch (err) {\r\n rejectPromise?.(err);\r\n }\r\n}\r\n"]}
@@ -32,6 +32,7 @@ export * from "./Tracing";
32
32
  export * from "./TupleKeyedMap";
33
33
  export * from "./TypedArrayBuilder";
34
34
  export * from "./UnexpectedErrors";
35
+ export * from "./UtilityFunctions";
35
36
  export * from "./UtilityTypes";
36
37
  export * from "./YieldManager";
37
38
  export * from "./internal/cross-package";
@@ -1 +1 @@
1
- {"version":3,"file":"core-bentley.d.ts","sourceRoot":"","sources":["../../src/core-bentley.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,0BAA0B,CAAC;AAEzC;;GAEG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG"}
1
+ {"version":3,"file":"core-bentley.d.ts","sourceRoot":"","sources":["../../src/core-bentley.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,0BAA0B,CAAC;AAEzC;;GAEG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG"}