@tspro/ts-utils-lib 1.12.0 → 1.14.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.14.0] - 2025-10-19
4
+ ### Added
5
+ - Map1, Map2 and Map3.getOrCreate() accepts value and creator.
6
+ - SignedIndexArray<ELEM>
7
+
8
+ ## Fixed
9
+ - Map1, Map2 and Map3.getOrCreate()
10
+
11
+ ## [1.13.0] - 2025-10-18
12
+ ### Added
13
+ - Added even more functionality to Map1, Map2 and Map3.
14
+
3
15
  ## [1.12.0] - 2025-10-15
4
16
  ### Added
5
17
  - Added more functionality to Map1, Map2 and Map3.
package/dist/index.d.mts CHANGED
@@ -446,43 +446,126 @@ declare class SmallIntCache<V> {
446
446
  clear(): void;
447
447
  }
448
448
 
449
+ /**
450
+ * An array-like structure for signed indexes, including negatives.
451
+ */
452
+ declare class SignedIndexArray<EL> {
453
+ private posEl;
454
+ private hasPos;
455
+ private negEl;
456
+ private hasNeg;
457
+ private elCount;
458
+ private static toNegIndex;
459
+ constructor();
460
+ constructor(arr: SignedIndexArray<EL>);
461
+ constructor(entries: Iterable<[number, EL]>);
462
+ get size(): number;
463
+ has(id: number): boolean;
464
+ set(id: number, el: EL): void;
465
+ get(id: number): EL | undefined;
466
+ getOrDefault(id: number, defaultValue: EL): EL;
467
+ getOrCreate(id: number, value: EL): EL;
468
+ getOrCreate(id: number, creator: () => EL): EL;
469
+ delete(id: number): boolean;
470
+ clear(): void;
471
+ forEach(callbackfn: (el: EL, id: number, arr: SignedIndexArray<EL>) => void, thisArg?: any): void;
472
+ indices(): IterableIterator<number>;
473
+ indicesArray(): number[];
474
+ values(): IterableIterator<EL>;
475
+ valuesArray(): EL[];
476
+ entries(): IterableIterator<[number, EL]>;
477
+ entriesArray(): [number, EL][];
478
+ [Symbol.iterator](): Generator<[number, EL], void, any>;
479
+ clone(): SignedIndexArray<EL>;
480
+ merge(other: SignedIndexArray<EL>, conflictResolver?: (oldValue: EL, newValue: EL, id: number) => EL): this;
481
+ some(fn: (el: EL, id: number) => boolean): boolean;
482
+ every(fn: (value: EL, key1: number) => boolean): boolean;
483
+ filter(fn: (value: EL, key1: number) => boolean): SignedIndexArray<EL>;
484
+ reduce(fn: (acc: EL, el: EL, id: number) => EL): EL;
485
+ reduce<R>(fn: (acc: R, el: EL, id: number) => R, init: R): R;
486
+ mapToArray<R>(fn: (value: EL, key1: number) => R): R[];
487
+ map<R = EL>(fn: (value: EL, key1: number) => R): SignedIndexArray<R>;
488
+ toString(): string;
489
+ }
490
+
449
491
  declare class Map1<KEY1, VALUE> {
450
492
  private map1;
451
493
  constructor();
494
+ constructor(map1: Map1<KEY1, VALUE>);
495
+ constructor(entries: Iterable<[KEY1, VALUE]>);
496
+ has(key1: KEY1): boolean;
452
497
  set(key1: KEY1, value: VALUE): VALUE;
453
498
  get(key1: KEY1): VALUE | undefined;
454
- has(key1: KEY1): boolean;
499
+ getOrDefault(key1: KEY1, defaultValue: VALUE): VALUE;
500
+ getOrCreate(key1: KEY1, value: VALUE): VALUE;
501
+ getOrCreate(key1: KEY1, creator: () => VALUE): VALUE;
455
502
  delete(key1: KEY1): boolean;
456
503
  clear(): void;
457
504
  get size(): number;
458
505
  forEach(callbackfn: (value: VALUE, key1: KEY1, map1: Map1<KEY1, VALUE>) => void, thisArg?: any): void;
459
506
  keys(): IterableIterator<KEY1>;
507
+ keysArray(): KEY1[];
460
508
  values(): IterableIterator<VALUE>;
509
+ valuesArray(): VALUE[];
461
510
  entries(): IterableIterator<[KEY1, VALUE]>;
511
+ entriesArray(): [KEY1, VALUE][];
462
512
  [Symbol.iterator](): Generator<[KEY1, VALUE], void, any>;
513
+ clone(): Map1<KEY1, VALUE>;
514
+ merge(other: Map1<KEY1, VALUE>, conflictResolver?: (oldValue: VALUE, newValue: VALUE, key1: KEY1) => VALUE): this;
515
+ some(fn: (value: VALUE, key1: KEY1) => boolean): boolean;
516
+ every(fn: (value: VALUE, key1: KEY1) => boolean): boolean;
517
+ filter(fn: (value: VALUE, key1: KEY1) => boolean): Map1<KEY1, VALUE>;
518
+ reduce<R>(fn: (acc: R, value: VALUE, key1: KEY1) => R, init: R): R;
519
+ mapEntries<R>(fn: (value: VALUE, key1: KEY1) => R): R[];
520
+ mapValues<R = VALUE>(fn: (value: VALUE, key1: KEY1) => R): Map1<KEY1, R>;
521
+ toMap(): Map<KEY1, VALUE>;
522
+ toString(): string;
463
523
  }
