@itwin/core-bentley 3.6.0-dev.35 → 3.6.0-dev.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/LICENSE.md +1 -1
  2. package/lib/cjs/AccessToken.d.ts +8 -8
  3. package/lib/cjs/AccessToken.js +9 -9
  4. package/lib/cjs/AccessToken.js.map +1 -1
  5. package/lib/cjs/Assert.d.ts +25 -25
  6. package/lib/cjs/Assert.js +45 -45
  7. package/lib/cjs/Assert.js.map +1 -1
  8. package/lib/cjs/AsyncMutex.d.ts +26 -26
  9. package/lib/cjs/AsyncMutex.js +43 -43
  10. package/lib/cjs/AsyncMutex.js.map +1 -1
  11. package/lib/cjs/BeEvent.d.ts +81 -81
  12. package/lib/cjs/BeEvent.js +156 -156
  13. package/lib/cjs/BeEvent.js.map +1 -1
  14. package/lib/cjs/BeSQLite.d.ts +170 -170
  15. package/lib/cjs/BeSQLite.js +183 -183
  16. package/lib/cjs/BeSQLite.js.map +1 -1
  17. package/lib/cjs/BentleyError.d.ts +378 -378
  18. package/lib/cjs/BentleyError.js +702 -702
  19. package/lib/cjs/BentleyError.js.map +1 -1
  20. package/lib/cjs/BentleyLoggerCategory.d.ts +11 -11
  21. package/lib/cjs/BentleyLoggerCategory.js +19 -19
  22. package/lib/cjs/BentleyLoggerCategory.js.map +1 -1
  23. package/lib/cjs/ByteStream.d.ts +110 -110
  24. package/lib/cjs/ByteStream.js +159 -159
  25. package/lib/cjs/ByteStream.js.map +1 -1
  26. package/lib/cjs/ClassUtils.d.ts +14 -14
  27. package/lib/cjs/ClassUtils.js +27 -27
  28. package/lib/cjs/ClassUtils.js.map +1 -1
  29. package/lib/cjs/Compare.d.ts +47 -47
  30. package/lib/cjs/Compare.js +75 -75
  31. package/lib/cjs/Compare.js.map +1 -1
  32. package/lib/cjs/CompressedId64Set.d.ts +134 -134
  33. package/lib/cjs/CompressedId64Set.js +428 -428
  34. package/lib/cjs/CompressedId64Set.js.map +1 -1
  35. package/lib/cjs/Dictionary.d.ts +125 -125
  36. package/lib/cjs/Dictionary.js +203 -203
  37. package/lib/cjs/Dictionary.js.map +1 -1
  38. package/lib/cjs/Disposable.d.ts +80 -80
  39. package/lib/cjs/Disposable.js +120 -120
  40. package/lib/cjs/Disposable.js.map +1 -1
  41. package/lib/cjs/Id.d.ts +281 -281
  42. package/lib/cjs/Id.js +637 -637
  43. package/lib/cjs/Id.js.map +1 -1
  44. package/lib/cjs/IndexMap.d.ts +65 -65
  45. package/lib/cjs/IndexMap.js +91 -91
  46. package/lib/cjs/IndexMap.js.map +1 -1
  47. package/lib/cjs/JsonSchema.d.ts +77 -77
  48. package/lib/cjs/JsonSchema.js +9 -9
  49. package/lib/cjs/JsonSchema.js.map +1 -1
  50. package/lib/cjs/JsonUtils.d.ts +78 -78
  51. package/lib/cjs/JsonUtils.js +151 -151
  52. package/lib/cjs/JsonUtils.js.map +1 -1
  53. package/lib/cjs/LRUMap.d.ts +129 -129
  54. package/lib/cjs/LRUMap.js +333 -333
  55. package/lib/cjs/LRUMap.js.map +1 -1
  56. package/lib/cjs/Logger.d.ts +143 -143
  57. package/lib/cjs/Logger.js +258 -258
  58. package/lib/cjs/Logger.js.map +1 -1
  59. package/lib/cjs/ObservableSet.d.ts +23 -23
  60. package/lib/cjs/ObservableSet.js +51 -51
  61. package/lib/cjs/ObservableSet.js.map +1 -1
  62. package/lib/cjs/OneAtATimeAction.d.ts +31 -31
  63. package/lib/cjs/OneAtATimeAction.js +94 -94
  64. package/lib/cjs/OneAtATimeAction.js.map +1 -1
  65. package/lib/cjs/OrderedId64Iterable.d.ts +74 -74
  66. package/lib/cjs/OrderedId64Iterable.js +235 -235
  67. package/lib/cjs/OrderedId64Iterable.js.map +1 -1
  68. package/lib/cjs/OrderedSet.d.ts +40 -40
  69. package/lib/cjs/OrderedSet.js +64 -64
  70. package/lib/cjs/OrderedSet.js.map +1 -1
  71. package/lib/cjs/PriorityQueue.d.ts +70 -70
  72. package/lib/cjs/PriorityQueue.js +140 -140
  73. package/lib/cjs/PriorityQueue.js.map +1 -1
  74. package/lib/cjs/ProcessDetector.d.ts +59 -59
  75. package/lib/cjs/ProcessDetector.js +71 -71
  76. package/lib/cjs/ProcessDetector.js.map +1 -1
  77. package/lib/cjs/SortedArray.d.ts +232 -232
  78. package/lib/cjs/SortedArray.js +303 -303
  79. package/lib/cjs/SortedArray.js.map +1 -1
  80. package/lib/cjs/StatusCategory.d.ts +30 -30
  81. package/lib/cjs/StatusCategory.js +460 -460
  82. package/lib/cjs/StatusCategory.js.map +1 -1
  83. package/lib/cjs/StringUtils.d.ts +22 -22
  84. package/lib/cjs/StringUtils.js +148 -148
  85. package/lib/cjs/StringUtils.js.map +1 -1
  86. package/lib/cjs/Time.d.ts +122 -122
  87. package/lib/cjs/Time.js +152 -152
  88. package/lib/cjs/Time.js.map +1 -1
  89. package/lib/cjs/Tracing.d.ts +40 -40
  90. package/lib/cjs/Tracing.js +130 -130
  91. package/lib/cjs/Tracing.js.map +1 -1
  92. package/lib/cjs/TupleKeyedMap.d.ts +36 -36
  93. package/lib/cjs/TupleKeyedMap.js +102 -102
  94. package/lib/cjs/TupleKeyedMap.js.map +1 -1
  95. package/lib/cjs/TypedArrayBuilder.d.ts +155 -155
  96. package/lib/cjs/TypedArrayBuilder.js +208 -208
  97. package/lib/cjs/TypedArrayBuilder.js.map +1 -1
  98. package/lib/cjs/UnexpectedErrors.d.ts +43 -43
  99. package/lib/cjs/UnexpectedErrors.js +68 -68
  100. package/lib/cjs/UnexpectedErrors.js.map +1 -1
  101. package/lib/cjs/UtilityTypes.d.ts +100 -100
  102. package/lib/cjs/UtilityTypes.js +40 -40
  103. package/lib/cjs/UtilityTypes.js.map +1 -1
  104. package/lib/cjs/YieldManager.d.ts +18 -18
  105. package/lib/cjs/YieldManager.js +34 -34
  106. package/lib/cjs/YieldManager.js.map +1 -1
  107. package/lib/cjs/core-bentley.d.ts +75 -75
  108. package/lib/cjs/core-bentley.js +91 -91
  109. package/lib/cjs/core-bentley.js.map +1 -1
  110. package/lib/cjs/partitionArray.d.ts +21 -21
  111. package/lib/cjs/partitionArray.js +43 -43
  112. package/lib/cjs/partitionArray.js.map +1 -1
  113. package/lib/esm/AccessToken.d.ts +8 -8
  114. package/lib/esm/AccessToken.js +8 -8
  115. package/lib/esm/AccessToken.js.map +1 -1
  116. package/lib/esm/Assert.d.ts +25 -25
  117. package/lib/esm/Assert.js +41 -41
  118. package/lib/esm/Assert.js.map +1 -1
  119. package/lib/esm/AsyncMutex.d.ts +26 -26
  120. package/lib/esm/AsyncMutex.js +39 -39
  121. package/lib/esm/AsyncMutex.js.map +1 -1
  122. package/lib/esm/BeEvent.d.ts +81 -81
  123. package/lib/esm/BeEvent.js +150 -150
  124. package/lib/esm/BeEvent.js.map +1 -1
  125. package/lib/esm/BeSQLite.d.ts +170 -170
  126. package/lib/esm/BeSQLite.js +180 -180
  127. package/lib/esm/BeSQLite.js.map +1 -1
  128. package/lib/esm/BentleyError.d.ts +378 -378
  129. package/lib/esm/BentleyError.js +698 -698
  130. package/lib/esm/BentleyError.js.map +1 -1
  131. package/lib/esm/BentleyLoggerCategory.d.ts +11 -11
  132. package/lib/esm/BentleyLoggerCategory.js +16 -16
  133. package/lib/esm/BentleyLoggerCategory.js.map +1 -1
  134. package/lib/esm/ByteStream.d.ts +110 -110
  135. package/lib/esm/ByteStream.js +155 -155
  136. package/lib/esm/ByteStream.js.map +1 -1
  137. package/lib/esm/ClassUtils.d.ts +14 -14
  138. package/lib/esm/ClassUtils.js +22 -22
  139. package/lib/esm/ClassUtils.js.map +1 -1
  140. package/lib/esm/Compare.d.ts +47 -47
  141. package/lib/esm/Compare.js +63 -63
  142. package/lib/esm/Compare.js.map +1 -1
  143. package/lib/esm/CompressedId64Set.d.ts +134 -134
  144. package/lib/esm/CompressedId64Set.js +423 -423
  145. package/lib/esm/CompressedId64Set.js.map +1 -1
  146. package/lib/esm/Dictionary.d.ts +125 -125
  147. package/lib/esm/Dictionary.js +199 -199
  148. package/lib/esm/Dictionary.js.map +1 -1
  149. package/lib/esm/Disposable.d.ts +80 -80
  150. package/lib/esm/Disposable.js +112 -112
  151. package/lib/esm/Disposable.js.map +1 -1
  152. package/lib/esm/Id.d.ts +281 -281
  153. package/lib/esm/Id.js +633 -633
  154. package/lib/esm/Id.js.map +1 -1
  155. package/lib/esm/IndexMap.d.ts +65 -65
  156. package/lib/esm/IndexMap.js +86 -86
  157. package/lib/esm/IndexMap.js.map +1 -1
  158. package/lib/esm/JsonSchema.d.ts +77 -77
  159. package/lib/esm/JsonSchema.js +8 -8
  160. package/lib/esm/JsonSchema.js.map +1 -1
  161. package/lib/esm/JsonUtils.d.ts +78 -78
  162. package/lib/esm/JsonUtils.js +148 -148
  163. package/lib/esm/JsonUtils.js.map +1 -1
  164. package/lib/esm/LRUMap.d.ts +129 -129
  165. package/lib/esm/LRUMap.js +326 -326
  166. package/lib/esm/LRUMap.js.map +1 -1
  167. package/lib/esm/Logger.d.ts +143 -143
  168. package/lib/esm/Logger.js +253 -253
  169. package/lib/esm/Logger.js.map +1 -1
  170. package/lib/esm/ObservableSet.d.ts +23 -23
  171. package/lib/esm/ObservableSet.js +47 -47
  172. package/lib/esm/ObservableSet.js.map +1 -1
  173. package/lib/esm/OneAtATimeAction.d.ts +31 -31
  174. package/lib/esm/OneAtATimeAction.js +89 -89
  175. package/lib/esm/OneAtATimeAction.js.map +1 -1
  176. package/lib/esm/OrderedId64Iterable.d.ts +74 -74
  177. package/lib/esm/OrderedId64Iterable.js +232 -232
  178. package/lib/esm/OrderedId64Iterable.js.map +1 -1
  179. package/lib/esm/OrderedSet.d.ts +40 -40
  180. package/lib/esm/OrderedSet.js +59 -59
  181. package/lib/esm/OrderedSet.js.map +1 -1
  182. package/lib/esm/PriorityQueue.d.ts +70 -70
  183. package/lib/esm/PriorityQueue.js +136 -136
  184. package/lib/esm/PriorityQueue.js.map +1 -1
  185. package/lib/esm/ProcessDetector.d.ts +59 -59
  186. package/lib/esm/ProcessDetector.js +67 -67
  187. package/lib/esm/ProcessDetector.js.map +1 -1
  188. package/lib/esm/SortedArray.d.ts +232 -232
  189. package/lib/esm/SortedArray.js +296 -296
  190. package/lib/esm/SortedArray.js.map +1 -1
  191. package/lib/esm/StatusCategory.d.ts +30 -30
  192. package/lib/esm/StatusCategory.js +454 -454
  193. package/lib/esm/StatusCategory.js.map +1 -1
  194. package/lib/esm/StringUtils.d.ts +22 -22
  195. package/lib/esm/StringUtils.js +142 -142
  196. package/lib/esm/StringUtils.js.map +1 -1
  197. package/lib/esm/Time.d.ts +122 -122
  198. package/lib/esm/Time.js +146 -146
  199. package/lib/esm/Time.js.map +1 -1
  200. package/lib/esm/Tracing.d.ts +40 -40
  201. package/lib/esm/Tracing.js +126 -126
  202. package/lib/esm/Tracing.js.map +1 -1
  203. package/lib/esm/TupleKeyedMap.d.ts +36 -36
  204. package/lib/esm/TupleKeyedMap.js +98 -98
  205. package/lib/esm/TupleKeyedMap.js.map +1 -1
  206. package/lib/esm/TypedArrayBuilder.d.ts +155 -155
  207. package/lib/esm/TypedArrayBuilder.js +200 -200
  208. package/lib/esm/TypedArrayBuilder.js.map +1 -1
  209. package/lib/esm/UnexpectedErrors.d.ts +43 -43
  210. package/lib/esm/UnexpectedErrors.js +64 -64
  211. package/lib/esm/UnexpectedErrors.js.map +1 -1
  212. package/lib/esm/UtilityTypes.d.ts +100 -100
  213. package/lib/esm/UtilityTypes.js +34 -34
  214. package/lib/esm/UtilityTypes.js.map +1 -1
  215. package/lib/esm/YieldManager.d.ts +18 -18
  216. package/lib/esm/YieldManager.js +30 -30
  217. package/lib/esm/YieldManager.js.map +1 -1
  218. package/lib/esm/core-bentley.d.ts +75 -75
  219. package/lib/esm/core-bentley.js +79 -79
  220. package/lib/esm/core-bentley.js.map +1 -1
  221. package/lib/esm/partitionArray.d.ts +21 -21
  222. package/lib/esm/partitionArray.js +39 -39
  223. package/lib/esm/partitionArray.js.map +1 -1
  224. package/package.json +3 -3
