@blackglory/structures 0.14.15 → 0.15.0

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 (205) hide show
  1. package/README.md +661 -92
  2. package/lib/async-generator-emitter.js +2 -5
  3. package/lib/async-generator-emitter.js.map +1 -1
  4. package/lib/big-map.js +1 -3
  5. package/lib/big-map.js.map +1 -1
  6. package/lib/big-set.js +1 -3
  7. package/lib/big-set.js.map +1 -1
  8. package/lib/{bit-set.d.ts → bit-set/bit-set.d.ts} +5 -2
  9. package/lib/{bit-set.js → bit-set/bit-set.js} +43 -34
  10. package/lib/bit-set/bit-set.js.map +1 -0
  11. package/lib/{typed-bit-set.d.ts → bit-set/dynamic-typed-bit-set.d.ts} +6 -4
  12. package/lib/bit-set/dynamic-typed-bit-set.js +95 -0
  13. package/lib/bit-set/dynamic-typed-bit-set.js.map +1 -0
  14. package/lib/bit-set/index.d.ts +4 -0
  15. package/lib/bit-set/index.js +5 -0
  16. package/lib/bit-set/index.js.map +1 -0
  17. package/lib/bit-set/resizable-typed-bit-set.d.ts +22 -0
  18. package/lib/{typed-bit-set.js → bit-set/resizable-typed-bit-set.js} +37 -39
  19. package/lib/bit-set/resizable-typed-bit-set.js.map +1 -0
  20. package/lib/bit-set/typed-bit-set.d.ts +22 -0
  21. package/lib/bit-set/typed-bit-set.js +99 -0
  22. package/lib/bit-set/typed-bit-set.js.map +1 -0
  23. package/lib/box.js +1 -0
  24. package/lib/box.js.map +1 -1
  25. package/lib/disjoint-set.js +2 -4
  26. package/lib/disjoint-set.js.map +1 -1
  27. package/lib/dynamic-typed-array.d.ts +12 -9
  28. package/lib/dynamic-typed-array.js +51 -66
  29. package/lib/dynamic-typed-array.js.map +1 -1
  30. package/lib/emitter.js +3 -7
  31. package/lib/emitter.js.map +1 -1
  32. package/lib/expirable-map.js +9 -15
  33. package/lib/expirable-map.js.map +1 -1
  34. package/lib/generator-emitter.js +2 -5
  35. package/lib/generator-emitter.js.map +1 -1
  36. package/lib/hash-map.js +2 -1
  37. package/lib/hash-map.js.map +1 -1
  38. package/lib/hash-set.js +2 -1
  39. package/lib/hash-set.js.map +1 -1
  40. package/lib/index.d.ts +5 -7
  41. package/lib/index.js +5 -7
  42. package/lib/index.js.map +1 -1
  43. package/lib/lru-map.js +2 -1
  44. package/lib/lru-map.js.map +1 -1
  45. package/lib/queue.js +1 -3
  46. package/lib/queue.js.map +1 -1
  47. package/lib/radix-tree.js +3 -4
  48. package/lib/radix-tree.js.map +1 -1
  49. package/lib/resizable-typed-array.d.ts +32 -0
  50. package/lib/resizable-typed-array.js +127 -0
  51. package/lib/resizable-typed-array.js.map +1 -0
  52. package/lib/sorted-set.js +2 -1
  53. package/lib/sorted-set.js.map +1 -1
  54. package/lib/sparse-map/clean-sparse-map.d.ts +18 -0
  55. package/lib/sparse-map/clean-sparse-map.js +74 -0
  56. package/lib/sparse-map/clean-sparse-map.js.map +1 -0
  57. package/lib/sparse-map/dynamic-typed-clean-sparse-map-lite.d.ts +21 -0
  58. package/lib/sparse-map/dynamic-typed-clean-sparse-map-lite.js +87 -0
  59. package/lib/sparse-map/dynamic-typed-clean-sparse-map-lite.js.map +1 -0
  60. package/lib/sparse-map/dynamic-typed-sparse-map-lite.d.ts +21 -0
  61. package/lib/sparse-map/dynamic-typed-sparse-map-lite.js +94 -0
  62. package/lib/sparse-map/dynamic-typed-sparse-map-lite.js.map +1 -0
  63. package/lib/sparse-map/index.d.ts +10 -0
  64. package/lib/sparse-map/index.js +11 -0
  65. package/lib/sparse-map/index.js.map +1 -0
  66. package/lib/sparse-map/resizable-typed-clean-sparse-map-lite.d.ts +21 -0
  67. package/lib/sparse-map/resizable-typed-clean-sparse-map-lite.js +85 -0
  68. package/lib/sparse-map/resizable-typed-clean-sparse-map-lite.js.map +1 -0
  69. package/lib/sparse-map/resizable-typed-sparse-map-lite.d.ts +21 -0
  70. package/lib/sparse-map/resizable-typed-sparse-map-lite.js +92 -0
  71. package/lib/sparse-map/resizable-typed-sparse-map-lite.js.map +1 -0
  72. package/lib/{sparse-map.d.ts → sparse-map/sparse-map.d.ts} +6 -5
  73. package/lib/sparse-map/sparse-map.js +86 -0
  74. package/lib/sparse-map/sparse-map.js.map +1 -0
  75. package/lib/sparse-map/typed-clean-sparse-map-lite.d.ts +21 -0
  76. package/lib/sparse-map/typed-clean-sparse-map-lite.js +92 -0
  77. package/lib/sparse-map/typed-clean-sparse-map-lite.js.map +1 -0
  78. package/lib/sparse-map/typed-clean-sparse-map.d.ts +22 -0
  79. package/lib/sparse-map/typed-clean-sparse-map.js +117 -0
  80. package/lib/sparse-map/typed-clean-sparse-map.js.map +1 -0
  81. package/lib/sparse-map/typed-sparse-map-lite.d.ts +21 -0
  82. package/lib/sparse-map/typed-sparse-map-lite.js +109 -0
  83. package/lib/sparse-map/typed-sparse-map-lite.js.map +1 -0
  84. package/lib/sparse-map/typed-sparse-map.d.ts +21 -0
  85. package/lib/sparse-map/typed-sparse-map.js +130 -0
  86. package/lib/sparse-map/typed-sparse-map.js.map +1 -0
  87. package/lib/sparse-set/clean-sparse-set.d.ts +13 -0
  88. package/lib/sparse-set/clean-sparse-set.js +57 -0
  89. package/lib/sparse-set/clean-sparse-set.js.map +1 -0
  90. package/lib/{typed-sparse-set.d.ts → sparse-set/dynamic-typed-clean-sparse-set-lite.d.ts} +6 -6
  91. package/lib/sparse-set/dynamic-typed-clean-sparse-set-lite.js +51 -0
  92. package/lib/sparse-set/dynamic-typed-clean-sparse-set-lite.js.map +1 -0
  93. package/lib/sparse-set/dynamic-typed-clean-sparse-set.d.ts +16 -0
  94. package/lib/sparse-set/dynamic-typed-clean-sparse-set.js +82 -0
  95. package/lib/sparse-set/dynamic-typed-clean-sparse-set.js.map +1 -0
  96. package/lib/sparse-set/dynamic-typed-sparse-set-lite.d.ts +15 -0
  97. package/lib/sparse-set/dynamic-typed-sparse-set-lite.js +52 -0
  98. package/lib/sparse-set/dynamic-typed-sparse-set-lite.js.map +1 -0
  99. package/lib/sparse-set/dynamic-typed-sparse-set.d.ts +15 -0
  100. package/lib/sparse-set/dynamic-typed-sparse-set.js +75 -0
  101. package/lib/sparse-set/dynamic-typed-sparse-set.js.map +1 -0
  102. package/lib/sparse-set/index.d.ts +14 -0
  103. package/lib/sparse-set/index.js +15 -0
  104. package/lib/sparse-set/index.js.map +1 -0
  105. package/lib/sparse-set/resizable-typed-clean-sparse-set-lite.d.ts +15 -0
  106. package/lib/sparse-set/resizable-typed-clean-sparse-set-lite.js +51 -0
  107. package/lib/sparse-set/resizable-typed-clean-sparse-set-lite.js.map +1 -0
  108. package/lib/sparse-set/resizable-typed-clean-sparse-set.d.ts +16 -0
  109. package/lib/sparse-set/resizable-typed-clean-sparse-set.js +83 -0
  110. package/lib/sparse-set/resizable-typed-clean-sparse-set.js.map +1 -0
  111. package/lib/sparse-set/resizable-typed-sparse-set-lite.d.ts +15 -0
  112. package/lib/sparse-set/resizable-typed-sparse-set-lite.js +52 -0
  113. package/lib/sparse-set/resizable-typed-sparse-set-lite.js.map +1 -0
  114. package/lib/sparse-set/resizable-typed-sparse-set.d.ts +15 -0
  115. package/lib/sparse-set/resizable-typed-sparse-set.js +76 -0
  116. package/lib/sparse-set/resizable-typed-sparse-set.js.map +1 -0
  117. package/lib/{sparse-set.d.ts → sparse-set/sparse-set.d.ts} +3 -4
  118. package/lib/sparse-set/sparse-set.js +60 -0
  119. package/lib/sparse-set/sparse-set.js.map +1 -0
  120. package/lib/sparse-set/typed-clean-sparse-set-lite.d.ts +15 -0
  121. package/lib/sparse-set/typed-clean-sparse-set-lite.js +55 -0
  122. package/lib/sparse-set/typed-clean-sparse-set-lite.js.map +1 -0
  123. package/lib/sparse-set/typed-clean-sparse-set.d.ts +16 -0
  124. package/lib/sparse-set/typed-clean-sparse-set.js +80 -0
  125. package/lib/sparse-set/typed-clean-sparse-set.js.map +1 -0
  126. package/lib/sparse-set/typed-sparse-set-lite.d.ts +15 -0
  127. package/lib/sparse-set/typed-sparse-set-lite.js +60 -0
  128. package/lib/sparse-set/typed-sparse-set-lite.js.map +1 -0
  129. package/lib/sparse-set/typed-sparse-set.d.ts +15 -0
  130. package/lib/sparse-set/typed-sparse-set.js +81 -0
  131. package/lib/sparse-set/typed-sparse-set.js.map +1 -0
  132. package/lib/string-radix-tree.js +3 -4
  133. package/lib/string-radix-tree.js.map +1 -1
  134. package/lib/string-trie-map.js +3 -4
  135. package/lib/string-trie-map.js.map +1 -1
  136. package/lib/tlru-map.js +6 -6
  137. package/lib/tlru-map.js.map +1 -1
  138. package/lib/trie-map.js +3 -4
  139. package/lib/trie-map.js.map +1 -1
  140. package/lib/unique-queue.js +1 -3
  141. package/lib/unique-queue.js.map +1 -1
  142. package/lib/utils/compute-new-capacity.d.ts +1 -0
  143. package/lib/utils/compute-new-capacity.js +36 -0
  144. package/lib/utils/compute-new-capacity.js.map +1 -0
  145. package/lib/utils/get-max-value-of-unsigned-typed-array.d.ts +3 -0
  146. package/lib/utils/get-max-value-of-unsigned-typed-array.js +13 -0
  147. package/lib/utils/get-max-value-of-unsigned-typed-array.js.map +1 -0
  148. package/lib/utils/skip-list.js +11 -9
  149. package/lib/utils/skip-list.js.map +1 -1
  150. package/lib/utils/trailing-zeros.js +1 -1
  151. package/lib/utils/trailing-zeros.js.map +1 -1
  152. package/package.json +28 -31
  153. package/src/{bit-set.ts → bit-set/bit-set.ts} +47 -31
  154. package/src/bit-set/dynamic-typed-bit-set.ts +131 -0
  155. package/src/bit-set/index.ts +4 -0
  156. package/src/{typed-bit-set.ts → bit-set/resizable-typed-bit-set.ts} +38 -36
  157. package/src/bit-set/typed-bit-set.ts +134 -0
  158. package/src/dynamic-typed-array.ts +67 -82
  159. package/src/index.ts +5 -7
  160. package/src/resizable-typed-array.ts +214 -0
  161. package/src/sparse-map/clean-sparse-map.ts +84 -0
  162. package/src/sparse-map/dynamic-typed-clean-sparse-map-lite.ts +109 -0
  163. package/src/sparse-map/dynamic-typed-sparse-map-lite.ts +124 -0
  164. package/src/sparse-map/index.ts +11 -0
  165. package/src/sparse-map/resizable-typed-clean-sparse-map-lite.ts +107 -0
  166. package/src/sparse-map/resizable-typed-sparse-map-lite.ts +122 -0
  167. package/src/sparse-map/sparse-map.ts +104 -0
  168. package/src/sparse-map/typed-clean-sparse-map-lite.ts +116 -0
  169. package/src/sparse-map/typed-clean-sparse-map.ts +149 -0
  170. package/src/sparse-map/typed-sparse-map-lite.ts +141 -0
  171. package/src/sparse-map/typed-sparse-map.ts +169 -0
  172. package/src/sparse-set/clean-sparse-set.ts +76 -0
  173. package/src/sparse-set/dynamic-typed-clean-sparse-set-lite.ts +64 -0
  174. package/src/sparse-set/dynamic-typed-clean-sparse-set.ts +101 -0
  175. package/src/sparse-set/dynamic-typed-sparse-set-lite.ts +67 -0
  176. package/src/sparse-set/dynamic-typed-sparse-set.ts +93 -0
  177. package/src/sparse-set/index.ts +15 -0
  178. package/src/sparse-set/resizable-typed-clean-sparse-set-lite.ts +64 -0
  179. package/src/sparse-set/resizable-typed-clean-sparse-set.ts +108 -0
  180. package/src/sparse-set/resizable-typed-sparse-set-lite.ts +67 -0
  181. package/src/sparse-set/resizable-typed-sparse-set.ts +97 -0
  182. package/src/sparse-set/sparse-set.ts +79 -0
  183. package/src/sparse-set/typed-clean-sparse-set-lite.ts +67 -0
  184. package/src/sparse-set/typed-clean-sparse-set.ts +100 -0
  185. package/src/sparse-set/typed-sparse-set-lite.ts +74 -0
  186. package/src/sparse-set/typed-sparse-set.ts +102 -0
  187. package/src/utils/compute-new-capacity.ts +39 -0
  188. package/src/utils/get-max-value-of-unsigned-typed-array.ts +19 -0
  189. package/src/utils/skip-list.ts +1 -1
  190. package/src/utils/trailing-zeros.ts +2 -3
  191. package/lib/bit-set.js.map +0 -1
  192. package/lib/sparse-map.js +0 -76
  193. package/lib/sparse-map.js.map +0 -1
  194. package/lib/sparse-set.js +0 -63
  195. package/lib/sparse-set.js.map +0 -1
  196. package/lib/typed-bit-set.js.map +0 -1
  197. package/lib/typed-sparse-map.d.ts +0 -20
  198. package/lib/typed-sparse-map.js +0 -83
  199. package/lib/typed-sparse-map.js.map +0 -1
  200. package/lib/typed-sparse-set.js +0 -59
  201. package/lib/typed-sparse-set.js.map +0 -1
  202. package/src/sparse-map.ts +0 -82
  203. package/src/sparse-set.ts +0 -74
  204. package/src/typed-sparse-map.ts +0 -97
  205. package/src/typed-sparse-set.ts +0 -73
