@blackglory/structures 0.14.15 → 0.15.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 (205) hide show
  1. package/README.md +681 -99
  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 +6 -7
  41. package/lib/index.js +6 -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/typed-array.d.ts +3 -0
  141. package/lib/typed-array.js +13 -0
  142. package/lib/typed-array.js.map +1 -0
  143. package/lib/unique-queue.js +1 -3
  144. package/lib/unique-queue.js.map +1 -1
  145. package/lib/utils/compute-new-capacity.d.ts +1 -0
  146. package/lib/utils/compute-new-capacity.js +36 -0
  147. package/lib/utils/compute-new-capacity.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 +6 -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/typed-array.ts +19 -0
  188. package/src/utils/compute-new-capacity.ts +39 -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
package/README.md CHANGED
@@ -58,6 +58,19 @@ function truncateArrayRight(arr: unknown[], num: number): void
58
58
  function clearArray(arr: unknown[]): void
59
59
  ```
60
60
 
61
+ ### TypedArray
62
+ #### getMaxValueOfUnsignedTypedArray
63
+ ```ts
64
+ function getMaxValueOfUnsignedTypedArray(array: UnsignedTypedArray): number
65
+ ```
66
+
67
+ #### getMaxValueOfUnsignedTypedArrayConstructor
68
+ ```ts
69
+ function getMaxValueOfUnsignedTypedArrayConstructor(
70
+ constructor: UnsignedTypedArrayConstructor
71
+ ): number
72
+ ```
73
+
61
74
  ### Emitter
62
75
  ```ts
63
76
  type Listener<Args extends unknown[]> = (...args: Args) => void