@@ -1,233 +1,233 @@
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 Ids
7
- */
8
- import { assert } from "./Assert";
9
- /** A collection of **valid** [[Id64String]]s sorted in ascending order by the unsigned 64-bit integer value of the Ids.
10
- * This ordering is a requirement for several groups of APIs including [[CompressedId64Set]].
11
- * When used as input to a function, duplicate Ids are ignored; when returned as a function output, no duplicates are present.
12
- * @see [[CompressedId64Set]] for a compact string representation of such an ordered collection.
13
- * @see [[OrderedId64Iterable.compare]] for a function that compares Ids based on this criterion.
14
- * @see [[OrderedId64Array]] for a mutable implementation.
15
- * @public
16
- */
17
- export var OrderedId64Iterable;
18
- (function (OrderedId64Iterable) {
19
- /** An ordered comparison of [[Id64String]]s suitable for use with sorting routines like
20
- * [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) and sorted containers
21
- * like [[SortedArray]] and [[Dictionary]]. The comparison compares the 64-bit numerical values of the two Ids, returning a negative number if lhs < rhs,
22
- * a positive number if lhs > rhs, or zero if lhs == rhs.
23
- * The default string comparison is fine (and more efficient) when numerical ordering is not required; use this instead if you want e.g., "0x100" to be greater than "0xf".
24
- * @see [[OrderedId64Iterable.sortArray]] for a convenient way to sort an array of Id64Strings.
25
- */
26
- function compare(lhs, rhs) {
27
- if (lhs.length !== rhs.length)
28
- return lhs.length < rhs.length ? -1 : 1;
29
- // This is faster than localeCompare(). Unclear why there is no string.compare() - would be generally useful in
30
- // array sort functions...
31
- if (lhs !== rhs)
32
- return lhs < rhs ? -1 : 1;
33
- return 0;
34
- }
35
- OrderedId64Iterable.compare = compare;
36
- /** Sort an array of [[Id64String]]s **in-place** in ascending order by their 64-bit numerical values.
37
- * @see [[OrderedId64Iterable.compare]] for the comparison routine used.
38
- * @returns the input array.
39
- * @note This function returns its input for consistency with Javascript's
40
- * [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) method.
41
- * It **does not** create a **new** array.
42
- */
43
- function sortArray(ids) {
44
- ids.sort((x, y) => compare(x, y));
45
- return ids;
46
- }
47
- OrderedId64Iterable.sortArray = sortArray;
48
- /** Given two ordered collections of [[Id64String]]s, determine whether they are identical sets. Duplicate Ids are ignored.
49
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
50
- */
51
- function areEqualSets(ids1, ids2) {
52
- const leftIter = uniqueIterator(ids1);
53
- const rightIter = uniqueIterator(ids2);
54
- let leftState = leftIter.next();
55
- let rightState = rightIter.next();
56
- while (!leftState.done && !rightState.done) {
57
- const left = leftState.value;
58
- const right = rightState.value;
59
- if (0 !== compare(left, right))
60
- return false;
61
- leftState = leftIter.next();
62
- rightState = rightIter.next();
63
- }
64
- if (leftState.done && rightState.done)
65
- return true;
66
- return false;
67
- }
68
- OrderedId64Iterable.areEqualSets = areEqualSets;
69
- /** Given an ordered collection of [[Id64String]]s, determine if it contains any Ids.
70
- * @param ids A well-formed, ordered collection of zero or more valid Ids.
71
- * @returns true if the input represents an empty set of Ids. The result is unspecified if the input does not meet the criteria for the input type.
72
- */
73
- function isEmptySet(ids) {
74
- if (typeof ids === "string")
75
- return "" === ids;
76
- return true === ids[Symbol.iterator]().next().done;
77
- }
78
- OrderedId64Iterable.isEmptySet = isEmptySet;
79
- /** Given an ordered collection of [[Id64String]]s possibly containing duplicates, produce an ordered collection containing no duplicates.
80
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
81
- */
82
- function unique(ids) {
83
- return { [Symbol.iterator]: () => uniqueIterator(ids) };
84
- }
85
- OrderedId64Iterable.unique = unique;
86
- /** Given an ordered collection of [[Id64String]]s possibly containing duplicates, produce an ordered iterator over the distinct Ids, eliminating duplicates.
87
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
88
- */
89
- function* uniqueIterator(ids) {
90
- const iter = ids[Symbol.iterator]();
91
- let state = iter.next();
92
- let prev;
93
- while (!state.done) {
94
- const id = state.value;
95
- state = iter.next();
96
- if (id !== prev) {
97
- prev = id;
98
- yield id;
99
- }
100
- }
101
- }
102
- OrderedId64Iterable.uniqueIterator = uniqueIterator;
103
- /** Given two ordered collections of [[Id64String]]s, produce a collection representing their union - i.e., the Ids that are present in either or both collections.
104
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
105
- */
106
- function union(ids1, ids2) {
107
- return { [Symbol.iterator]: () => unionIterator(ids1, ids2) };
108
- }
109
- OrderedId64Iterable.union = union;
110
- /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their intersection - i.e., the Ids that are present in both collections.
111
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
112
- */
113
- function intersection(ids1, ids2) {
114
- return { [Symbol.iterator]: () => intersectionIterator(ids1, ids2) };
115
- }
116
- OrderedId64Iterable.intersection = intersection;
117
- /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their difference - i.e., the Ids that are present in `ids1` but not present in `ids2`.
118
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
119
- */
120
- function difference(ids1, ids2) {
121
- return { [Symbol.iterator]: () => differenceIterator(ids1, ids2) };
122
- }
123
- OrderedId64Iterable.difference = difference;
124
- /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their union - i.e., the Ids that are present in either or both collections.
125
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
126
- */
127
- function* unionIterator(ids1, ids2) {
128
- const leftIter = ids1[Symbol.iterator]();
129
- const rightIter = ids2[Symbol.iterator]();
130
- let leftState = leftIter.next();
131
- let rightState = rightIter.next();
132
- let prev;
133
- while (!leftState.done || !rightState.done) {
134
- const left = leftState.done ? undefined : leftState.value;
135
- const right = rightState.done ? undefined : rightState.value;
136
- assert(undefined !== left || undefined !== right);
137
- if (undefined === left && undefined === right)
138
- break;
139
- let next;
140
- if (undefined === left) {
141
- assert(undefined !== right);
142
- next = right;
143
- rightState = rightIter.next();
144
- }
145
- else if (undefined === right) {
146
- next = left;
147
- leftState = leftIter.next();
148
- }
149
- else {
150
- const cmp = compare(left, right);
151
- if (cmp <= 0) {
152
- next = left;
153
- leftState = leftIter.next();
154
- if (0 === cmp)
155
- rightState = rightIter.next();
156
- }
157
- else {
158
- next = right;
159
- rightState = rightIter.next();
160
- }
161
- }
162
- if (prev === next)
163
- continue;
164
- prev = next;
165
- yield next;
166
- }
167
- }
168
- OrderedId64Iterable.unionIterator = unionIterator;
169
- /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their intersection - i.e., the Ids that are present in both collections.
170
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
171
- */
172
- function* intersectionIterator(ids1, ids2) {
173
- const leftIter = ids1[Symbol.iterator]();
174
- const rightIter = ids2[Symbol.iterator]();
175
- let leftState = leftIter.next();
176
- let rightState = rightIter.next();
177
- let prev;
178
- while (!leftState.done && !rightState.done) {
179
- const left = leftState.value;
180
- leftState = leftIter.next();
181
- if (left === prev)
182
- continue;
183
- prev = left;
184
- let right = rightState.value;
185
- let cmp = compare(left, right);
186
- while (cmp > 0) {
187
- rightState = rightIter.next();
188
- if (rightState.done)
189
- return;
190
- right = rightState.value;
191
- cmp = compare(left, right);
192
- }
193
- if (0 === cmp)
194
- yield left;
195
- }
196
- }
197
- OrderedId64Iterable.intersectionIterator = intersectionIterator;
198
- /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their difference - i.e., the Ids that are present in `ids1` but not present in `ids2`.
199
- * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
200
- */
201
- function* differenceIterator(ids1, ids2) {
202
- const leftIter = ids1[Symbol.iterator]();
203
- const rightIter = ids2[Symbol.iterator]();
204
- let leftState = leftIter.next();
205
- let rightState = rightIter.next();
206
- let prev;
207
- while (!leftState.done) {
208
- const left = leftState.value;
209
- leftState = leftIter.next();
210
- if (left === prev)
211
- continue;
212
- else if (rightState.done) {
213
- yield prev = left;
214
- continue;
215
- }
216
- let right = rightState.value;
217
- let cmp = compare(left, right);
218
- while (cmp > 0 && !rightState.done) {
219
- rightState = rightIter.next();
220
- if (rightState.done) {
221
- yield prev = left;
222
- continue;
223
- }
224
- right = rightState.value;
225
- cmp = compare(left, right);
226
- }
227
- if (cmp < 0)
228
- yield prev = left;
229
- }
230
- }
231
- OrderedId64Iterable.differenceIterator = differenceIterator;
232
- })(OrderedId64Iterable || (OrderedId64Iterable = {}));
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 Ids
7
+ */
8
+ import { assert } from "./Assert";
9
+ /** A collection of **valid** [[Id64String]]s sorted in ascending order by the unsigned 64-bit integer value of the Ids.
10
+ * This ordering is a requirement for several groups of APIs including [[CompressedId64Set]].
11
+ * When used as input to a function, duplicate Ids are ignored; when returned as a function output, no duplicates are present.
12
+ * @see [[CompressedId64Set]] for a compact string representation of such an ordered collection.
13
+ * @see [[OrderedId64Iterable.compare]] for a function that compares Ids based on this criterion.
14
+ * @see [[OrderedId64Array]] for a mutable implementation.
15
+ * @public
16
+ */
17
+ export var OrderedId64Iterable;
18
+ (function (OrderedId64Iterable) {
19
+ /** An ordered comparison of [[Id64String]]s suitable for use with sorting routines like
20
+ * [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) and sorted containers
21
+ * like [[SortedArray]] and [[Dictionary]]. The comparison compares the 64-bit numerical values of the two Ids, returning a negative number if lhs < rhs,
22
+ * a positive number if lhs > rhs, or zero if lhs == rhs.
23
+ * The default string comparison is fine (and more efficient) when numerical ordering is not required; use this instead if you want e.g., "0x100" to be greater than "0xf".
24
+ * @see [[OrderedId64Iterable.sortArray]] for a convenient way to sort an array of Id64Strings.
25
+ */
26
+ function compare(lhs, rhs) {
27
+ if (lhs.length !== rhs.length)
28
+ return lhs.length < rhs.length ? -1 : 1;
29
+ // This is faster than localeCompare(). Unclear why there is no string.compare() - would be generally useful in
30
+ // array sort functions...
31
+ if (lhs !== rhs)
32
+ return lhs < rhs ? -1 : 1;
33
+ return 0;
34
+ }
35
+ OrderedId64Iterable.compare = compare;
36
+ /** Sort an array of [[Id64String]]s **in-place** in ascending order by their 64-bit numerical values.
37
+ * @see [[OrderedId64Iterable.compare]] for the comparison routine used.
38
+ * @returns the input array.
39
+ * @note This function returns its input for consistency with Javascript's
40
+ * [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) method.
41
+ * It **does not** create a **new** array.
42
+ */
43
+ function sortArray(ids) {
44
+ ids.sort((x, y) => compare(x, y));
45
+ return ids;
46
+ }
47
+ OrderedId64Iterable.sortArray = sortArray;
48
+ /** Given two ordered collections of [[Id64String]]s, determine whether they are identical sets. Duplicate Ids are ignored.
49
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
50
+ */
51
+ function areEqualSets(ids1, ids2) {
52
+ const leftIter = uniqueIterator(ids1);
53
+ const rightIter = uniqueIterator(ids2);
54
+ let leftState = leftIter.next();
55
+ let rightState = rightIter.next();
56
+ while (!leftState.done && !rightState.done) {
57
+ const left = leftState.value;
58
+ const right = rightState.value;
59
+ if (0 !== compare(left, right))
60
+ return false;
61
+ leftState = leftIter.next();
62
+ rightState = rightIter.next();
63
+ }
64
+ if (leftState.done && rightState.done)
65
+ return true;
66
+ return false;
67
+ }
68
+ OrderedId64Iterable.areEqualSets = areEqualSets;
69
+ /** Given an ordered collection of [[Id64String]]s, determine if it contains any Ids.
70
+ * @param ids A well-formed, ordered collection of zero or more valid Ids.
71
+ * @returns true if the input represents an empty set of Ids. The result is unspecified if the input does not meet the criteria for the input type.
72
+ */
73
+ function isEmptySet(ids) {
74
+ if (typeof ids === "string")
75
+ return "" === ids;
76
+ return true === ids[Symbol.iterator]().next().done;
77
+ }
78
+ OrderedId64Iterable.isEmptySet = isEmptySet;
79
+ /** Given an ordered collection of [[Id64String]]s possibly containing duplicates, produce an ordered collection containing no duplicates.
80
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
81
+ */
82
+ function unique(ids) {
83
+ return { [Symbol.iterator]: () => uniqueIterator(ids) };
84
+ }
85
+ OrderedId64Iterable.unique = unique;
86
+ /** Given an ordered collection of [[Id64String]]s possibly containing duplicates, produce an ordered iterator over the distinct Ids, eliminating duplicates.
87
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
88
+ */
89
+ function* uniqueIterator(ids) {
90
+ const iter = ids[Symbol.iterator]();
91
+ let state = iter.next();
92
+ let prev;
93
+ while (!state.done) {
94
+ const id = state.value;
95
+ state = iter.next();
96
+ if (id !== prev) {
97
+ prev = id;
98
+ yield id;
99
+ }
100
+ }
101
+ }
102
+ OrderedId64Iterable.uniqueIterator = uniqueIterator;
103
+ /** Given two ordered collections of [[Id64String]]s, produce a collection representing their union - i.e., the Ids that are present in either or both collections.
104
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
105
+ */
106
+ function union(ids1, ids2) {
107
+ return { [Symbol.iterator]: () => unionIterator(ids1, ids2) };
108
+ }
109
+ OrderedId64Iterable.union = union;
110
+ /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their intersection - i.e., the Ids that are present in both collections.
111
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
112
+ */
113
+ function intersection(ids1, ids2) {
114
+ return { [Symbol.iterator]: () => intersectionIterator(ids1, ids2) };
115
+ }
116
+ OrderedId64Iterable.intersection = intersection;
117
+ /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their difference - i.e., the Ids that are present in `ids1` but not present in `ids2`.
118
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
119
+ */
120
+ function difference(ids1, ids2) {
121
+ return { [Symbol.iterator]: () => differenceIterator(ids1, ids2) };
122
+ }
123
+ OrderedId64Iterable.difference = difference;
124
+ /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their union - i.e., the Ids that are present in either or both collections.
125
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
126
+ */
127
+ function* unionIterator(ids1, ids2) {
128
+ const leftIter = ids1[Symbol.iterator]();
129
+ const rightIter = ids2[Symbol.iterator]();
130
+ let leftState = leftIter.next();
131
+ let rightState = rightIter.next();
132
+ let prev;
133
+ while (!leftState.done || !rightState.done) {
134
+ const left = leftState.done ? undefined : leftState.value;
135
+ const right = rightState.done ? undefined : rightState.value;
136
+ assert(undefined !== left || undefined !== right);
137
+ if (undefined === left && undefined === right)
138
+ break;
139
+ let next;
140
+ if (undefined === left) {
141
+ assert(undefined !== right);
142
+ next = right;
143
+ rightState = rightIter.next();
144
+ }
145
+ else if (undefined === right) {
146
+ next = left;
147
+ leftState = leftIter.next();
148
+ }
149
+ else {
150
+ const cmp = compare(left, right);
151
+ if (cmp <= 0) {
152
+ next = left;
153
+ leftState = leftIter.next();
154
+ if (0 === cmp)
155
+ rightState = rightIter.next();
156
+ }
157
+ else {
158
+ next = right;
159
+ rightState = rightIter.next();
160
+ }
161
+ }
162
+ if (prev === next)
163
+ continue;
164
+ prev = next;
165
+ yield next;
166
+ }
167
+ }
168
+ OrderedId64Iterable.unionIterator = unionIterator;
169
+ /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their intersection - i.e., the Ids that are present in both collections.
170
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
171
+ */
172
+ function* intersectionIterator(ids1, ids2) {
173
+ const leftIter = ids1[Symbol.iterator]();
174
+ const rightIter = ids2[Symbol.iterator]();
175
+ let leftState = leftIter.next();
176
+ let rightState = rightIter.next();
177
+ let prev;
178
+ while (!leftState.done && !rightState.done) {
179
+ const left = leftState.value;
180
+ leftState = leftIter.next();
181
+ if (left === prev)
182
+ continue;
183
+ prev = left;
184
+ let right = rightState.value;
185
+ let cmp = compare(left, right);
186
+ while (cmp > 0) {
187
+ rightState = rightIter.next();
188
+ if (rightState.done)
189
+ return;
190
+ right = rightState.value;
191
+ cmp = compare(left, right);
192
+ }
193
+ if (0 === cmp)
194
+ yield left;
195
+ }
196
+ }
197
+ OrderedId64Iterable.intersectionIterator = intersectionIterator;
198
+ /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their difference - i.e., the Ids that are present in `ids1` but not present in `ids2`.
199
+ * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.
200
+ */
201
+ function* differenceIterator(ids1, ids2) {
202
+ const leftIter = ids1[Symbol.iterator]();
203
+ const rightIter = ids2[Symbol.iterator]();
204
+ let leftState = leftIter.next();
205
+ let rightState = rightIter.next();
206
+ let prev;
207
+ while (!leftState.done) {
208
+ const left = leftState.value;
209
+ leftState = leftIter.next();
210
+ if (left === prev)
211
+ continue;
212
+ else if (rightState.done) {
213
+ yield prev = left;
214
+ continue;
215
+ }
216
+ let right = rightState.value;
217
+ let cmp = compare(left, right);
218
+ while (cmp > 0 && !rightState.done) {
219
+ rightState = rightIter.next();
220
+ if (rightState.done) {
221
+ yield prev = left;
222
+ continue;
223
+ }
224
+ right = rightState.value;
225
+ cmp = compare(left, right);
226
+ }
227
+ if (cmp < 0)
228
+ yield prev = left;
229
+ }
230
+ }
231
+ OrderedId64Iterable.differenceIterator = differenceIterator;
232
+ })(OrderedId64Iterable || (OrderedId64Iterable = {}));
233
233
  //# sourceMappingURL=OrderedId64Iterable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrderedId64Iterable.js","sourceRoot":"","sources":["../../src/OrderedId64Iterable.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\nimport { assert } from \"./Assert\";\r\nimport { CompressedId64Set } from \"./CompressedId64Set\";\r\nimport { Id64Array, Id64String } from \"./Id\";\r\n\r\n/** @public */\r\nexport type OrderedId64Iterable = Iterable<Id64String>;\r\n\r\n/** A collection of **valid** [[Id64String]]s sorted in ascending order by the unsigned 64-bit integer value of the Ids.\r\n * This ordering is a requirement for several groups of APIs including [[CompressedId64Set]].\r\n * When used as input to a function, duplicate Ids are ignored; when returned as a function output, no duplicates are present.\r\n * @see [[CompressedId64Set]] for a compact string representation of such an ordered collection.\r\n * @see [[OrderedId64Iterable.compare]] for a function that compares Ids based on this criterion.\r\n * @see [[OrderedId64Array]] for a mutable implementation.\r\n * @public\r\n */\r\nexport namespace OrderedId64Iterable { // eslint-disable-line @typescript-eslint/no-redeclare\r\n /** An ordered comparison of [[Id64String]]s suitable for use with sorting routines like\r\n * [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) and sorted containers\r\n * like [[SortedArray]] and [[Dictionary]]. The comparison compares the 64-bit numerical values of the two Ids, returning a negative number if lhs < rhs,\r\n * a positive number if lhs > rhs, or zero if lhs == rhs.\r\n * The default string comparison is fine (and more efficient) when numerical ordering is not required; use this instead if you want e.g., \"0x100\" to be greater than \"0xf\".\r\n * @see [[OrderedId64Iterable.sortArray]] for a convenient way to sort an array of Id64Strings.\r\n */\r\n export function compare(lhs: Id64String, rhs: Id64String): number {\r\n if (lhs.length !== rhs.length)\r\n return lhs.length < rhs.length ? -1 : 1;\r\n\r\n // This is faster than localeCompare(). Unclear why there is no string.compare() - would be generally useful in\r\n // array sort functions...\r\n if (lhs !== rhs)\r\n return lhs < rhs ? -1 : 1;\r\n\r\n return 0;\r\n }\r\n\r\n /** Sort an array of [[Id64String]]s **in-place** in ascending order by their 64-bit numerical values.\r\n * @see [[OrderedId64Iterable.compare]] for the comparison routine used.\r\n * @returns the input array.\r\n * @note This function returns its input for consistency with Javascript's\r\n * [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) method.\r\n * It **does not** create a **new** array.\r\n */\r\n export function sortArray(ids: Id64Array): Id64Array {\r\n ids.sort((x, y) => compare(x, y));\r\n return ids;\r\n }\r\n\r\n /** Given two ordered collections of [[Id64String]]s, determine whether they are identical sets. Duplicate Ids are ignored.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function areEqualSets(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable): boolean {\r\n const leftIter = uniqueIterator(ids1);\r\n const rightIter = uniqueIterator(ids2);\r\n let leftState = leftIter.next();\r\n let rightState = rightIter.next();\r\n\r\n while (!leftState.done && !rightState.done) {\r\n const left = leftState.value;\r\n const right = rightState.value;\r\n if (0 !== compare(left, right))\r\n return false;\r\n\r\n leftState = leftIter.next();\r\n rightState = rightIter.next();\r\n }\r\n\r\n if (leftState.done && rightState.done)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n /** Given an ordered collection of [[Id64String]]s, determine if it contains any Ids.\r\n * @param ids A well-formed, ordered collection of zero or more valid Ids.\r\n * @returns true if the input represents an empty set of Ids. The result is unspecified if the input does not meet the criteria for the input type.\r\n */\r\n export function isEmptySet(ids: OrderedId64Iterable | CompressedId64Set): boolean {\r\n if (typeof ids === \"string\")\r\n return \"\" === ids;\r\n\r\n return true === ids[Symbol.iterator]().next().done;\r\n }\r\n\r\n /** Given an ordered collection of [[Id64String]]s possibly containing duplicates, produce an ordered collection containing no duplicates.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function unique(ids: OrderedId64Iterable): OrderedId64Iterable {\r\n return { [Symbol.iterator]: () => uniqueIterator(ids) };\r\n }\r\n\r\n /** Given an ordered collection of [[Id64String]]s possibly containing duplicates, produce an ordered iterator over the distinct Ids, eliminating duplicates.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function* uniqueIterator(ids: OrderedId64Iterable) {\r\n const iter = ids[Symbol.iterator]();\r\n let state = iter.next();\r\n let prev: Id64String | undefined;\r\n\r\n while (!state.done) {\r\n const id = state.value;\r\n state = iter.next();\r\n if (id !== prev) {\r\n prev = id;\r\n yield id;\r\n }\r\n }\r\n }\r\n\r\n /** Given two ordered collections of [[Id64String]]s, produce a collection representing their union - i.e., the Ids that are present in either or both collections.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function union(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable): OrderedId64Iterable {\r\n return { [Symbol.iterator]: () => unionIterator(ids1, ids2) };\r\n }\r\n\r\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their intersection - i.e., the Ids that are present in both collections.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function intersection(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable): OrderedId64Iterable {\r\n return { [Symbol.iterator]: () => intersectionIterator(ids1, ids2) };\r\n }\r\n\r\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their difference - i.e., the Ids that are present in `ids1` but not present in `ids2`.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function difference(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable): OrderedId64Iterable {\r\n return { [Symbol.iterator]: () => differenceIterator(ids1, ids2) };\r\n }\r\n\r\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their union - i.e., the Ids that are present in either or both collections.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function* unionIterator(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable) {\r\n const leftIter = ids1[Symbol.iterator]();\r\n const rightIter = ids2[Symbol.iterator]();\r\n let leftState = leftIter.next();\r\n let rightState = rightIter.next();\r\n\r\n let prev: string | undefined;\r\n while (!leftState.done || !rightState.done) {\r\n const left = leftState.done ? undefined : leftState.value;\r\n const right = rightState.done ? undefined : rightState.value;\r\n\r\n assert(undefined !== left || undefined !== right);\r\n if (undefined === left && undefined === right)\r\n break;\r\n\r\n let next: Id64String;\r\n if (undefined === left) {\r\n assert(undefined !== right);\r\n next = right;\r\n rightState = rightIter.next();\r\n } else if (undefined === right) {\r\n next = left;\r\n leftState = leftIter.next();\r\n } else {\r\n const cmp = compare(left, right);\r\n if (cmp <= 0) {\r\n next = left;\r\n leftState = leftIter.next();\r\n if (0 === cmp)\r\n rightState = rightIter.next();\r\n } else {\r\n next = right;\r\n rightState = rightIter.next();\r\n }\r\n }\r\n\r\n if (prev === next)\r\n continue;\r\n\r\n prev = next;\r\n yield next;\r\n }\r\n }\r\n\r\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their intersection - i.e., the Ids that are present in both collections.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function* intersectionIterator(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable) {\r\n const leftIter = ids1[Symbol.iterator]();\r\n const rightIter = ids2[Symbol.iterator]();\r\n let leftState = leftIter.next();\r\n let rightState = rightIter.next();\r\n\r\n let prev: string | undefined;\r\n while (!leftState.done && !rightState.done) {\r\n const left = leftState.value;\r\n leftState = leftIter.next();\r\n if (left === prev)\r\n continue;\r\n\r\n prev = left;\r\n\r\n let right = rightState.value;\r\n let cmp = compare(left, right);\r\n while (cmp > 0) {\r\n rightState = rightIter.next();\r\n if (rightState.done)\r\n return;\r\n\r\n right = rightState.value;\r\n cmp = compare(left, right);\r\n }\r\n\r\n if (0 === cmp)\r\n yield left;\r\n }\r\n }\r\n\r\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their difference - i.e., the Ids that are present in `ids1` but not present in `ids2`.\r\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\r\n */\r\n export function* differenceIterator(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable) {\r\n const leftIter = ids1[Symbol.iterator]();\r\n const rightIter = ids2[Symbol.iterator]();\r\n let leftState = leftIter.next();\r\n let rightState = rightIter.next();\r\n\r\n let prev: string | undefined;\r\n while (!leftState.done) {\r\n const left = leftState.value;\r\n leftState = leftIter.next();\r\n if (left === prev)\r\n continue;\r\n else if (rightState.done) {\r\n yield prev = left;\r\n continue;\r\n }\r\n\r\n let right = rightState.value;\r\n let cmp = compare(left, right);\r\n while (cmp > 0 && !rightState.done) {\r\n rightState = rightIter.next();\r\n if (rightState.done) {\r\n yield prev = left;\r\n continue;\r\n }\r\n\r\n right = rightState.value;\r\n cmp = compare(left, right);\r\n }\r\n\r\n if (cmp < 0)\r\n yield prev = left;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"OrderedId64Iterable.js","sourceRoot":"","sources":["../../src/OrderedId64Iterable.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Ids\n */\n\nimport { assert } from \"./Assert\";\nimport { CompressedId64Set } from \"./CompressedId64Set\";\nimport { Id64Array, Id64String } from \"./Id\";\n\n/** @public */\nexport type OrderedId64Iterable = Iterable<Id64String>;\n\n/** A collection of **valid** [[Id64String]]s sorted in ascending order by the unsigned 64-bit integer value of the Ids.\n * This ordering is a requirement for several groups of APIs including [[CompressedId64Set]].\n * When used as input to a function, duplicate Ids are ignored; when returned as a function output, no duplicates are present.\n * @see [[CompressedId64Set]] for a compact string representation of such an ordered collection.\n * @see [[OrderedId64Iterable.compare]] for a function that compares Ids based on this criterion.\n * @see [[OrderedId64Array]] for a mutable implementation.\n * @public\n */\nexport namespace OrderedId64Iterable { // eslint-disable-line @typescript-eslint/no-redeclare\n /** An ordered comparison of [[Id64String]]s suitable for use with sorting routines like\n * [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) and sorted containers\n * like [[SortedArray]] and [[Dictionary]]. The comparison compares the 64-bit numerical values of the two Ids, returning a negative number if lhs < rhs,\n * a positive number if lhs > rhs, or zero if lhs == rhs.\n * The default string comparison is fine (and more efficient) when numerical ordering is not required; use this instead if you want e.g., \"0x100\" to be greater than \"0xf\".\n * @see [[OrderedId64Iterable.sortArray]] for a convenient way to sort an array of Id64Strings.\n */\n export function compare(lhs: Id64String, rhs: Id64String): number {\n if (lhs.length !== rhs.length)\n return lhs.length < rhs.length ? -1 : 1;\n\n // This is faster than localeCompare(). Unclear why there is no string.compare() - would be generally useful in\n // array sort functions...\n if (lhs !== rhs)\n return lhs < rhs ? -1 : 1;\n\n return 0;\n }\n\n /** Sort an array of [[Id64String]]s **in-place** in ascending order by their 64-bit numerical values.\n * @see [[OrderedId64Iterable.compare]] for the comparison routine used.\n * @returns the input array.\n * @note This function returns its input for consistency with Javascript's\n * [Array.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) method.\n * It **does not** create a **new** array.\n */\n export function sortArray(ids: Id64Array): Id64Array {\n ids.sort((x, y) => compare(x, y));\n return ids;\n }\n\n /** Given two ordered collections of [[Id64String]]s, determine whether they are identical sets. Duplicate Ids are ignored.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function areEqualSets(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable): boolean {\n const leftIter = uniqueIterator(ids1);\n const rightIter = uniqueIterator(ids2);\n let leftState = leftIter.next();\n let rightState = rightIter.next();\n\n while (!leftState.done && !rightState.done) {\n const left = leftState.value;\n const right = rightState.value;\n if (0 !== compare(left, right))\n return false;\n\n leftState = leftIter.next();\n rightState = rightIter.next();\n }\n\n if (leftState.done && rightState.done)\n return true;\n\n return false;\n }\n\n /** Given an ordered collection of [[Id64String]]s, determine if it contains any Ids.\n * @param ids A well-formed, ordered collection of zero or more valid Ids.\n * @returns true if the input represents an empty set of Ids. The result is unspecified if the input does not meet the criteria for the input type.\n */\n export function isEmptySet(ids: OrderedId64Iterable | CompressedId64Set): boolean {\n if (typeof ids === \"string\")\n return \"\" === ids;\n\n return true === ids[Symbol.iterator]().next().done;\n }\n\n /** Given an ordered collection of [[Id64String]]s possibly containing duplicates, produce an ordered collection containing no duplicates.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function unique(ids: OrderedId64Iterable): OrderedId64Iterable {\n return { [Symbol.iterator]: () => uniqueIterator(ids) };\n }\n\n /** Given an ordered collection of [[Id64String]]s possibly containing duplicates, produce an ordered iterator over the distinct Ids, eliminating duplicates.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function* uniqueIterator(ids: OrderedId64Iterable) {\n const iter = ids[Symbol.iterator]();\n let state = iter.next();\n let prev: Id64String | undefined;\n\n while (!state.done) {\n const id = state.value;\n state = iter.next();\n if (id !== prev) {\n prev = id;\n yield id;\n }\n }\n }\n\n /** Given two ordered collections of [[Id64String]]s, produce a collection representing their union - i.e., the Ids that are present in either or both collections.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function union(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable): OrderedId64Iterable {\n return { [Symbol.iterator]: () => unionIterator(ids1, ids2) };\n }\n\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their intersection - i.e., the Ids that are present in both collections.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function intersection(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable): OrderedId64Iterable {\n return { [Symbol.iterator]: () => intersectionIterator(ids1, ids2) };\n }\n\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their difference - i.e., the Ids that are present in `ids1` but not present in `ids2`.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function difference(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable): OrderedId64Iterable {\n return { [Symbol.iterator]: () => differenceIterator(ids1, ids2) };\n }\n\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their union - i.e., the Ids that are present in either or both collections.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function* unionIterator(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable) {\n const leftIter = ids1[Symbol.iterator]();\n const rightIter = ids2[Symbol.iterator]();\n let leftState = leftIter.next();\n let rightState = rightIter.next();\n\n let prev: string | undefined;\n while (!leftState.done || !rightState.done) {\n const left = leftState.done ? undefined : leftState.value;\n const right = rightState.done ? undefined : rightState.value;\n\n assert(undefined !== left || undefined !== right);\n if (undefined === left && undefined === right)\n break;\n\n let next: Id64String;\n if (undefined === left) {\n assert(undefined !== right);\n next = right;\n rightState = rightIter.next();\n } else if (undefined === right) {\n next = left;\n leftState = leftIter.next();\n } else {\n const cmp = compare(left, right);\n if (cmp <= 0) {\n next = left;\n leftState = leftIter.next();\n if (0 === cmp)\n rightState = rightIter.next();\n } else {\n next = right;\n rightState = rightIter.next();\n }\n }\n\n if (prev === next)\n continue;\n\n prev = next;\n yield next;\n }\n }\n\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their intersection - i.e., the Ids that are present in both collections.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function* intersectionIterator(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable) {\n const leftIter = ids1[Symbol.iterator]();\n const rightIter = ids2[Symbol.iterator]();\n let leftState = leftIter.next();\n let rightState = rightIter.next();\n\n let prev: string | undefined;\n while (!leftState.done && !rightState.done) {\n const left = leftState.value;\n leftState = leftIter.next();\n if (left === prev)\n continue;\n\n prev = left;\n\n let right = rightState.value;\n let cmp = compare(left, right);\n while (cmp > 0) {\n rightState = rightIter.next();\n if (rightState.done)\n return;\n\n right = rightState.value;\n cmp = compare(left, right);\n }\n\n if (0 === cmp)\n yield left;\n }\n }\n\n /** Given two ordered collections of [[Id64String]]s, produce an iterator representing their difference - i.e., the Ids that are present in `ids1` but not present in `ids2`.\n * @note If the inputs are not ordered as required by [[OrderedId64Iterable]], the results are unpredictable.\n */\n export function* differenceIterator(ids1: OrderedId64Iterable, ids2: OrderedId64Iterable) {\n const leftIter = ids1[Symbol.iterator]();\n const rightIter = ids2[Symbol.iterator]();\n let leftState = leftIter.next();\n let rightState = rightIter.next();\n\n let prev: string | undefined;\n while (!leftState.done) {\n const left = leftState.value;\n leftState = leftIter.next();\n if (left === prev)\n continue;\n else if (rightState.done) {\n yield prev = left;\n continue;\n }\n\n let right = rightState.value;\n let cmp = compare(left, right);\n while (cmp > 0 && !rightState.done) {\n rightState = rightIter.next();\n if (rightState.done) {\n yield prev = left;\n continue;\n }\n\n right = rightState.value;\n cmp = compare(left, right);\n }\n\n if (cmp < 0)\n yield prev = left;\n }\n }\n}\n"]}