464
524
  declare class Map2<KEY1, KEY2, VALUE> {
465
525
  private map1;
466
526
  constructor();
527
+ constructor(map2: Map2<KEY1, KEY2, VALUE>);
528
+ constructor(entries: Iterable<[KEY1, KEY2, VALUE]>);
529
+ has(key1: KEY1, key2: KEY2): boolean;
467
530
  set(key1: KEY1, key2: KEY2, value: VALUE): VALUE;
468
531
  get(key1: KEY1, key2: KEY2): VALUE | undefined;
469
- has(key1: KEY1, key2: KEY2): boolean;
532
+ getOrDefault(key1: KEY1, key2: KEY2, defaultValue: VALUE): VALUE;
533
+ getOrCreate(key1: KEY1, key2: KEY2, value: VALUE): VALUE;
534
+ getOrCreate(key1: KEY1, key2: KEY2, creator: () => VALUE): VALUE;
470
535
  delete(key1: KEY1): boolean;
471
536
  delete(key1: KEY1, key2: KEY2): boolean;
472
537
  clear(): void;
473
538
  get size(): number;
474
539
  forEach(callbackfn: (value: VALUE, key1: KEY1, key2: KEY2, map2: Map2<KEY1, KEY2, VALUE>) => void, thisArg?: any): void;
475
540
  keys(): IterableIterator<[KEY1, KEY2]>;
541
+ keysArray(): [KEY1, KEY2][];
476
542
  values(): IterableIterator<VALUE>;
543
+ valuesArray(): VALUE[];
477
544
  entries(): IterableIterator<[KEY1, KEY2, VALUE]>;
545
+ entriesArray(): [KEY1, KEY2, VALUE][];
478
546
  [Symbol.iterator](): Generator<[KEY1, KEY2, VALUE], void, any>;
547
+ clone(): Map2<KEY1, KEY2, VALUE>;
548
+ merge(other: Map2<KEY1, KEY2, VALUE>, conflictResolver?: (oldValue: VALUE, newValue: VALUE, key1: KEY1, key2: KEY2) => VALUE): this;
549
+ some(fn: (value: VALUE, key1: KEY1, key2: KEY2) => boolean): boolean;
550
+ every(fn: (value: VALUE, key1: KEY1, key2: KEY2) => boolean): boolean;
551
+ filter(fn: (value: VALUE, key1: KEY1, key2: KEY2) => boolean): Map2<KEY1, KEY2, VALUE>;
552
+ reduce<R>(fn: (acc: R, value: VALUE, key1: KEY1, key2: KEY2) => R, init: R): R;
553
+ mapEntries<R>(fn: (value: VALUE, key1: KEY1, key2: KEY2) => R): R[];
554
+ mapValues<R = VALUE>(fn: (value: VALUE, key1: KEY1, key2: KEY2) => R): Map2<KEY1, KEY2, R>;
555
+ toMap(): Map<[KEY1, KEY2], VALUE>;
556
+ toString(): string;
479
557
  }
