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