@itwin/core-bentley 3.5.0-dev.8 → 3.5.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.
Files changed (238) hide show
  1. package/CHANGELOG.md +80 -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 -376
  18. package/lib/cjs/BentleyError.d.ts.map +1 -1
  19. package/lib/cjs/BentleyError.js +702 -699
  20. package/lib/cjs/BentleyError.js.map +1 -1
  21. package/lib/cjs/BentleyLoggerCategory.d.ts +11 -11
  22. package/lib/cjs/BentleyLoggerCategory.js +19 -19
  23. package/lib/cjs/BentleyLoggerCategory.js.map +1 -1
  24. package/lib/cjs/ByteStream.d.ts +110 -92
  25. package/lib/cjs/ByteStream.d.ts.map +1 -1
  26. package/lib/cjs/ByteStream.js +159 -133
  27. package/lib/cjs/ByteStream.js.map +1 -1
  28. package/lib/cjs/ClassUtils.d.ts +14 -14
  29. package/lib/cjs/ClassUtils.js +27 -27
  30. package/lib/cjs/ClassUtils.js.map +1 -1
  31. package/lib/cjs/Compare.d.ts +47 -47
  32. package/lib/cjs/Compare.js +75 -75
  33. package/lib/cjs/Compare.js.map +1 -1
  34. package/lib/cjs/CompressedId64Set.d.ts +134 -134
  35. package/lib/cjs/CompressedId64Set.js +428 -428
  36. package/lib/cjs/CompressedId64Set.js.map +1 -1
  37. package/lib/cjs/Dictionary.d.ts +125 -125
  38. package/lib/cjs/Dictionary.js +203 -203
  39. package/lib/cjs/Dictionary.js.map +1 -1
  40. package/lib/cjs/Disposable.d.ts +80 -80
  41. package/lib/cjs/Disposable.js +120 -120
  42. package/lib/cjs/Disposable.js.map +1 -1
  43. package/lib/cjs/Id.d.ts +277 -277
  44. package/lib/cjs/Id.js +629 -629
  45. package/lib/cjs/Id.js.map +1 -1
  46. package/lib/cjs/IndexMap.d.ts +65 -65
  47. package/lib/cjs/IndexMap.js +91 -91
  48. package/lib/cjs/IndexMap.js.map +1 -1
  49. package/lib/cjs/JsonSchema.d.ts +77 -77
  50. package/lib/cjs/JsonSchema.js +9 -9
  51. package/lib/cjs/JsonSchema.js.map +1 -1
  52. package/lib/cjs/JsonUtils.d.ts +78 -78
  53. package/lib/cjs/JsonUtils.js +151 -151
  54. package/lib/cjs/JsonUtils.js.map +1 -1
  55. package/lib/cjs/LRUMap.d.ts +129 -129
  56. package/lib/cjs/LRUMap.js +333 -333
  57. package/lib/cjs/LRUMap.js.map +1 -1
  58. package/lib/cjs/Logger.d.ts +143 -141
  59. package/lib/cjs/Logger.d.ts.map +1 -1
  60. package/lib/cjs/Logger.js +258 -254
  61. package/lib/cjs/Logger.js.map +1 -1
  62. package/lib/cjs/ObservableSet.d.ts +23 -23
  63. package/lib/cjs/ObservableSet.js +51 -51
  64. package/lib/cjs/ObservableSet.js.map +1 -1
  65. package/lib/cjs/OneAtATimeAction.d.ts +31 -31
  66. package/lib/cjs/OneAtATimeAction.js +94 -94
  67. package/lib/cjs/OneAtATimeAction.js.map +1 -1
  68. package/lib/cjs/OrderedId64Iterable.d.ts +74 -74
  69. package/lib/cjs/OrderedId64Iterable.js +235 -235
  70. package/lib/cjs/OrderedId64Iterable.js.map +1 -1
  71. package/lib/cjs/OrderedSet.d.ts +40 -40
  72. package/lib/cjs/OrderedSet.js +64 -64
  73. package/lib/cjs/OrderedSet.js.map +1 -1
  74. package/lib/cjs/PriorityQueue.d.ts +70 -70
  75. package/lib/cjs/PriorityQueue.js +140 -140
  76. package/lib/cjs/PriorityQueue.js.map +1 -1
  77. package/lib/cjs/ProcessDetector.d.ts +59 -59
  78. package/lib/cjs/ProcessDetector.js +71 -71
  79. package/lib/cjs/ProcessDetector.js.map +1 -1
  80. package/lib/cjs/SortedArray.d.ts +232 -232
  81. package/lib/cjs/SortedArray.js +303 -303
  82. package/lib/cjs/SortedArray.js.map +1 -1
  83. package/lib/cjs/StatusCategory.d.ts +30 -30
  84. package/lib/cjs/StatusCategory.js +460 -460
  85. package/lib/cjs/StatusCategory.js.map +1 -1
  86. package/lib/cjs/StringUtils.d.ts +22 -22
  87. package/lib/cjs/StringUtils.js +148 -148
  88. package/lib/cjs/StringUtils.js.map +1 -1
  89. package/lib/cjs/Time.d.ts +122 -122
  90. package/lib/cjs/Time.js +152 -152
  91. package/lib/cjs/Time.js.map +1 -1
  92. package/lib/cjs/Tracing.d.ts +40 -40
  93. package/lib/cjs/Tracing.js +130 -130
  94. package/lib/cjs/Tracing.js.map +1 -1
  95. package/lib/cjs/TupleKeyedMap.d.ts +37 -0
  96. package/lib/cjs/TupleKeyedMap.d.ts.map +1 -0
  97. package/lib/cjs/TupleKeyedMap.js +103 -0
  98. package/lib/cjs/TupleKeyedMap.js.map +1 -0
  99. package/lib/cjs/TypedArrayBuilder.d.ts +155 -97
  100. package/lib/cjs/TypedArrayBuilder.d.ts.map +1 -1
  101. package/lib/cjs/TypedArrayBuilder.js +208 -134
  102. package/lib/cjs/TypedArrayBuilder.js.map +1 -1
  103. package/lib/cjs/UnexpectedErrors.d.ts +43 -43
  104. package/lib/cjs/UnexpectedErrors.js +68 -68
  105. package/lib/cjs/UnexpectedErrors.js.map +1 -1
  106. package/lib/cjs/UtilityTypes.d.ts +100 -86
  107. package/lib/cjs/UtilityTypes.d.ts.map +1 -1
  108. package/lib/cjs/UtilityTypes.js +40 -26
  109. package/lib/cjs/UtilityTypes.js.map +1 -1
  110. package/lib/cjs/YieldManager.d.ts +18 -18
  111. package/lib/cjs/YieldManager.js +34 -34
  112. package/lib/cjs/YieldManager.js.map +1 -1
  113. package/lib/cjs/core-bentley.d.ts +75 -74
  114. package/lib/cjs/core-bentley.d.ts.map +1 -1
  115. package/lib/cjs/core-bentley.js +91 -90
  116. package/lib/cjs/core-bentley.js.map +1 -1
  117. package/lib/cjs/partitionArray.d.ts +21 -21
  118. package/lib/cjs/partitionArray.js +43 -43
  119. package/lib/cjs/partitionArray.js.map +1 -1
  120. package/lib/esm/AccessToken.d.ts +8 -8
  121. package/lib/esm/AccessToken.js +8 -8
  122. package/lib/esm/AccessToken.js.map +1 -1
  123. package/lib/esm/Assert.d.ts +25 -25
  124. package/lib/esm/Assert.js +41 -41
  125. package/lib/esm/Assert.js.map +1 -1
  126. package/lib/esm/AsyncMutex.d.ts +26 -26
  127. package/lib/esm/AsyncMutex.js +39 -39
  128. package/lib/esm/AsyncMutex.js.map +1 -1
  129. package/lib/esm/BeEvent.d.ts +81 -81
  130. package/lib/esm/BeEvent.js +150 -150
  131. package/lib/esm/BeEvent.js.map +1 -1
  132. package/lib/esm/BeSQLite.d.ts +170 -170
  133. package/lib/esm/BeSQLite.js +180 -180
  134. package/lib/esm/BeSQLite.js.map +1 -1
  135. package/lib/esm/BentleyError.d.ts +378 -376
  136. package/lib/esm/BentleyError.d.ts.map +1 -1
  137. package/lib/esm/BentleyError.js +698 -695
  138. package/lib/esm/BentleyError.js.map +1 -1
  139. package/lib/esm/BentleyLoggerCategory.d.ts +11 -11
  140. package/lib/esm/BentleyLoggerCategory.js +16 -16
  141. package/lib/esm/BentleyLoggerCategory.js.map +1 -1
  142. package/lib/esm/ByteStream.d.ts +110 -92
  143. package/lib/esm/ByteStream.d.ts.map +1 -1
  144. package/lib/esm/ByteStream.js +155 -129
  145. package/lib/esm/ByteStream.js.map +1 -1
  146. package/lib/esm/ClassUtils.d.ts +14 -14
  147. package/lib/esm/ClassUtils.js +22 -22
  148. package/lib/esm/ClassUtils.js.map +1 -1
  149. package/lib/esm/Compare.d.ts +47 -47
  150. package/lib/esm/Compare.js +63 -63
  151. package/lib/esm/Compare.js.map +1 -1
  152. package/lib/esm/CompressedId64Set.d.ts +134 -134
  153. package/lib/esm/CompressedId64Set.js +423 -423
  154. package/lib/esm/CompressedId64Set.js.map +1 -1
  155. package/lib/esm/Dictionary.d.ts +125 -125
  156. package/lib/esm/Dictionary.js +199 -199
  157. package/lib/esm/Dictionary.js.map +1 -1
  158. package/lib/esm/Disposable.d.ts +80 -80
  159. package/lib/esm/Disposable.js +112 -112
  160. package/lib/esm/Disposable.js.map +1 -1
  161. package/lib/esm/Id.d.ts +277 -277
  162. package/lib/esm/Id.js +625 -625
  163. package/lib/esm/Id.js.map +1 -1
  164. package/lib/esm/IndexMap.d.ts +65 -65
  165. package/lib/esm/IndexMap.js +86 -86
  166. package/lib/esm/IndexMap.js.map +1 -1
  167. package/lib/esm/JsonSchema.d.ts +77 -77
  168. package/lib/esm/JsonSchema.js +8 -8
  169. package/lib/esm/JsonSchema.js.map +1 -1
  170. package/lib/esm/JsonUtils.d.ts +78 -78
  171. package/lib/esm/JsonUtils.js +148 -148
  172. package/lib/esm/JsonUtils.js.map +1 -1
  173. package/lib/esm/LRUMap.d.ts +129 -129
  174. package/lib/esm/LRUMap.js +326 -326
  175. package/lib/esm/LRUMap.js.map +1 -1
  176. package/lib/esm/Logger.d.ts +143 -141
  177. package/lib/esm/Logger.d.ts.map +1 -1
  178. package/lib/esm/Logger.js +253 -249
  179. package/lib/esm/Logger.js.map +1 -1
  180. package/lib/esm/ObservableSet.d.ts +23 -23
  181. package/lib/esm/ObservableSet.js +47 -47
  182. package/lib/esm/ObservableSet.js.map +1 -1
  183. package/lib/esm/OneAtATimeAction.d.ts +31 -31
  184. package/lib/esm/OneAtATimeAction.js +89 -89
  185. package/lib/esm/OneAtATimeAction.js.map +1 -1
  186. package/lib/esm/OrderedId64Iterable.d.ts +74 -74
  187. package/lib/esm/OrderedId64Iterable.js +232 -232
  188. package/lib/esm/OrderedId64Iterable.js.map +1 -1
  189. package/lib/esm/OrderedSet.d.ts +40 -40
  190. package/lib/esm/OrderedSet.js +59 -59
  191. package/lib/esm/OrderedSet.js.map +1 -1
  192. package/lib/esm/PriorityQueue.d.ts +70 -70
  193. package/lib/esm/PriorityQueue.js +136 -136
  194. package/lib/esm/PriorityQueue.js.map +1 -1
  195. package/lib/esm/ProcessDetector.d.ts +59 -59
  196. package/lib/esm/ProcessDetector.js +67 -67
  197. package/lib/esm/ProcessDetector.js.map +1 -1
  198. package/lib/esm/SortedArray.d.ts +232 -232
  199. package/lib/esm/SortedArray.js +296 -296
  200. package/lib/esm/SortedArray.js.map +1 -1
  201. package/lib/esm/StatusCategory.d.ts +30 -30
  202. package/lib/esm/StatusCategory.js +454 -454
  203. package/lib/esm/StatusCategory.js.map +1 -1
  204. package/lib/esm/StringUtils.d.ts +22 -22
  205. package/lib/esm/StringUtils.js +142 -142
  206. package/lib/esm/StringUtils.js.map +1 -1
  207. package/lib/esm/Time.d.ts +122 -122
  208. package/lib/esm/Time.js +146 -146
  209. package/lib/esm/Time.js.map +1 -1
  210. package/lib/esm/Tracing.d.ts +40 -40
  211. package/lib/esm/Tracing.js +126 -126
  212. package/lib/esm/Tracing.js.map +1 -1
  213. package/lib/esm/TupleKeyedMap.d.ts +37 -0
  214. package/lib/esm/TupleKeyedMap.d.ts.map +1 -0
  215. package/lib/esm/TupleKeyedMap.js +99 -0
  216. package/lib/esm/TupleKeyedMap.js.map +1 -0
  217. package/lib/esm/TypedArrayBuilder.d.ts +155 -97
  218. package/lib/esm/TypedArrayBuilder.d.ts.map +1 -1
  219. package/lib/esm/TypedArrayBuilder.js +200 -127
  220. package/lib/esm/TypedArrayBuilder.js.map +1 -1
  221. package/lib/esm/UnexpectedErrors.d.ts +43 -43
  222. package/lib/esm/UnexpectedErrors.js +64 -64
  223. package/lib/esm/UnexpectedErrors.js.map +1 -1
  224. package/lib/esm/UtilityTypes.d.ts +100 -86
  225. package/lib/esm/UtilityTypes.d.ts.map +1 -1
  226. package/lib/esm/UtilityTypes.js +34 -21
  227. package/lib/esm/UtilityTypes.js.map +1 -1
  228. package/lib/esm/YieldManager.d.ts +18 -18
  229. package/lib/esm/YieldManager.js +30 -30
  230. package/lib/esm/YieldManager.js.map +1 -1
  231. package/lib/esm/core-bentley.d.ts +75 -74
  232. package/lib/esm/core-bentley.d.ts.map +1 -1
  233. package/lib/esm/core-bentley.js +79 -78
  234. package/lib/esm/core-bentley.js.map +1 -1
  235. package/lib/esm/partitionArray.d.ts +21 -21
  236. package/lib/esm/partitionArray.js +39 -39
  237. package/lib/esm/partitionArray.js.map +1 -1
  238. package/package.json +4 -4