@@ -1,59 +0,0 @@
1
- export class TypedSparseSet {
2
- constructor(array) {
3
- const valueToIndex = [];
4
- if (array.length > 0) {
5
- for (const [index, value] of array.internalTypedArray.entries()) {
6
- valueToIndex[value] = index;
7
- }
8
- }
9
- this.indexToValue = array;
10
- this.valueToIndex = valueToIndex;
11
- }
12
- get [Symbol.toStringTag]() {
13
- return this.constructor.name;
14
- }
15
- [Symbol.iterator]() {
16
- return this.values();
17
- }
18
- get size() {
19
- return this.indexToValue.length;
20
- }
21
- *values() {
22
- for (let i = 0; i < this.indexToValue.length; i++) {
23
- yield this.indexToValue.internalTypedArray[i];
24
- }
25
- }
26
- has(value) {
27
- return this.valueToIndex[value] !== undefined;
28
- }
29
- add(value) {
30
- if (!this.has(value)) {
31
- const index = this.indexToValue.length;
32
- this.indexToValue.push(value);
33
- this.valueToIndex[value] = index;
34
- }
35
- }
36
- delete(value) {
37
- if (this.has(value)) {
38
- const lastValue = this.indexToValue.pop();
39
- if (value === lastValue) {
40
- this.valueToIndex[value] = undefined;
41
- }
42
- else {
43
- const index = this.valueToIndex[value];
44
- this.indexToValue.internalTypedArray[index] = lastValue;
45
- this.valueToIndex[lastValue] = index;
46
- this.valueToIndex[value] = undefined;
47
- }
48
- return true;
49
- }
50
- else {
51
- return false;
52
- }
53
- }
54
- clear() {
55
- this.valueToIndex.length = 0;
56
- this.indexToValue.clear();
57
- }
58
- }
59
- //# sourceMappingURL=typed-sparse-set.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"typed-sparse-set.js","sourceRoot":"","sources":["../src/typed-sparse-set.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,cAAc;IAMzB,YAAY,KAA2B;QACrC,MAAM,YAAY,GAA8B,EAAE,CAAA;QAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChE,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;QACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;IAC9B,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,MAAM,EAAE,CAAA;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;IACjC,CAAC;IAED,CAAE,MAAM;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAa;QACf,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,CAAA;IAC/C,CAAC;IAED,GAAG,CAAC,KAAa;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;YACtC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC7B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QAClC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAG,CAAA;YAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAE,CAAA;gBACvC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;gBACvD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,CAAA;gBACpC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;YACtC,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;IAC3B,CAAC;CACF"}
package/src/sparse-map.ts DELETED
@@ -1,82 +0,0 @@
1
- export class SparseMap<T> {
2
- private keyToIndex: Array<number | undefined> = []
3
- private indexToKey: number[] = []
4
- private indexToValue: T[] = []
5
-
6
- get [Symbol.toStringTag](): string {
7
- return this.constructor.name
8
- }
9
-
10
- get size(): number {
11
- return this.indexToKey.length
12
- }
13
-
14
- get internalArray(): T[] {
15
- return this.indexToValue
16
- }
17
-
18
- * entries(): IterableIterator<[key: number, value: T]> {
19
- for (let i = 0; i < this.indexToKey.length; i++) {
20
- yield [this.indexToKey[i], this.indexToValue[i]]
21
- }
22
- }
23
-
24
- keys(): IterableIterator<number> {
25
- return this.indexToKey.values()
26
- }
27
-
28
- values(): IterableIterator<T> {
29
- return this.indexToValue.values()
30
- }
31
-
32
- getInternalIndexOfKey(key: number): number | undefined {
33
- return this.keyToIndex[key]
34
- }
35
-
36
- has(key: number): boolean {
37
- return this.keyToIndex[key] !== undefined
38
- }
39
-
40
- get(key: number): T | undefined {
41
- if (this.has(key)) {
42
- const index = this.keyToIndex[key]!
43
- return this.indexToValue[index]
44
- } else {
45
- return undefined
46
- }
47
- }
48
-
49
- set(key: number, value: T): void {
50
- if (this.has(key)) {
51
- const index = this.keyToIndex[key]!
52
- this.indexToValue[index] = value
53
- } else {
54
- const index = this.indexToKey.length
55
- this.indexToKey.push(key)
56
- this.indexToValue.push(value)
57
- this.keyToIndex[key] = index
58
- }
59
- }
60
-
61
- delete(key: number): void {
62
- if (this.has(key)) {
63
- const lastKey = this.indexToKey.pop()!
64
- const lastValue = this.indexToValue.pop()!
65
- if (key === lastKey) {
66
- this.keyToIndex[key] = undefined
67
- } else {
68
- const index = this.keyToIndex[key]!
69
- this.indexToKey[index] = lastKey
70
- this.indexToValue[index] = lastValue
71
- this.keyToIndex[lastKey] = index
72
- this.keyToIndex[key] = undefined
73
- }
74
- }
75
- }
76
-
77
- clear(): void {
78
- this.keyToIndex.length = 0
79
- this.indexToKey.length = 0
80
- this.indexToValue.length = 0
81
- }
82
- }
package/src/sparse-set.ts DELETED
@@ -1,74 +0,0 @@
1
- export class SparseSet implements Iterable<number> {
2
- private indexToValue: number[] = []
3
- private valueToIndex: Array<number | undefined>
4
-
5
- get [Symbol.toStringTag](): string {
6
- return this.constructor.name
7
- }
8
-
9
- [Symbol.iterator](): IterableIterator<number> {
10
- return this.indexToValue[Symbol.iterator]()
11
- }
12
-
13
- get size(): number {
14
- return this.indexToValue.length
15
- }
16
-
17
- constructor(array: number[] = []) {
18
- const valueToIndex: Array<number | undefined> = []
19
- if (array.length > 0) {
20
- for (const [index, value] of array.entries()) {
21
- valueToIndex[value] = index
22
- }
23
- }
24
-
25
- this.valueToIndex = valueToIndex
26
- }
27
-
28
- values(): IterableIterator<number> {
29
- return this.indexToValue[Symbol.iterator]()
30
- }
31
-
32
- has(value: number): boolean {
33
- return this.valueToIndex[value] !== undefined
34
- }
35
-
36
- add(value: number): void {
37
- if (!this.has(value)) {
38
- const index = this.indexToValue.length
39
- this.indexToValue.push(value)
40
- this.valueToIndex[value] = index
41
- }
42
- }
43
-
44
- delete(value: number): boolean {
45
- if (this.has(value)) {
46
- const lastValue = this.indexToValue.pop()!
47
- if (value === lastValue) {
48
- this.valueToIndex[value] = undefined
49
- } else {
50
- const index = this.valueToIndex[value]!
51
- this.indexToValue[index] = lastValue
52
- this.valueToIndex[lastValue] = index
53
- this.valueToIndex[value] = undefined
54
- }
55
- return true
56
- } else {
57
- return false
58
- }
59
- }
60
-
61
- clear(): void {
62
- this.indexToValue.length = 0
63
- this.valueToIndex.length = 0
64
- }
65
-
66
- clone(): SparseSet {
67
- const clone = new SparseSet()
68
-
69
- clone.indexToValue = [...this.indexToValue]
70
- clone.valueToIndex = [...this.valueToIndex]
71
-
72
- return clone
73
- }
74
- }
@@ -1,97 +0,0 @@
1
- import { assert } from '@blackglory/errors'
2
- import { TypedArrayConstructor, TypedArrayOfConstructor } from 'justypes'
3
- import { DynamicTypedArray } from './dynamic-typed-array.js'
4
-
5
- export class TypedSparseMap<T extends TypedArrayConstructor> {
6
- private keyToIndex: Array<number | undefined> = []
7
- private indexToKey: number[] = []
8
- private indexToValue: DynamicTypedArray<T>
9
-
10
- get [Symbol.toStringTag](): string {
11
- return this.constructor.name
12
- }
13
-
14
- get size(): number {
15
- return this.indexToKey.length
16
- }
17
-
18
- get internalTypedArray(): TypedArrayOfConstructor<T> {
19
- return this.indexToValue.internalTypedArray
20
- }
21
-
22
- constructor(array: DynamicTypedArray<T>) {
23
- assert(array.length === 0, 'array should be empty')
24
-
25
- this.indexToValue = array
26
- }
27
-
28
- * entries(): IterableIterator<[key: number, value: number]> {
29
- for (let i = 0; i < this.indexToKey.length; i++) {
30
- yield [
31
- this.indexToKey[i]
32
- , this.indexToValue.internalTypedArray[i]
33
- ]
34
- }
35
- }
36
-
37
- keys(): IterableIterator<number> {
38
- return this.indexToKey.values()
39
- }
40
-
41
- * values(): IterableIterator<number> {
42
- for (let i = 0; i < this.indexToKey.length; i++) {
43
- yield this.indexToValue.internalTypedArray[i]
44
- }
45
- }
46
-
47
- getInternalIndexOfKey(key: number): number | undefined {
48
- return this.keyToIndex[key]
49
- }
50
-
51
- has(key: number): boolean {
52
- return this.keyToIndex[key] !== undefined
53
- }
54
-
55
- get(key: number): number | undefined {
56
- if (this.has(key)) {
57
- const index = this.keyToIndex[key]!
58
- return this.indexToValue.internalTypedArray[index]
59
- } else {
60
- return undefined
61
- }
62
- }
63
-
64
- set(key: number, value: number): void {
65
- if (this.has(key)) {
66
- const index = this.keyToIndex[key]!
67
- this.indexToValue.internalTypedArray[index] = value
68
- } else {
69
- const index = this.indexToKey.length
70
- this.indexToKey.push(key)
71
- this.indexToValue.push(value)
72
- this.keyToIndex[key] = index
73
- }
74
- }
75
-
76
- delete(key: number): void {
77
- if (this.has(key)) {
78
- const lastKey = this.indexToKey.pop()!
79
- const lastValue = this.indexToValue.pop()!
80
- if (key === lastKey) {
81
- this.keyToIndex[key] = undefined
82
- } else {
83
- const index = this.keyToIndex[key]!
84
- this.indexToKey[index] = lastKey
85
- this.indexToValue.internalTypedArray[index] = lastValue
86
- this.keyToIndex[lastKey] = index
87
- this.keyToIndex[key] = undefined
88
- }
89
- }
90
- }
91
-
92
- clear(): void {
93
- this.keyToIndex.length = 0
94
- this.indexToKey.length = 0
95
- this.indexToValue.clear()
96
- }
97
- }
@@ -1,73 +0,0 @@
1
- import { UnsignedTypedArrayConstructor } from 'justypes'
2
- import { DynamicTypedArray } from './dynamic-typed-array.js'
3
-
4
- export class TypedSparseSet<
5
- T extends UnsignedTypedArrayConstructor
6
- > implements Iterable<number> {
7
- private valueToIndex: Array<number | undefined>
8
- private indexToValue: DynamicTypedArray<T>
9
-
10
- constructor(array: DynamicTypedArray<T>) {
11
- const valueToIndex: Array<number | undefined> = []
12
- if (array.length > 0) {
13
- for (const [index, value] of array.internalTypedArray.entries()) {
14
- valueToIndex[value] = index
15
- }
16
- }
17
-
18
- this.indexToValue = array
19
- this.valueToIndex = valueToIndex
20
- }
21
-
22
- get [Symbol.toStringTag](): string {
23
- return this.constructor.name
24
- }
25
-
26
- [Symbol.iterator](): IterableIterator<number> {
27
- return this.values()
28
- }
29
-
30
- get size(): number {
31
- return this.indexToValue.length
32
- }
33
-
34
- * values(): IterableIterator<number> {
35
- for (let i = 0; i < this.indexToValue.length; i++) {
36
- yield this.indexToValue.internalTypedArray[i]
37
- }
38
- }
39
-
40
- has(value: number): boolean {
41
- return this.valueToIndex[value] !== undefined
42
- }
43
-
44
- add(value: number): void {
45
- if (!this.has(value)) {
46
- const index = this.indexToValue.length
47
- this.indexToValue.push(value)
48
- this.valueToIndex[value] = index
49
- }
50
- }
51
-
52
- delete(value: number): boolean {
53
- if (this.has(value)) {
54
- const lastValue = this.indexToValue.pop()!
55
- if (value === lastValue) {
56
- this.valueToIndex[value] = undefined
57
- } else {
58
- const index = this.valueToIndex[value]!
59
- this.indexToValue.internalTypedArray[index] = lastValue
60
- this.valueToIndex[lastValue] = index
61
- this.valueToIndex[value] = undefined
62
- }
63
- return true
64
- } else {
65
- return false
66
- }
67
- }
68
-
69
- clear(): void {
70
- this.valueToIndex.length = 0
71
- this.indexToValue.clear()
72
- }
73
- }