480
558
  declare class Map3<KEY1, KEY2, KEY3, VALUE> {
481
559
  private map1;
482
560
  constructor();
561
+ constructor(entries: Iterable<[KEY1, KEY2, KEY3, VALUE]>);
562
+ constructor(map3: Map3<KEY1, KEY2, KEY3, VALUE>);
563
+ has(key1: KEY1, key2: KEY2, key3: KEY3): boolean;
483
564
  set(key1: KEY1, key2: KEY2, key3: KEY3, value: VALUE): VALUE;
484
565
  get(key1: KEY1, key2: KEY2, key3: KEY3): VALUE | undefined;
485
- has(key1: KEY1, key2: KEY2, key3: KEY3): boolean;
566
+ getOrDefault(key1: KEY1, key2: KEY2, key3: KEY3, defaultValue: VALUE): VALUE;
567
+ getOrCreate(key1: KEY1, key2: KEY2, key3: KEY3, value: VALUE): VALUE;
568
+ getOrCreate(key1: KEY1, key2: KEY2, key3: KEY3, creator: () => VALUE): VALUE;
486
569
  delete(key1: KEY1): boolean;
487
570
  delete(key1: KEY1, key2: KEY2): boolean;
488
571
  delete(key1: KEY1, key2: KEY2, key3: KEY3): boolean;
@@ -490,9 +573,22 @@ declare class Map3<KEY1, KEY2, KEY3, VALUE> {
490
573
  get size(): number;
491
574
  forEach(callbackfn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3, map2: Map3<KEY1, KEY2, KEY3, VALUE>) => void, thisArg?: any): void;
492
575
  keys(): IterableIterator<[KEY1, KEY2, KEY3]>;
576
+ keysArray(): [KEY1, KEY2, KEY3][];
493
577
  values(): IterableIterator<VALUE>;
578
+ valuesArray(): VALUE[];
494
579
  entries(): IterableIterator<[KEY1, KEY2, KEY3, VALUE]>;
580
+ entriesArray(): [KEY1, KEY2, KEY3, VALUE][];
495
581
  [Symbol.iterator](): Generator<[KEY1, KEY2, KEY3, VALUE], void, any>;
582
+ clone(): Map3<KEY1, KEY2, KEY3, VALUE>;
583
+ merge(other: Map3<KEY1, KEY2, KEY3, VALUE>, conflictResolver?: (oldValue: VALUE, newValue: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => VALUE): this;
584
+ some(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => boolean): boolean;
585
+ every(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => boolean): boolean;
586
+ filter(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => boolean): Map3<KEY1, KEY2, KEY3, VALUE>;
587
+ reduce<R>(fn: (acc: R, value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => R, init: R): R;
588
+ mapEntries<R>(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => R): R[];
589
+ mapValues<R = VALUE>(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => R): Map3<KEY1, KEY2, KEY3, R>;
590
+ toMap(): Map<[KEY1, KEY2, KEY3], VALUE>;
591
+ toString(): string;
496
592
  }
497
593
 
498
- export { Assert, Cookies, Device, LRUCache, Map1, Map2, Map3, SmallIntCache, Stack, index as Utils, Vec2 };
594
+ export { Assert, Cookies, Device, LRUCache, Map1, Map2, Map3, SignedIndexArray, SmallIntCache, Stack, index as Utils, Vec2 };
package/dist/index.d.ts CHANGED
@@ -446,43 +446,126 @@ declare class SmallIntCache<V> {
446
446
  clear(): void;
447
447
  }
448
448
 
449
+ /**
450
+ * An array-like structure for signed indexes, including negatives.
451
+ */
452
+ declare class SignedIndexArray<EL> {
453
+ private posEl;
454
+ private hasPos;
455
+ private negEl;
456
+ private hasNeg;
457
+ private elCount;
458
+ private static toNegIndex;
459
+ constructor();
460
+ constructor(arr: SignedIndexArray<EL>);
461
+ constructor(entries: Iterable<[number, EL]>);
462
+ get size(): number;
463
+ has(id: number): boolean;
464
+ set(id: number, el: EL): void;
465
+ get(id: number): EL | undefined;
466
+ getOrDefault(id: number, defaultValue: EL): EL;
467
+ getOrCreate(id: number, value: EL): EL;
468
+ getOrCreate(id: number, creator: () => EL): EL;
469
+ delete(id: number): boolean;
470
+ clear(): void;
471
+ forEach(callbackfn: (el: EL, id: number, arr: SignedIndexArray<EL>) => void, thisArg?: any): void;
472
+ indices(): IterableIterator<number>;
473
+ indicesArray(): number[];
474
+ values(): IterableIterator<EL>;
475
+ valuesArray(): EL[];
476
+ entries(): IterableIterator<[number, EL]>;
477
+ entriesArray(): [number, EL][];
478
+ [Symbol.iterator](): Generator<[number, EL], void, any>;
479
+ clone(): SignedIndexArray<EL>;
480
+ merge(other: SignedIndexArray<EL>, conflictResolver?: (oldValue: EL, newValue: EL, id: number) => EL): this;
481
+ some(fn: (el: EL, id: number) => boolean): boolean;
482
+ every(fn: (value: EL, key1: number) => boolean): boolean;
483
+ filter(fn: (value: EL, key1: number) => boolean): SignedIndexArray<EL>;
484
+ reduce(fn: (acc: EL, el: EL, id: number) => EL): EL;
485
+ reduce<R>(fn: (acc: R, el: EL, id: number) => R, init: R): R;
486
+ mapToArray<R>(fn: (value: EL, key1: number) => R): R[];
487
+ map<R = EL>(fn: (value: EL, key1: number) => R): SignedIndexArray<R>;
488
+ toString(): string;
489
+ }
490
+
449
491
  declare class Map1<KEY1, VALUE> {
450
492
  private map1;
451
493
  constructor();
494
+ constructor(map1: Map1<KEY1, VALUE>);
495
+ constructor(entries: Iterable<[KEY1, VALUE]>);
496
+ has(key1: KEY1): boolean;
452
497
  set(key1: KEY1, value: VALUE): VALUE;
453
498
  get(key1: KEY1): VALUE | undefined;
454
- has(key1: KEY1): boolean;
499
+ getOrDefault(key1: KEY1, defaultValue: VALUE): VALUE;
500
+ getOrCreate(key1: KEY1, value: VALUE): VALUE;
501
+ getOrCreate(key1: KEY1, creator: () => VALUE): VALUE;
455
502
  delete(key1: KEY1): boolean;
456
503
  clear(): void;
457
504
  get size(): number;
458
505
  forEach(callbackfn: (value: VALUE, key1: KEY1, map1: Map1<KEY1, VALUE>) => void, thisArg?: any): void;
459
506
  keys(): IterableIterator<KEY1>;
507
+ keysArray(): KEY1[];
460
508
  values(): IterableIterator<VALUE>;
509
+ valuesArray(): VALUE[];
461
510
  entries(): IterableIterator<[KEY1, VALUE]>;
511
+ entriesArray(): [KEY1, VALUE][];
462
512
  [Symbol.iterator](): Generator<[KEY1, VALUE], void, any>;
513
+ clone(): Map1<KEY1, VALUE>;
514
+ merge(other: Map1<KEY1, VALUE>, conflictResolver?: (oldValue: VALUE, newValue: VALUE, key1: KEY1) => VALUE): this;
515
+ some(fn: (value: VALUE, key1: KEY1) => boolean): boolean;
516
+ every(fn: (value: VALUE, key1: KEY1) => boolean): boolean;
517
+ filter(fn: (value: VALUE, key1: KEY1) => boolean): Map1<KEY1, VALUE>;
518
+ reduce<R>(fn: (acc: R, value: VALUE, key1: KEY1) => R, init: R): R;
519
+ mapEntries<R>(fn: (value: VALUE, key1: KEY1) => R): R[];
520
+ mapValues<R = VALUE>(fn: (value: VALUE, key1: KEY1) => R): Map1<KEY1, R>;
521
+ toMap(): Map<KEY1, VALUE>;
522
+ toString(): string;
463
523
  }
464
524
  declare class Map2<KEY1, KEY2, VALUE> {
465
525
  private map1;
466
526
  constructor();
527
+ constructor(map2: Map2<KEY1, KEY2, VALUE>);
528
+ constructor(entries: Iterable<[KEY1, KEY2, VALUE]>);
529
+ has(key1: KEY1, key2: KEY2): boolean;
467
530
  set(key1: KEY1, key2: KEY2, value: VALUE): VALUE;
468
531
  get(key1: KEY1, key2: KEY2): VALUE | undefined;
469
- has(key1: KEY1, key2: KEY2): boolean;
532
+ getOrDefault(key1: KEY1, key2: KEY2, defaultValue: VALUE): VALUE;
533
+ getOrCreate(key1: KEY1, key2: KEY2, value: VALUE): VALUE;
534
+ getOrCreate(key1: KEY1, key2: KEY2, creator: () => VALUE): VALUE;
470
535
  delete(key1: KEY1): boolean;
471
536
  delete(key1: KEY1, key2: KEY2): boolean;
472
537
  clear(): void;
473
538
  get size(): number;
474
539
  forEach(callbackfn: (value: VALUE, key1: KEY1, key2: KEY2, map2: Map2<KEY1, KEY2, VALUE>) => void, thisArg?: any): void;
475
540
  keys(): IterableIterator<[KEY1, KEY2]>;
541
+ keysArray(): [KEY1, KEY2][];
476
542
  values(): IterableIterator<VALUE>;
543
+ valuesArray(): VALUE[];
477
544
  entries(): IterableIterator<[KEY1, KEY2, VALUE]>;
545
+ entriesArray(): [KEY1, KEY2, VALUE][];
478
546
  [Symbol.iterator](): Generator<[KEY1, KEY2, VALUE], void, any>;
547
+ clone(): Map2<KEY1, KEY2, VALUE>;
548
+ merge(other: Map2<KEY1, KEY2, VALUE>, conflictResolver?: (oldValue: VALUE, newValue: VALUE, key1: KEY1, key2: KEY2) => VALUE): this;
549
+ some(fn: (value: VALUE, key1: KEY1, key2: KEY2) => boolean): boolean;
550
+ every(fn: (value: VALUE, key1: KEY1, key2: KEY2) => boolean): boolean;
551
+ filter(fn: (value: VALUE, key1: KEY1, key2: KEY2) => boolean): Map2<KEY1, KEY2, VALUE>;
552
+ reduce<R>(fn: (acc: R, value: VALUE, key1: KEY1, key2: KEY2) => R, init: R): R;
553
+ mapEntries<R>(fn: (value: VALUE, key1: KEY1, key2: KEY2) => R): R[];
554
+ mapValues<R = VALUE>(fn: (value: VALUE, key1: KEY1, key2: KEY2) => R): Map2<KEY1, KEY2, R>;
555
+ toMap(): Map<[KEY1, KEY2], VALUE>;
556
+ toString(): string;
479
557
  }
480
558
  declare class Map3<KEY1, KEY2, KEY3, VALUE> {
481
559
  private map1;
482
560
  constructor();
561
+ constructor(entries: Iterable<[KEY1, KEY2, KEY3, VALUE]>);
562
+ constructor(map3: Map3<KEY1, KEY2, KEY3, VALUE>);
563
+ has(key1: KEY1, key2: KEY2, key3: KEY3): boolean;
483
564
  set(key1: KEY1, key2: KEY2, key3: KEY3, value: VALUE): VALUE;
484
565
  get(key1: KEY1, key2: KEY2, key3: KEY3): VALUE | undefined;
485
- has(key1: KEY1, key2: KEY2, key3: KEY3): boolean;
566
+ getOrDefault(key1: KEY1, key2: KEY2, key3: KEY3, defaultValue: VALUE): VALUE;
567
+ getOrCreate(key1: KEY1, key2: KEY2, key3: KEY3, value: VALUE): VALUE;
568
+ getOrCreate(key1: KEY1, key2: KEY2, key3: KEY3, creator: () => VALUE): VALUE;
486
569
  delete(key1: KEY1): boolean;
487
570
  delete(key1: KEY1, key2: KEY2): boolean;
488
571
  delete(key1: KEY1, key2: KEY2, key3: KEY3): boolean;
@@ -490,9 +573,22 @@ declare class Map3<KEY1, KEY2, KEY3, VALUE> {
490
573
  get size(): number;
491
574
  forEach(callbackfn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3, map2: Map3<KEY1, KEY2, KEY3, VALUE>) => void, thisArg?: any): void;
492
575
  keys(): IterableIterator<[KEY1, KEY2, KEY3]>;
576
+ keysArray(): [KEY1, KEY2, KEY3][];
493
577
  values(): IterableIterator<VALUE>;
578
+ valuesArray(): VALUE[];
494
579
  entries(): IterableIterator<[KEY1, KEY2, KEY3, VALUE]>;
580
+ entriesArray(): [KEY1, KEY2, KEY3, VALUE][];
495
581
  [Symbol.iterator](): Generator<[KEY1, KEY2, KEY3, VALUE], void, any>;
582
+ clone(): Map3<KEY1, KEY2, KEY3, VALUE>;
583
+ merge(other: Map3<KEY1, KEY2, KEY3, VALUE>, conflictResolver?: (oldValue: VALUE, newValue: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => VALUE): this;
584
+ some(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => boolean): boolean;
585
+ every(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => boolean): boolean;
586
+ filter(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => boolean): Map3<KEY1, KEY2, KEY3, VALUE>;
587
+ reduce<R>(fn: (acc: R, value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => R, init: R): R;
588
+ mapEntries<R>(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => R): R[];
589
+ mapValues<R = VALUE>(fn: (value: VALUE, key1: KEY1, key2: KEY2, key3: KEY3) => R): Map3<KEY1, KEY2, KEY3, R>;
590
+ toMap(): Map<[KEY1, KEY2, KEY3], VALUE>;
591
+ toString(): string;
496
592
  }
497
593
 
498
- export { Assert, Cookies, Device, LRUCache, Map1, Map2, Map3, SmallIntCache, Stack, index as Utils, Vec2 };
594
+ export { Assert, Cookies, Device, LRUCache, Map1, Map2, Map3, SignedIndexArray, SmallIntCache, Stack, index as Utils, Vec2 };