@@ -248,7 +261,6 @@ class HashMap<K, V, Hash = unknown> {
248
261
  class HashSet<V, Hash = unknown> implements Iterable<V> {
249
262
  get [Symbol.toStringTag](): string
250
263
  get size(): number
251
- [Symbol.iterator](): IterableIterator<V>
252
264
 
253
265
  constructor(hash: (value: V) => Hash)
254
266
 
@@ -416,202 +428,772 @@ class StringRadixTree<T> {
416
428
  Note that you might expect this data structure to be more space efficient than `BigMap`, but it doesn't.
417
429
  In V8, it can only store about 80% of data of `BigMap`.
418
430
 
419
- ### SparseSet
431
+ ### DynamicTypedArray
420
432
  ```ts
421
- class SparseSet implements Iterable<number> {
433
+ class DynamicTypedArray<
434
+ T extends TypedArrayConstructor
435
+ > implements Iterable<number> {
436
+ get [Symbol.toStringTag](): string
437
+ get capacity(): number
438
+ get length(): number
439
+ readonly BYTES_PER_ELEMENT: number
440
+ readonly growthFactor: number
441
+
442
+ /**
443
+ * `DynamicTypedArray` cannot respond to any operations on the internal array,
444
+ * you must ensure that indexes accessed are less than the length of `DynamicTypedArray`.
445
+ */
446
+ get internalTypedArray(): TypedArrayOfConstructor<T>
447
+
448
+ constructor(
449
+ typedArrayConstructor: T
450
+ , options?: {
451
+ initialCapacity?: number = 0
452
+ growthFactor?: number = 1.5
453
+ fillValue?: number = 0
454
+ }
455
+ )
456
+
457
+ values(): IterableIterator<number>
458
+
459
+ set(index: number, value: number): void
460
+ setValues(index: number, values: ArrayLike<number>): void
461
+
462
+ get(index: number): number | undefined
463
+
464
+ push(...values: number[]): void
465
+ pop(): number | undefined
466
+
467
+ clear(): void
468
+ shrink(): void
469
+
470
+ sort(compare?: (a: number, b: number) => number): void
471
+ }
472
+ ```
473
+
474
+ This implementation applies to versions prior to ES2024,
475
+ you might prefer using `ResizableTypedArray`.
476
+
477
+ ### ResizableTypedArray
478
+ ```ts
479
+ class ResizableTypedArray<T extends TypedArrayConstructor> {
480
+ readonly maxCapacity: number
481
+ readonly growthFactor: number
482
+ readonly BYTES_PER_ELEMENT: number
483
+ readonly internalTypedArray: TypedArrayOfConstructor<T>
484
+
485
+ get [Symbol.toStringTag](): string
486
+ get capacity(): number
487
+ get length(): number
488
+
489
+ constructor(
490
+ typedArrayConstructor: T
491
+ , options: {
492
+ maxCapacity: number
493
+
494
+ initialCapacity?: capacity = 0
495
+ growthFactor?: number = 1.5
496
+ fillValue?: number = 0
497
+ }
498
+ )
499
+
500
+ set(index: number, value: number): void
501
+ setValues(index: number, values: ArrayLike<number>): void
502
+
503
+ get(index: number): number | undefined
504
+
505
+ push(...values: number[]): void
506
+ pop(): number | undefined
507
+
508
+ clear(): void
509
+ shrink(): void
510
+
511
+ sort(compare?: (a: number, b: number) => number): void
512
+ }
513
+ ```
514
+
515
+ This implementation is based on Resizable Array Buffers,
516
+ support for which was introduced in ES2024.
517
+
518
+ ### SortedSet
519
+ ```ts
520
+ class SortedSet<T> implements Iterable<T> {
521
+ get [Symbol.toStringTag](): string
522
+
523
+ constructor(compare: (a: T, b: T) => number)
524
+
525
+ values(): IterableIterator<T>
526
+
527
+ has(value: T): boolean
528
+ add(value: T): void
529
+ delete(value: T): void
530
+ }
531
+ ```
532
+
533
+ ### DisjointSet
534
+ ```ts
535
+ class DisjointSet {
536
+ has(value: number): boolean
537
+ sets(): number[][]
538
+
539
+ makeSet(value: number): number
540
+ union(a: number, b: number): void
541
+ find(value: number): number
542
+ }
543
+ ```
544
+
545
+ ### Bit Set
546
+ #### BitSet
547
+ ```ts
548
+ class BitSet implements Iterable<number> {
422
549
  get [Symbol.toStringTag](): string
423
- get [Symbol.iterator](): IterableIterator<number>
424
550
  get size(): number
425
551
 
426
- constructor(array?: number[])
552
+ constructor(bitsPerElement: number = 8)
427
553
 
428
554
  values(): IterableIterator<number>
429
555
 
430
556
  has(value: number): boolean
431
- add(value: number): void
557
+ add(value: number): boolean
432
558
  delete(value: number): boolean
559
+
433
560
  clear(): void
434
561
 
435
- clone(): SparseSet
562
+ clone(): BitSet
436
563
  }
437
564
  ```
438
565
 
439
- ### SparseMap
566
+ Due to the length of arrays supported by JavaScript,
567
+ `BitSet` cannot support very large values.
568
+
569
+ #### TypedBitSet
440
570
  ```ts
441
- class SparseMap<T> {
571
+ class TypedBitSet implements Iterable<number> {
442
572
  get [Symbol.toStringTag](): string
573
+ get capacity(): number
443
574
  get size(): number
444
575
 
445
- /**
446
- * `SparseMap` cannot respond to any operations on the internal array,
447
- * you must ensure that indexes accessed are less than the length of `SparseMap`.
448
- *
449
- * Keys do not correspond to indexes of the array.
450
- */
451
- get internalArray(): T[]
576
+ constructor(array: UnsignedTypedArray)
452
577
 
453
- entries(): IterableIterator<[key: number, value: T]>
454
- keys(): IterableIterator<number>
455
- values(): IterableIterator<T>
578
+ values(): IterableIterator<number>
456
579
 
457
- getInternalIndexOfKey(key: number): number | undefined
580
+ has(value: number): boolean
581
+ add(value: number): boolean
582
+ delete(value: number): boolean
458
583
 
459
- has(key: number): boolean
460
- get(key: number): T | undefined
461
- set(key: number, value: T): void
462
- delete(key: number): void
463
584
  clear(): void
464
585
  }
465
586
  ```
466
587
 
467
- ### DynamicTypedArray
588
+ #### DynamicTypedBitSet
468
589
  ```ts
469
- class DynamicTypedArray<T extends TypedArrayConstructor> {
590
+ class DynamicTypedBitSet implements Iterable<number> {
470
591
  get [Symbol.toStringTag](): string
471
- get BYTES_PER_ELEMENT(): number
472
592
  get capacity(): number
473
- get length(): number
474
- readonly growthFactor: number
593
+ get size(): number
475
594
 
476
- /**
477
- * `DynamicTypedArray` cannot respond to any operations on the internal array,
478
- * you must ensure that indexes accessed are less than the length of `DynamicTypedArray`.
479
- */
480
- get internalTypedArray(): TypedArrayOfConstructor<T>
595
+ constructor(array: array: DynamicTypedArray<UnsignedTypedArrayConstructor>)
481
596
 
482
- constructor(
483
- typedArrayConstructor: T
484
- , options?: {
485
- capacity?: number = 0
486
- growthFactor?: number = 1.5
487
- }
488
- )
597
+ values(): IterableIterator<number>
598
+
599
+ has(value: number): boolean
600
+ add(value: number): boolean
601
+ delete(value: number): boolean
489
602
 
490
- set(index: number, value: number): void
491
- setValues(index: number, values: TypedArrayOfConstructor<T>): void
492
- get(index: number): number | undefined
493
- push(...values: number[]): void
494
- pop(): number | undefined
495
603
  clear(): void
496
- sort(compare?: (a: number, b: number) => number): void
497
604
  }
498
605
  ```
499
606
 
500
- ### TypedSparseSet
607
+ Due to the length of arrays supported by JavaScript,
608
+ `DynamicTypedBitSit` cannot support very large values.
609
+
610
+ #### ResizableTypedBitSet
501
611
  ```ts
502
- class TypedSparseSet<T extends UnsignedTypedArrayConstructor> {
612
+ class ResizableTypedBitSet implements Iterable<number> {
503
613
  get [Symbol.toStringTag](): string
504
- get [Symbol.iterator](): IterableIterator<number>
505
614
  get size(): number
506
615
 
507
- constructor(array: DynamicTypedArray<T>)
616
+ constructor(array: ResizableTypedArray<UnsignedTypedArrayConstructor>)
508
617
 
509
618
  values(): IterableIterator<number>
510
619
 
511
620
  has(value: number): boolean
512
- add(value: number): void
621
+ add(value: number): boolean
513
622
  delete(value: number): boolean
623
+
514
624
  clear(): void
515
625
  }
516
626
  ```
517
627
 
518
- ### TypedSparseMap
628
+ Due to the length of arrays supported by JavaScript,
629
+ `ResizableTypedBitSit` cannot support very large values.
630
+
631
+ ### Sparse Set
632
+ There are many implementations.
633
+ Based on benchmark results, `TypedCleanSparseSet` is the fastest,
634
+ followed by `TypedCleanSparseSetLite`.
635
+ If array resizing is required,
636
+ choose `DynamicTypedCleanSparseSetLite` or `ResizableTypedCleanSparseSetLite`.
637
+
638
+ #### SparseSet
519
639
  ```ts
520
- class TypedSparseMap<T extends TypedArrayConstructor> {
640
+ class SparseSet implements Iterable<number> {
521
641
  get [Symbol.toStringTag](): string
522
642
  get size(): number
523
643
 
524
- /**
525
- * `SparseMap` cannot respond to any operations on the internal array,
526
- * you must ensure that indexes accessed are less than the length of `SparseMap`.
527
- *
528
- * Keys do not correspond to indexes of the array.
529
- */
530
- get internalTypedArray(): TypedArrayOfConstructor<T>
644
+ values(): IterableIterator<number>
645
+
646
+ has(value: number): boolean
647
+ add(value: number): void
648
+ delete(value: number): boolean
531
649
 
532
- constructor(array: DynamicTypedArray<T>)
650
+ clear(): void
651
+
652
+ clone(): SparseSet
653
+ }
654
+ ```
655
+
656
+ #### CleanSparseSet
657
+ ```ts
658
+ class CleanSparseSet implements Iterable<number> {
659
+ get [Symbol.toStringTag](): string
660
+ get size(): number
533
661
 
534
- entries(): IterableIterator<[key: number, value: number]>
535
- keys(): IterableIterator<number>
536
662
  values(): IterableIterator<number>
537
663
 
538
- getInternalIndexOfKey(key: number): number | undefined
664
+ has(value: number): boolean
665
+ add(value: number): void
666
+ delete(value: number): boolean
539
667
 
540
- has(key: number): boolean
541
- get(key: number): T | undefined
542
- set(key: number, value: number): void
543
- delete(key: number): void
544
668
  clear(): void
669
+
670
+ clone(): CleanSparseSet
545
671
  }
546
672
  ```
547
673
 
548
- ### SortedSet
674
+ #### TypedSparseSet
549
675
  ```ts
550
- class SortedSet<T> {
676
+ class TypedSparseSet implements Iterable<number> {
551
677
  get [Symbol.toStringTag](): string
552
- [Symbol.iterator](): IterableIterator<T>
678
+ get size(): number
553
679
 
554
- constructor(compare: (a: T, b: T) => number)
680
+ constructor(array: UnsignedTypedArray<ArrayBuffer>)
555
681
 
556
- values(): IterableIterator<T>
557
- has(value: T): boolean
558
- add(value: T): void
559
- delete(value: T): void
682
+ values(): IterableIterator<number>
683
+
684
+ has(value: number): boolean
685
+ add(value: number): void
686
+ delete(value: number): boolean
687
+
688
+ clear(): void
560
689
  }
561
690
  ```
562
691
 
563
- ### BitSet
692
+ #### TypedSparseSetLite
564
693
  ```ts
565
- class BitSet {
694
+ class TypedSparseSetLite implements Iterable<number> {
566
695
  get [Symbol.toStringTag](): string
567
696
  get size(): number
568
- [Symbol.iterator](): IterableIterator<number>
569
697
 
570
- constructor(bitsPerElement: number = 8)
698
+ constructor(array: UnsignedTypedArray<ArrayBuffer>)
571
699
 
572
700
  values(): IterableIterator<number>
573
701
 
574
702
  has(value: number): boolean
575
- add(value: number): boolean
703
+ add(value: number): void
576
704
  delete(value: number): boolean
577
- clear(): void
578
705
 
579
- clone(): BitSet
706
+ clear(): void
580
707
  }
581
708
  ```
582
709
 
583
- Due to the length of arrays supported by JavaScript,
584
- `BitSet` cannot support very large values.
710
+ #### TypedCleanSparseSet
711
+ ```ts
712
+ class TypedCleanSparseSet implements Iterable<number> {
713
+ get [Symbol.toStringTag](): string
714
+ get size(): number
715
+
716
+ constructor(array: UnsignedTypedArray<ArrayBuffer>)
585
717
 
586
- ### TypedBitSet
718
+ values(): IterableIterator<number>
719
+
720
+ has(value: number): boolean
721
+ add(value: number): void
722
+ delete(value: number): boolean
723
+
724
+ clear(): void
725
+ }
726
+ ```
727
+
728
+ #### TypedCleanSparseSetLite
587
729
  ```ts
588
- class TypedBitSet<T extends UnsignedTypedArrayConstructor> {
730
+ class TypedCleanSparseSetLite implements Iterable<number> {
589
731
  get [Symbol.toStringTag](): string
590
732
  get size(): number
591
- [Symbol.iterator](): IterableIterator<number>
592
733
 
593
- constructor(array: DynamicTypedArray<T>)
734
+ constructor(array: UnsignedTypedArray<ArrayBuffer>)
594
735
 
595
736
  values(): IterableIterator<number>
596
737
 
597
738
  has(value: number): boolean
598
- add(value: number): boolean
739
+ add(value: number): void
599
740
  delete(value: number): boolean
741
+
600
742
  clear(): void
601
743
  }
602
744
  ```
603
745
 
604
- Due to the length of arrays supported by JavaScript,
605
- `TypedBitSit` cannot support very large values.
746
+ #### DynamicTypedSparseSet
747
+ ```ts
748
+ class DynamicTypedSparseSet implements Iterable<number> {
749
+ get [Symbol.toStringTag](): string
750
+ get size(): number
606
751
 
607
- ### DisjointSet
752
+ constructor(array: DynamicTypedArray<UnsignedTypedArrayConstructor>)
753
+
754
+ values(): IterableIterator<number>
755
+
756
+ has(value: number): boolean
757
+ add(value: number): void
758
+ delete(value: number): boolean
759
+
760
+ clear(): void
761
+ }
762
+ ```
763
+
764
+ #### DynamicTypedSparseSetLite
608
765
  ```ts
609
- class DisjointSet {
766
+ class DynamicTypedSparseSetLite implements Iterable<number> {
767
+ get [Symbol.toStringTag](): string
768
+ get size(): number
769
+
770
+ constructor(array: DynamicTypedArray<UnsignedTypedArrayConstructor>)
771
+
772
+ values(): IterableIterator<number>
773
+
610
774
  has(value: number): boolean
611
- sets(): number[][]
775
+ add(value: number): void
776
+ delete(value: number): boolean
612
777
 
613
- makeSet(value: number): number
614
- union(a: number, b: number): void
615
- find(value: number): number
778
+ clear(): void
779
+ }
780
+ ```
781
+
782
+ #### DynamicTypedCleanSparseSet
783
+ ```ts
784
+ class DynamicTypedCleanSparseSet implements Iterable<number> {
785
+ get [Symbol.toStringTag](): string
786
+ get size(): number
787
+
788
+ constructor(array: DynamicTypedArray<UnsignedTypedArrayConstructor>)
789
+
790
+ values(): IterableIterator<number>
791
+
792
+ has(value: number): boolean
793
+ add(value: number): void
794
+ delete(value: number): boolean
795
+
796
+ clear(): void
797
+ }
798
+ ```
799
+
800
+ #### DynamicTypedCleanSparseSetLite
801
+ ```ts
802
+ class DynamicTypedCleanSparseSetLite implements Iterable<number> {
803
+ get [Symbol.toStringTag](): string
804
+ get size(): number
805
+
806
+ constructor(array: DynamicTypedArray<UnsignedTypedArrayConstructor>)
807
+
808
+ values(): IterableIterator<number>
809
+
810
+ has(value: number): boolean
811
+ add(value: number): void
812
+ delete(value: number): boolean
813
+
814
+ clear(): void
815
+ }
816
+ ```
817
+
818
+ #### ResizableTypedSparseSet
819
+ ```ts
820
+ class ResizableTypedSparseSet implements Iterable<number> {
821
+ get [Symbol.toStringTag](): string
822
+ get size(): number
823
+
824
+ constructor(array: ResizableTypedArray<UnsignedTypedArrayConstructor>)
825
+
826
+ values(): IterableIterator<number>
827
+
828
+ has(value: number): boolean
829
+ add(value: number): void
830
+ delete(value: number): boolean
831
+
832
+ clear(): void
833
+ }
834
+ ```
835
+
836
+ #### ResizableTypedSparseSetLite
837
+ ```ts
838
+ class ResizableTypedSparseSetLite implements Iterable<number> {
839
+ get [Symbol.toStringTag](): string
840
+ get size(): number
841
+
842
+ constructor(array: ResizableTypedArray<UnsignedTypedArrayConstructor>)
843
+
844
+ values(): IterableIterator<number>
845
+
846
+ has(value: number): boolean
847
+ add(value: number): void
848
+ delete(value: number): boolean
849
+
850
+ clear(): void
851
+ }
852
+ ```
853
+
854
+ #### ResizableTypedCleanSparseSet
855
+ ```ts
856
+ class ResizableTypedCleanSparseSet implements Iterable<number> {
857
+ get [Symbol.toStringTag](): string
858
+ get size(): number
859
+
860
+ constructor(array: ResizableTypedArray<UnsignedTypedArrayConstructor>)
861
+
862
+ values(): IterableIterator<number>
863
+
864
+ has(value: number): boolean
865
+ add(value: number): void
866
+ delete(value: number): boolean
867
+
868
+ clear(): void
869
+ }
870
+ ```
871
+
872
+ #### ResizableTypedCleanSparseSetLite
873
+ ```ts
874
+ class ResizableTypedCleanSparseSetLite implements Iterable<number> {
875
+ get [Symbol.toStringTag](): string
876
+ get size(): number
877
+
878
+ constructor(array: ResizableTypedArray<UnsignedTypedArrayConstructor>)
879
+
880
+ values(): IterableIterator<number>
881
+
882
+ has(value: number): boolean
883
+ add(value: number): void
884
+ delete(value: number): boolean
885
+
886
+ clear(): void
887
+ }
888
+ ```
889
+
890
+ ### Sparse Map
891
+ There are many implementations.
892
+ Based on benchmark results, `TypedCleanSparseMap` is the fastest,
893
+ followed by `TypedCleanSparseMapLite`.
894
+ If array resizing is required,
895
+ choose `DynamicTypedCleanSparseMapLite` or `ResizableTypedCleanSparseMapLite`.
896
+
897
+ #### SparseMap
898
+ ```ts
899
+ class SparseMap<T> {
900
+ get [Symbol.toStringTag](): string
901
+ get size(): number
902
+
903
+ readonly internalKeyArray: readonly number[]
904
+ readonly internalValueArray: T[]
905
+
906
+ entries(): IterableIterator<[key: number, value: T]>
907
+ keys(): IterableIterator<number>
908
+ values(): IterableIterator<T>
909
+
910
+ getInternalIndexOfKey(key: number): number | undefined
911
+
912
+ has(key: number): boolean
913
+ get(key: number): T | undefined
914
+ set(key: number, value: T): void
915
+ delete(key: number): boolean
916
+
917
+ clear(): void
918
+ }
919
+ ```
920
+
921
+ #### CleanSparseMap
922
+ ```ts
923
+ class CleanSparseMap<T> {
924
+ get [Symbol.toStringTag](): string
925
+ get size(): number
926
+
927
+ readonly internalKeyArray: readonly number[]
928
+ readonly internalValueArray: T[]
929
+
930
+ entries(): IterableIterator<[key: number, value: T]>
931
+ keys(): IterableIterator<number>
932
+ values(): IterableIterator<T>
933
+
934
+ getInternalIndexOfKey(key: number): number | undefined
935
+
936
+ has(key: number): boolean
937
+ get(key: number): T | undefined
938
+ set(key: number, value: T): void
939
+ delete(key: number): boolean
940
+
941
+ clear(): void
942
+ }
943
+ ```
944
+
945
+ #### TypedSparseMap
946
+ ```ts
947
+ class TypedSparseMap<
948
+ K extends UnsignedTypedArrayConstructor
949
+ , V extends TypedArrayConstructor
950
+ > {
951
+ get [Symbol.toStringTag](): string
952
+ get size(): number
953
+
954
+ readonly internalKeyArray: TypedArrayOfConstructor<K, ArrayBuffer>
955
+ readonly internalValueArray: TypedArrayOfConstructor<V, ArrayBuffer>
956
+
957
+ constructor(
958
+ keys: TypedArrayOfConstructor<K, ArrayBuffer>
959
+ , values: TypedArrayOfConstructor<V, ArrayBuffer>
960
+ )
961
+
962
+ entries(): IterableIterator<[key: number, value: number]>
963
+ keys(): IterableIterator<number>
964
+ values(): IterableIterator<number>
965
+
966
+ getInternalIndexOfKey(key: number): number | undefined
967
+
968
+ has(key: number): boolean
969
+ get(key: number): number | undefined
970
+ set(key: number, value: number): void
971
+ delete(key: number): boolean
972
+
973
+ clear(): void
974
+ }
975
+ ```
976
+
977
+ #### TypedSparseMapLite
978
+ ```ts
979
+ class TypedSparseMapLite<
980
+ K extends UnsignedTypedArrayConstructor
981
+ , V extends TypedArrayConstructor
982
+ > {
983
+ get [Symbol.toStringTag](): string
984
+ get size(): number
985
+
986
+ readonly internalKeyArray: TypedArrayOfConstructor<K, ArrayBuffer>
987
+ readonly internalValueArray: TypedArrayOfConstructor<V, ArrayBuffer>
988
+
989
+ constructor(
990
+ keys: TypedArrayOfConstructor<K, ArrayBuffer>
991
+ , values: TypedArrayOfConstructor<V, ArrayBuffer>
992
+ )
993
+
994
+ entries(): IterableIterator<[key: number, value: number]>
995
+ keys(): IterableIterator<number>
996
+ values(): IterableIterator<number>
997
+
998
+ getInternalIndexOfKey(key: number): number | undefined
999
+
1000
+ has(key: number): boolean
1001
+ get(key: number): number | undefined
1002
+ set(key: number, value: number): void
1003
+ delete(key: number): boolean
1004
+
1005
+ clear(): void
1006
+ }
1007
+ ```
1008
+
1009
+ #### TypedCleanSparseMap
1010
+ ```ts
1011
+ class TypedCleanSparseMap<
1012
+ K extends UnsignedTypedArrayConstructor
1013
+ , V extends TypedArrayConstructor
1014
+ > {
1015
+ get [Symbol.toStringTag](): string
1016
+ get size(): number
1017
+
1018
+ readonly internalKeyArray: TypedArrayOfConstructor<K, ArrayBuffer>
1019
+ readonly internalValueArray: TypedArrayOfConstructor<V, ArrayBuffer>
1020
+
1021
+ constructor(
1022
+ keys: TypedArrayOfConstructor<K, ArrayBuffer>
1023
+ , values: TypedArrayOfConstructor<V, ArrayBuffer>
1024
+ )
1025
+
1026
+ entries(): IterableIterator<[key: number, value: number]>
1027
+ keys(): IterableIterator<number>
1028
+ values(): IterableIterator<number>
1029
+
1030
+ getInternalIndexOfKey(key: number): number | undefined
1031
+
1032
+ has(key: number): boolean
1033
+ get(key: number): number | undefined
1034
+ set(key: number, value: number): void
1035
+ delete(key: number): boolean
1036
+
1037
+ clear(): void
1038
+ }
1039
+ ```
1040
+
1041
+ #### TypedCleanSparseMapLite
1042
+ ```ts
1043
+ class TypedCleanSparseMapLite<
1044
+ K extends UnsignedTypedArrayConstructor
1045
+ , V extends TypedArrayConstructor
1046
+ > {
1047
+ get [Symbol.toStringTag](): string
1048
+ get size(): number
1049
+
1050
+ readonly internalKeyArray: TypedArrayOfConstructor<K, ArrayBuffer>
1051
+ readonly internalValueArray: TypedArrayOfConstructor<V, ArrayBuffer>
1052
+
1053
+ constructor(
1054
+ keys: TypedArrayOfConstructor<K, ArrayBuffer>
1055
+ , values: TypedArrayOfConstructor<V, ArrayBuffer>
1056
+ )
1057
+
1058
+ entries(): IterableIterator<[key: number, value: number]>
1059
+ keys(): IterableIterator<number>
1060
+ values(): IterableIterator<number>
1061
+
1062
+ getInternalIndexOfKey(key: number): number | undefined
1063
+
1064
+ has(key: number): boolean
1065
+ get(key: number): number | undefined
1066
+ set(key: number, value: number): void
1067
+ delete(key: number): boolean
1068
+
1069
+ clear(): void
1070
+ }
1071
+ ```
1072
+
1073
+ #### DynamicTypedSparseMapLite
1074
+ ```ts
1075
+ class DynamicTypedSparseMapLite<
1076
+ K extends UnsignedTypedArrayConstructor
1077
+ , V extends TypedArrayConstructor
1078
+ > {
1079
+ get [Symbol.toStringTag](): string
1080
+ get size(): number
1081
+
1082
+ get internalKeyArray(): TypedArrayOfConstructor<K>
1083
+ get internalValueArray(): TypedArrayOfConstructor<V>
1084
+
1085
+ constructor(
1086
+ keys: DynamicTypedArray<K>
1087
+ , values: DynamicTypedArray<V>
1088
+ )
1089
+
1090
+ entries(): IterableIterator<[key: number, value: number]>
1091
+ keys(): IterableIterator<number>
1092
+ values(): IterableIterator<number>
1093
+
1094
+ getInternalIndexOfKey(key: number): number | undefined
1095
+
1096
+ has(key: number): boolean
1097
+ get(key: number): number | undefined
1098
+ set(key: number, value: number): void
1099
+ delete(key: number): boolean
1100
+
1101
+ clear(): void
1102
+ }
1103
+ ```
1104
+
1105
+ #### DynamicTypedCleanSparseMapLite
1106
+ ```ts
1107
+ class DynamicTypedCleanSparseMapLite<
1108
+ K extends UnsignedTypedArrayConstructor
1109
+ , V extends TypedArrayConstructor
1110
+ > {
1111
+ get [Symbol.toStringTag](): string
1112
+ get size(): number
1113
+
1114
+ get internalKeyArray(): TypedArrayOfConstructor<K>
1115
+ get internalValueArray(): TypedArrayOfConstructor<V>
1116
+
1117
+ constructor(
1118
+ keys: DynamicTypedArray<K>
1119
+ , values: DynamicTypedArray<V>
1120
+ )
1121
+
1122
+ entries(): IterableIterator<[key: number, value: number]>
1123
+ keys(): IterableIterator<number>
1124
+ values(): IterableIterator<number>
1125
+
1126
+ getInternalIndexOfKey(key: number): number | undefined
1127
+
1128
+ has(key: number): boolean
1129
+ get(key: number): number | undefined
1130
+ set(key: number, value: number): void
1131
+ delete(key: number): boolean
1132
+
1133
+ clear(): void
1134
+ }
1135
+ ```
1136
+
1137
+ #### ResizableTypedSparseMapLite
1138
+ ```ts
1139
+ class ResizableTypedSparseMapLite<
1140
+ K extends UnsignedTypedArrayConstructor
1141
+ , V extends TypedArrayConstructor
1142
+ > {
1143
+ get [Symbol.toStringTag](): string
1144
+ get size(): number
1145
+
1146
+ readonly internalKeyArray: TypedArrayOfConstructor<K>
1147
+ readonly internalValueArray: TypedArrayOfConstructor<V>
1148
+
1149
+ constructor(
1150
+ keys: ResizableTypedArray<K>
1151
+ , values: ResizableTypedArray<V>
1152
+ )
1153
+
1154
+ entries(): IterableIterator<[key: number, value: number]>
1155
+ keys(): IterableIterator<number>
1156
+ values(): IterableIterator<number>
1157
+
1158
+ getInternalIndexOfKey(key: number): number | undefined
1159
+
1160
+ has(key: number): boolean
1161
+ get(key: number): number | undefined
1162
+ set(key: number, value: number): void
1163
+ delete(key: number): boolean
1164
+
1165
+ clear(): void
1166
+ }
1167
+ ```
1168
+
1169
+ #### ResizableTypedCleanSparseMapLite
1170
+ ```ts
1171
+ class ResizableTypedCleanSparseMapLite<
1172
+ K extends UnsignedTypedArrayConstructor
1173
+ , V extends TypedArrayConstructor
1174
+ > {
1175
+ get [Symbol.toStringTag](): string
1176
+ get size(): number
1177
+
1178
+ readonly internalKeyArray: TypedArrayOfConstructor<K>
1179
+ readonly internalValueArray: TypedArrayOfConstructor<V>
1180
+
1181
+ constructor(
1182
+ keys: ResizableTypedArray<K>
1183
+ , values: ResizableTypedArray<V>
1184
+ )
1185
+
1186
+ entries(): IterableIterator<[key: number, value: number]>
1187
+ keys(): IterableIterator<number>
1188
+ values(): IterableIterator<number>
1189
+
1190
+ getInternalIndexOfKey(key: number): number | undefined
1191
+
1192
+ has(key: number): boolean
1193
+ get(key: number): number | undefined
1194
+ set(key: number, value: number): void
1195
+ delete(key: number): boolean
1196
+
1197
+ clear(): void
616
1198
  }
617
1199
  ```