package/lib/cjs/LRUMap.js CHANGED
@@ -1,334 +1,334 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- /** @packageDocumentation
7
- * @module Collections
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.LRUDictionary = exports.LRUMap = exports.LRUCache = exports.Entry = void 0;
11
- const Dictionary_1 = require("./Dictionary");
12
- /**
13
- * Derived from:
14
- * Licensed under MIT. Copyright (c) 2010 Rasmus Andersson <http://hunch.se/>
15
- * See README.md at https://github.com/rsms/js-lru for details.
16
- */
17
- /** An entry holds the key and value, and pointers to any older and newer entries.
18
- * @public
19
- */
20
- class Entry {
21
- constructor(key, value) {
22
- this.key = key;
23
- this.value = value;
24
- }
25
- }
26
- exports.Entry = Entry;
27
- class EntryIterator {
28
- constructor(oldestEntry) {
29
- this._entry = oldestEntry;
30
- }
31
- next() {
32
- const ent = this._entry;
33
- if (!ent)
34
- return { done: true, value: undefined };
35
- this._entry = ent.newer;
36
- const val = [ent.key, ent.value];
37
- return { done: false, value: val };
38
- }
39
- }
40
- class KeyIterator {
41
- constructor(oldestEntry) {
42
- this._entry = oldestEntry;
43
- }
44
- next() {
45
- const ent = this._entry;
46
- if (!ent)
47
- return { done: true, value: undefined };
48
- this._entry = ent.newer;
49
- return { done: false, value: ent.key };
50
- }
51
- }
52
- class ValueIterator {
53
- constructor(oldestEntry) {
54
- this._entry = oldestEntry;
55
- }
56
- next() {
57
- const ent = this._entry;
58
- if (!ent)
59
- return { done: true, value: undefined };
60
- this._entry = ent.newer;
61
- return { done: false, value: ent.value };
62
- }
63
- }
64
- /**
65
- * A mapping of a key/value pairs, where the size of the cache can be limited.
66
- *
67
- * When entries are inserted, if the cache is "full", the
68
- * least-recently-used (LRU) value is dropped. When entries are retrieved, they are moved to the front of the LRU list.
69
- *
70
- * Illustration of the design:
71
- *
72
- * ```
73
- *
74
- * entry entry entry entry
75
- * ______ ______ ______ ______
76
- * | head |.newer => | |.newer => | |.newer => | tail |
77
- * | A | | B | | C | | D |
78
- * |______| <= older.|______| <= older.|______| <= older.|______|
79
- *
80
- * removed <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- added
81
- * ```
82
- * @public
83
- */
84
- class LRUCache {
85
- /**
86
- * Construct a new LRUCache to hold up to `limit` entries.
87
- */
88
- constructor(limit, container) {
89
- this.size = 0;
90
- this.limit = limit;
91
- this.oldest = this.newest = undefined;
92
- this._container = container;
93
- }
94
- markEntryAsUsed(entry) {
95
- if (entry === this.newest)
96
- return; // Already the most recently used entry, so no need to update the list
97
- // HEAD--------------TAIL
98
- // <.older .newer>
99
- // <--- add direction --
100
- // A B C <D> E
101
- if (entry.newer) {
102
- if (entry === this.oldest) {
103
- this.oldest = entry.newer;
104
- }
105
- entry.newer.older = entry.older; // C <-- E.
106
- }
107
- if (entry.older) {
108
- entry.older.newer = entry.newer; // C. --> E
109
- }
110
- entry.newer = undefined; // D --x
111
- entry.older = this.newest; // D. --> E
112
- if (this.newest) {
113
- this.newest.newer = entry; // E. <-- D
114
- }
115
- this.newest = entry;
116
- }
117
- /** Replace all values in this cache with key-value pairs (2-element Arrays) from provided iterable. */
118
- assign(entries) {
119
- let entry;
120
- let limit = this.limit || Number.MAX_VALUE;
121
- this._container.clear();
122
- const it = entries[Symbol.iterator]();
123
- for (let itv = it.next(); !itv.done; itv = it.next()) {
124
- const e = new Entry(itv.value[0], itv.value[1]);
125
- this._container.set(e.key, e);
126
- if (!entry) {
127
- this.oldest = e;
128
- }
129
- else {
130
- entry.newer = e;
131
- e.older = entry;
132
- }
133
- entry = e;
134
- if (limit-- === 0) {
135
- throw new Error("overflow");
136
- }
137
- }
138
- this.newest = entry;
139
- this.size = this._container.size;
140
- }
141
- /** Get and register recent use of <key>.
142
- * Returns the value associated with <key> or undefined if not in cache.
143
- */
144
- get(key) {
145
- // First, find our cache entry
146
- const entry = this._container.get(key);
147
- if (!entry)
148
- return; // Not cached. Sorry.
149
- // As <key> was found in the cache, register it as being requested recently
150
- this.markEntryAsUsed(entry);
151
- return entry.value;
152
- }
153
- /** Put <value> into the cache associated with <key>. Replaces any existing entry with the same key.
154
- * @returns `this`.
155
- */
156
- set(key, value) {
157
- let entry = this._container.get(key);
158
- if (entry) {
159
- // update existing
160
- entry.value = value;
161
- this.markEntryAsUsed(entry);
162
- return this;
163
- }
164
- // new entry
165
- this._container.set(key, (entry = new Entry(key, value)));
166
- if (this.newest) {
167
- // link previous tail to the new tail (entry)
168
- this.newest.newer = entry;
169
- entry.older = this.newest;
170
- }
171
- else {
172
- // we're first in
173
- this.oldest = entry;
174
- }
175
- // add new entry to the end of the linked list -- it is now the freshest entry.
176
- this.newest = entry;
177
- ++this.size;
178
- if (this.size > this.limit) {
179
- // we hit the limit -- remove the head
180
- this.shift();
181
- }
182
- return this;
183
- }
184
- /** Purge the least recently used (oldest) entry from the cache.
185
- * @returns The removed entry or undefined if the cache was empty.
186
- */
187
- shift() {
188
- const entry = this.oldest;
189
- if (entry) {
190
- if (entry.newer) {
191
- // advance the list
192
- this.oldest = entry.newer;
193
- this.oldest.older = undefined;
194
- }
195
- else {
196
- // the cache is exhausted
197
- this.oldest = undefined;
198
- this.newest = undefined;
199
- }
200
- // Remove last strong reference to <entry> and remove links from the purged
201
- // entry being returned:
202
- entry.newer = entry.older = undefined;
203
- this._container.delete(entry.key);
204
- --this.size;
205
- return [entry.key, entry.value];
206
- }
207
- return undefined;
208
- }
209
- /** Access value for `key` without registering recent use. Useful if you do not
210
- * want to change the state of the cache, but only "peek" at it.
211
- * @returns The value associated with `key` if found, or undefined if not found.
212
- */
213
- find(key) {
214
- const e = this._container.get(key);
215
- return e ? e.value : undefined;
216
- }
217
- /** Check if there's a value for key in the cache without registering recent use. */
218
- has(key) {
219
- return this._container.has(key);
220
- }
221
- /** Remove entry `key` from cache and return its value.
222
- * @returns The removed value, or undefined if not found.
223
- */
224
- delete(key) {
225
- const entry = this._container.get(key);
226
- if (!entry)
227
- return;
228
- this._container.delete(entry.key);
229
- if (entry.newer && entry.older) {
230
- // re-link the older entry with the newer entry
231
- entry.older.newer = entry.newer;
232
- entry.newer.older = entry.older;
233
- }
234
- else if (entry.newer) {
235
- // remove the link to us
236
- entry.newer.older = undefined;
237
- // link the newer entry to head
238
- this.oldest = entry.newer;
239
- }
240
- else if (entry.older) {
241
- // remove the link to us
242
- entry.older.newer = undefined;
243
- // link the newer entry to head
244
- this.newest = entry.older;
245
- }
246
- else { // if(entry.older === undefined && entry.newer === undefined) {
247
- this.oldest = this.newest = undefined;
248
- }
249
- this.size--;
250
- return entry.value;
251
- }
252
- /** Removes all entries */
253
- clear() {
254
- // Note: clearing links should be safe, as we don't expose live links to user
255
- this.oldest = this.newest = undefined;
256
- this.size = 0;
257
- this._container.clear();
258
- }
259
- /** Returns an iterator over all keys, starting with the oldest. */
260
- keys() {
261
- return this.oldest ? new KeyIterator(this.oldest) : undefined;
262
- }
263
- /** Returns an iterator over all values, starting with the oldest. */
264
- values() {
265
- return this.oldest ? new ValueIterator(this.oldest) : undefined;
266
- }
267
- /** Returns an iterator over all entries, starting with the oldest. */
268
- entries() {
269
- return this.oldest ? new EntryIterator(this.oldest) : undefined;
270
- }
271
- /** Call `fun` for each entry, starting with the oldest entry. */
272
- forEach(fun, thisObj) {
273
- if (typeof thisObj !== "object") {
274
- thisObj = this;
275
- }
276
- let entry = this.oldest;
277
- while (entry) {
278
- fun.call(thisObj, entry.value, entry.key, this);
279
- entry = entry.newer;
280
- }
281
- }
282
- /** Returns a JSON (array) representation */
283
- toJSON() {
284
- const s = new Array(this.size);
285
- let i = 0;
286
- let entry = this.oldest;
287
- while (entry) {
288
- s[i++] = { key: entry.key, value: entry.value };
289
- entry = entry.newer;
290
- }
291
- return s;
292
- }
293
- /** Returns a String representation */
294
- toString() {
295
- let s = "";
296
- let entry = this.oldest;
297
- while (entry) {
298
- s += `${String(entry.key)}:${entry.value}`;
299
- entry = entry.newer;
300
- if (entry) {
301
- s += " < ";
302
- }
303
- }
304
- return s;
305
- }
306
- }
307
- exports.LRUCache = LRUCache;
308
- /** A [[LRUCache]] using a standard Map as its internal storage.
309
- * @public
310
- */
311
- class LRUMap extends LRUCache {
312
- /**
313
- * Construct a new LRUMap to hold up to `limit` entries.
314
- */
315
- constructor(limit) {
316
- super(limit, new Map());
317
- }
318
- }
319
- exports.LRUMap = LRUMap;
320
- /** A [[LRUCache]] using a [[Dictionary]] as its internal storage, permitting custom key comparison logic.
321
- * @public
322
- */
323
- class LRUDictionary extends LRUCache {
324
- /**
325
- * Construct a new LRUDictionary to hold up to `limit` entries.
326
- * @param limit The maximum number of entries permitted in the dictionary.
327
- * @param compareKeys The function used to compare keys within the dictionary.
328
- */
329
- constructor(limit, compareKeys) {
330
- super(limit, new Dictionary_1.Dictionary(compareKeys));
331
- }
332
- }
333
- exports.LRUDictionary = LRUDictionary;
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Collections
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.LRUDictionary = exports.LRUMap = exports.LRUCache = exports.Entry = void 0;
11
+ const Dictionary_1 = require("./Dictionary");
12
+ /**
13
+ * Derived from:
14
+ * Licensed under MIT. Copyright (c) 2010 Rasmus Andersson <http://hunch.se/>
15
+ * See README.md at https://github.com/rsms/js-lru for details.
16
+ */
17
+ /** An entry holds the key and value, and pointers to any older and newer entries.
18
+ * @public
19
+ */
20
+ class Entry {
21
+ constructor(key, value) {
22
+ this.key = key;
23
+ this.value = value;
24
+ }
25
+ }
26
+ exports.Entry = Entry;
27
+ class EntryIterator {
28
+ constructor(oldestEntry) {
29
+ this._entry = oldestEntry;
30
+ }
31
+ next() {
32
+ const ent = this._entry;
33
+ if (!ent)
34
+ return { done: true, value: undefined };
35
+ this._entry = ent.newer;
36
+ const val = [ent.key, ent.value];
37
+ return { done: false, value: val };
38
+ }
39
+ }
40
+ class KeyIterator {
41
+ constructor(oldestEntry) {
42
+ this._entry = oldestEntry;
43
+ }
44
+ next() {
45
+ const ent = this._entry;
46
+ if (!ent)
47
+ return { done: true, value: undefined };
48
+ this._entry = ent.newer;
49
+ return { done: false, value: ent.key };
50
+ }
51
+ }
52
+ class ValueIterator {
53
+ constructor(oldestEntry) {
54
+ this._entry = oldestEntry;
55
+ }
56
+ next() {
57
+ const ent = this._entry;
58
+ if (!ent)
59
+ return { done: true, value: undefined };
60
+ this._entry = ent.newer;
61
+ return { done: false, value: ent.value };
62
+ }
63
+ }
64
+ /**
65
+ * A mapping of a key/value pairs, where the size of the cache can be limited.
66
+ *
67
+ * When entries are inserted, if the cache is "full", the
68
+ * least-recently-used (LRU) value is dropped. When entries are retrieved, they are moved to the front of the LRU list.
69
+ *
70
+ * Illustration of the design:
71
+ *
72
+ * ```
73
+ *
74
+ * entry entry entry entry
75
+ * ______ ______ ______ ______
76
+ * | head |.newer => | |.newer => | |.newer => | tail |
77
+ * | A | | B | | C | | D |
78
+ * |______| <= older.|______| <= older.|______| <= older.|______|
79
+ *
80
+ * removed <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- added
81
+ * ```
82
+ * @public
83
+ */
84
+ class LRUCache {
85
+ /**
86
+ * Construct a new LRUCache to hold up to `limit` entries.
87
+ */
88
+ constructor(limit, container) {
89
+ this.size = 0;
90
+ this.limit = limit;
91
+ this.oldest = this.newest = undefined;
92
+ this._container = container;
93
+ }
94
+ markEntryAsUsed(entry) {
95
+ if (entry === this.newest)
96
+ return; // Already the most recently used entry, so no need to update the list
97
+ // HEAD--------------TAIL
98
+ // <.older .newer>
99
+ // <--- add direction --
100
+ // A B C <D> E
101
+ if (entry.newer) {
102
+ if (entry === this.oldest) {
103
+ this.oldest = entry.newer;
104
+ }
105
+ entry.newer.older = entry.older; // C <-- E.
106
+ }
107
+ if (entry.older) {
108
+ entry.older.newer = entry.newer; // C. --> E
109
+ }
110
+ entry.newer = undefined; // D --x
111
+ entry.older = this.newest; // D. --> E
112
+ if (this.newest) {
113
+ this.newest.newer = entry; // E. <-- D
114
+ }
115
+ this.newest = entry;
116
+ }
117
+ /** Replace all values in this cache with key-value pairs (2-element Arrays) from provided iterable. */
118
+ assign(entries) {
119
+ let entry;
120
+ let limit = this.limit || Number.MAX_VALUE;
121
+ this._container.clear();
122
+ const it = entries[Symbol.iterator]();
123
+ for (let itv = it.next(); !itv.done; itv = it.next()) {
124
+ const e = new Entry(itv.value[0], itv.value[1]);
125
+ this._container.set(e.key, e);
126
+ if (!entry) {
127
+ this.oldest = e;
128
+ }
129
+ else {
130
+ entry.newer = e;
131
+ e.older = entry;
132
+ }
133
+ entry = e;
134
+ if (limit-- === 0) {
135
+ throw new Error("overflow");
136
+ }
137
+ }
138
+ this.newest = entry;
139
+ this.size = this._container.size;
140
+ }
141
+ /** Get and register recent use of <key>.
142
+ * Returns the value associated with <key> or undefined if not in cache.
143
+ */
144
+ get(key) {
145
+ // First, find our cache entry
146
+ const entry = this._container.get(key);
147
+ if (!entry)
148
+ return; // Not cached. Sorry.
149
+ // As <key> was found in the cache, register it as being requested recently
150
+ this.markEntryAsUsed(entry);
151
+ return entry.value;
152
+ }
153
+ /** Put <value> into the cache associated with <key>. Replaces any existing entry with the same key.
154
+ * @returns `this`.
155
+ */
156
+ set(key, value) {
157
+ let entry = this._container.get(key);
158
+ if (entry) {
159
+ // update existing
160
+ entry.value = value;
161
+ this.markEntryAsUsed(entry);
162
+ return this;
163
+ }
164
+ // new entry
165
+ this._container.set(key, (entry = new Entry(key, value)));
166
+ if (this.newest) {
167
+ // link previous tail to the new tail (entry)
168
+ this.newest.newer = entry;
169
+ entry.older = this.newest;
170
+ }
171
+ else {
172
+ // we're first in
173
+ this.oldest = entry;
174
+ }
175
+ // add new entry to the end of the linked list -- it is now the freshest entry.
176
+ this.newest = entry;
177
+ ++this.size;
178
+ if (this.size > this.limit) {
179
+ // we hit the limit -- remove the head
180
+ this.shift();
181
+ }
182
+ return this;
183
+ }
184
+ /** Purge the least recently used (oldest) entry from the cache.
185
+ * @returns The removed entry or undefined if the cache was empty.
186
+ */
187
+ shift() {
188
+ const entry = this.oldest;
189
+ if (entry) {
190
+ if (entry.newer) {
191
+ // advance the list
192
+ this.oldest = entry.newer;
193
+ this.oldest.older = undefined;
194
+ }
195
+ else {
196
+ // the cache is exhausted
197
+ this.oldest = undefined;
198
+ this.newest = undefined;
199
+ }
200
+ // Remove last strong reference to <entry> and remove links from the purged
201
+ // entry being returned:
202
+ entry.newer = entry.older = undefined;
203
+ this._container.delete(entry.key);
204
+ --this.size;
205
+ return [entry.key, entry.value];
206
+ }
207
+ return undefined;
208
+ }
209
+ /** Access value for `key` without registering recent use. Useful if you do not
210
+ * want to change the state of the cache, but only "peek" at it.
211
+ * @returns The value associated with `key` if found, or undefined if not found.
212
+ */
213
+ find(key) {
214
+ const e = this._container.get(key);
215
+ return e ? e.value : undefined;
216
+ }
217
+ /** Check if there's a value for key in the cache without registering recent use. */
218
+ has(key) {
219
+ return this._container.has(key);
220
+ }
221
+ /** Remove entry `key` from cache and return its value.
222
+ * @returns The removed value, or undefined if not found.
223
+ */
224
+ delete(key) {
225
+ const entry = this._container.get(key);
226
+ if (!entry)
227
+ return;
228
+ this._container.delete(entry.key);
229
+ if (entry.newer && entry.older) {
230
+ // re-link the older entry with the newer entry
231
+ entry.older.newer = entry.newer;
232
+ entry.newer.older = entry.older;
233
+ }
234
+ else if (entry.newer) {
235
+ // remove the link to us
236
+ entry.newer.older = undefined;
237
+ // link the newer entry to head
238
+ this.oldest = entry.newer;
239
+ }
240
+ else if (entry.older) {
241
+ // remove the link to us
242
+ entry.older.newer = undefined;
243
+ // link the newer entry to head
244
+ this.newest = entry.older;
245
+ }
246
+ else { // if(entry.older === undefined && entry.newer === undefined) {
247
+ this.oldest = this.newest = undefined;
248
+ }
249
+ this.size--;
250
+ return entry.value;
251
+ }
252
+ /** Removes all entries */
253
+ clear() {
254
+ // Note: clearing links should be safe, as we don't expose live links to user
255
+ this.oldest = this.newest = undefined;
256
+ this.size = 0;
257
+ this._container.clear();
258
+ }
259
+ /** Returns an iterator over all keys, starting with the oldest. */
260
+ keys() {
261
+ return this.oldest ? new KeyIterator(this.oldest) : undefined;
262
+ }
263
+ /** Returns an iterator over all values, starting with the oldest. */
264
+ values() {
265
+ return this.oldest ? new ValueIterator(this.oldest) : undefined;
266
+ }
267
+ /** Returns an iterator over all entries, starting with the oldest. */
268
+ entries() {
269
+ return this.oldest ? new EntryIterator(this.oldest) : undefined;
270
+ }
271
+ /** Call `fun` for each entry, starting with the oldest entry. */
272
+ forEach(fun, thisObj) {
273
+ if (typeof thisObj !== "object") {
274
+ thisObj = this;
275
+ }
276
+ let entry = this.oldest;
277
+ while (entry) {
278
+ fun.call(thisObj, entry.value, entry.key, this);
279
+ entry = entry.newer;
280
+ }
281
+ }
282
+ /** Returns a JSON (array) representation */
283
+ toJSON() {
284
+ const s = new Array(this.size);
285
+ let i = 0;
286
+ let entry = this.oldest;
287
+ while (entry) {
288
+ s[i++] = { key: entry.key, value: entry.value };
289
+ entry = entry.newer;
290
+ }
291
+ return s;
292
+ }
293
+ /** Returns a String representation */
294
+ toString() {
295
+ let s = "";
296
+ let entry = this.oldest;
297
+ while (entry) {
298
+ s += `${String(entry.key)}:${entry.value}`;
299
+ entry = entry.newer;
300
+ if (entry) {
301
+ s += " < ";
302
+ }
303
+ }
304
+ return s;
305
+ }
306
+ }
307
+ exports.LRUCache = LRUCache;
308
+ /** A [[LRUCache]] using a standard Map as its internal storage.
309
+ * @public
310
+ */
311
+ class LRUMap extends LRUCache {
312
+ /**
313
+ * Construct a new LRUMap to hold up to `limit` entries.
314
+ */
315
+ constructor(limit) {
316
+ super(limit, new Map());
317
+ }
318
+ }
319
+ exports.LRUMap = LRUMap;
320
+ /** A [[LRUCache]] using a [[Dictionary]] as its internal storage, permitting custom key comparison logic.
321
+ * @public
322
+ */
323
+ class LRUDictionary extends LRUCache {
324
+ /**
325
+ * Construct a new LRUDictionary to hold up to `limit` entries.
326
+ * @param limit The maximum number of entries permitted in the dictionary.
327
+ * @param compareKeys The function used to compare keys within the dictionary.
328
+ */
329
+ constructor(limit, compareKeys) {
330
+ super(limit, new Dictionary_1.Dictionary(compareKeys));
331
+ }
332
+ }
333
+ exports.LRUDictionary = LRUDictionary;
334
334
  //# sourceMappingURL=LRUMap.js.map