@@ -1,41 +1,41 @@
1
- /** @packageDocumentation
2
- * @module Collections
3
- */
4
- import { OrderedComparator } from "./Compare";
5
- import { CloneFunction, SortedArray } from "./SortedArray";
6
- /** A read-only equivalent of `Set<T>` that maintains its elements in sorted order as specified by a comparison function.
7
- * Iteration returns elements in the order specified by the comparison function, as opposed to `Set` which returns elements in insertion order.
8
- * Implemented in terms of [[SortedArray]].
9
- * @public
10
- */
11
- export declare class ReadonlyOrderedSet<T> implements Iterable<T> {
12
- protected readonly _array: SortedArray<T>;
13
- /** Construct a new ReadonlyOrderedSet<T>.
14
- * @param compare The function used to compare elements within the set, determining their ordering.
15
- * @param clone The function invoked to clone a new element for insertion into the set. The default implementation simply returns its input.
16
- */
17
- constructor(compare: OrderedComparator<T>, clone?: CloneFunction<T>);
18
- /** The number of elements in the set. */
19
- get size(): number;
20
- /** Returns true if `value` is present in the set. */
21
- has(value: T): boolean;
22
- /** Iterate over the elements in sorted order (as opposed to `Set`'s iterator, which returns elements in insertion order). */
23
- [Symbol.iterator](): Iterator<T>;
24
- }
25
- /** A mutable [[ReadonlyOrderedSet]].
26
- * @public
27
- */
28
- export declare class OrderedSet<T> extends ReadonlyOrderedSet<T> {
29
- /** Construct a new OrderedSet<T>.
30
- * @param compare The function used to compare elements within the set, determining their ordering.
31
- * @param clone The function invoked to clone a new element for insertion into the set. The default implementation simply returns its input.
32
- */
33
- constructor(compare: OrderedComparator<T>, clone?: CloneFunction<T>);
34
- /** Remove all elements from the set. */
35
- clear(): void;
36
- /** Add the specified element to the set. Returns this set. */
37
- add(value: T): this;
38
- /** Removes the specified element from the set. Returns `true` if the element was present. */
39
- delete(value: T): boolean;
40
- }
1
+ /** @packageDocumentation
2
+ * @module Collections
3
+ */
4
+ import { OrderedComparator } from "./Compare";
5
+ import { CloneFunction, SortedArray } from "./SortedArray";
6
+ /** A read-only equivalent of `Set<T>` that maintains its elements in sorted order as specified by a comparison function.
7
+ * Iteration returns elements in the order specified by the comparison function, as opposed to `Set` which returns elements in insertion order.
8
+ * Implemented in terms of [[SortedArray]].
9
+ * @public
10
+ */
11
+ export declare class ReadonlyOrderedSet<T> implements Iterable<T> {
12
+ protected readonly _array: SortedArray<T>;
13
+ /** Construct a new ReadonlyOrderedSet<T>.
14
+ * @param compare The function used to compare elements within the set, determining their ordering.
15
+ * @param clone The function invoked to clone a new element for insertion into the set. The default implementation simply returns its input.
16
+ */
17
+ constructor(compare: OrderedComparator<T>, clone?: CloneFunction<T>);
18
+ /** The number of elements in the set. */
19
+ get size(): number;
20
+ /** Returns true if `value` is present in the set. */
21
+ has(value: T): boolean;
22
+ /** Iterate over the elements in sorted order (as opposed to `Set`'s iterator, which returns elements in insertion order). */
23
+ [Symbol.iterator](): Iterator<T>;
24
+ }
25
+ /** A mutable [[ReadonlyOrderedSet]].
26
+ * @public
27
+ */
28
+ export declare class OrderedSet<T> extends ReadonlyOrderedSet<T> {
29
+ /** Construct a new OrderedSet<T>.
30
+ * @param compare The function used to compare elements within the set, determining their ordering.
31
+ * @param clone The function invoked to clone a new element for insertion into the set. The default implementation simply returns its input.
32
+ */
33
+ constructor(compare: OrderedComparator<T>, clone?: CloneFunction<T>);
34
+ /** Remove all elements from the set. */
35
+ clear(): void;
36
+ /** Add the specified element to the set. Returns this set. */
37
+ add(value: T): this;
38
+ /** Removes the specified element from the set. Returns `true` if the element was present. */
39
+ delete(value: T): boolean;
40
+ }
41
41
  //# sourceMappingURL=OrderedSet.d.ts.map