@tspro/ts-utils-lib 1.14.0 → 1.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.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /* TsUtilsLib v1.14.0 | (c) 2023 PahkaSoft | Licensed under the MIT License */
1
+ /* TsUtilsLib v1.15.0 | (c) 2023 PahkaSoft | Licensed under the MIT License */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __export = (target, all) => {
@@ -37,136 +37,175 @@ __export(arr_exports, {
37
37
  toArray: () => toArray
38
38
  });
39
39
 
40
- // src/utils/math/index.ts
41
- var math_exports = {};
42
- __export(math_exports, {
43
- avg: () => avg,
44
- calcNormal: () => calcNormal,
45
- clamp: () => clamp,
46
- cmp: () => cmp,
47
- interpolateCoord: () => interpolateCoord,
48
- interpolateY: () => interpolateY,
40
+ // src/utils/is/index.ts
41
+ var is_exports = {};
42
+ __export(is_exports, {
43
+ isArray: () => isArray,
44
+ isArrayOrUndefined: () => isArrayOrUndefined,
45
+ isBoolean: () => isBoolean,
46
+ isBooleanOrUndefined: () => isBooleanOrUndefined,
47
+ isEmptyArray: () => isEmptyArray,
48
+ isEmptyArrayOrUndefined: () => isEmptyArrayOrUndefined,
49
+ isEmptyString: () => isEmptyString,
50
+ isEmptyStringOrUndefined: () => isEmptyStringOrUndefined,
51
+ isEnumValue: () => isEnumValue,
52
+ isEnumValueOrUndefined: () => isEnumValueOrUndefined,
53
+ isFinite: () => isFinite2,
54
+ isFunction: () => isFunction,
55
+ isFunctionOrUndefined: () => isFunctionOrUndefined,
56
+ isInfinity: () => isInfinity,
49
57
  isInteger: () => isInteger,
50
- linearToDecibels: () => linearToDecibels,
51
- mod: () => mod,
52
- romanize: () => romanize,
53
- sum: () => sum,
54
- toOrdinalNumber: () => toOrdinalNumber
58
+ isIntegerBetween: () => isIntegerBetween,
59
+ isIntegerEq: () => isIntegerEq,
60
+ isIntegerGt: () => isIntegerGt,
61
+ isIntegerGte: () => isIntegerGte,
62
+ isIntegerLt: () => isIntegerLt,
63
+ isIntegerLte: () => isIntegerLte,
64
+ isIntegerOrUndefined: () => isIntegerOrUndefined,
65
+ isNaNValue: () => isNaNValue,
66
+ isNegInfinity: () => isNegInfinity,
67
+ isNonEmptyArray: () => isNonEmptyArray,
68
+ isNonEmptyArrayOrUndefined: () => isNonEmptyArrayOrUndefined,
69
+ isNonEmptyString: () => isNonEmptyString,
70
+ isNonEmptyStringOrUndefined: () => isNonEmptyStringOrUndefined,
71
+ isNull: () => isNull,
72
+ isNullish: () => isNullish,
73
+ isNumber: () => isNumber,
74
+ isNumberOrUndefined: () => isNumberOrUndefined,
75
+ isObject: () => isObject,
76
+ isObjectOrUndefined: () => isObjectOrUndefined,
77
+ isPosInfinity: () => isPosInfinity,
78
+ isString: () => isString,
79
+ isStringOrUndefined: () => isStringOrUndefined,
80
+ isUndefined: () => isUndefined
81
+ });
82
+
83
+ // src/utils/enum/index.ts
84
+ var enum_exports = {};
85
+ __export(enum_exports, {
86
+ getEnumValues: () => getEnumValues
55
87
  });
88
+ function getEnumValues(e) {
89
+ return Object.keys(e).filter((key) => Number.isNaN(Number(key))).map((key) => e[key]);
90
+ }
91
+
92
+ // src/utils/is/index.ts
93
+ function isUndefined(value) {
94
+ return value === void 0;
95
+ }
96
+ function isNull(value) {
97
+ return value === null;
98
+ }
99
+ function isNullish(value) {
100
+ return value === void 0 || value === null;
101
+ }
102
+ function isObject(value) {
103
+ return typeof value === "object" && value !== null && !isArray(value);
104
+ }
105
+ function isObjectOrUndefined(value) {
106
+ return value === void 0 || isObject(value);
107
+ }
108
+ function isArray(a) {
109
+ return !!a && Object.prototype.toString.call(a) === "[object Array]";
110
+ }
111
+ function isArrayOrUndefined(value) {
112
+ return value === void 0 || isArray(value);
113
+ }
114
+ function isEmptyArray(a) {
115
+ return isArray(a) && a.length === 0;
116
+ }
117
+ function isNonEmptyArray(a) {
118
+ return isArray(a) && a.length > 0;
119
+ }
120
+ function isEmptyArrayOrUndefined(a) {
121
+ return isArray(a) && a.length === 0 || a === void 0;
122
+ }
123
+ function isNonEmptyArrayOrUndefined(a) {
124
+ return isArray(a) && a.length > 0 || a === void 0;
125
+ }
126
+ function isString(value) {
127
+ return typeof value === "string";
128
+ }
129
+ function isEmptyString(value) {
130
+ return typeof value === "string" && value.length === 0;
131
+ }
132
+ function isNonEmptyString(value) {
133
+ return typeof value === "string" && value.length > 0;
134
+ }
135
+ function isStringOrUndefined(value) {
136
+ return value === void 0 || typeof value === "string";
137
+ }
138
+ function isEmptyStringOrUndefined(value) {
139
+ return typeof value === "string" && value.length === 0 || value === void 0;
140
+ }
141
+ function isNonEmptyStringOrUndefined(value) {
142
+ return typeof value === "string" && value.length > 0 || value === void 0;
143
+ }
144
+ function isBoolean(value) {
145
+ return typeof value === "boolean";
146
+ }
147
+ function isBooleanOrUndefined(value) {
148
+ return value === void 0 || typeof value === "boolean";
149
+ }
150
+ function isFunction(value) {
151
+ return typeof value === "function";
152
+ }
153
+ function isFunctionOrUndefined(value) {
154
+ return value === void 0 || typeof value === "function";
155
+ }
156
+ function isEnumValue(value, enumObj, name = "value") {
157
+ return getEnumValues(enumObj).some((v) => v === value);
158
+ }
159
+ function isEnumValueOrUndefined(value, enumObj, name = "value") {
160
+ return value === void 0 || getEnumValues(enumObj).some((v) => v === value);
161
+ }
162
+ function isNumber(value) {
163
+ return typeof value === "number";
164
+ }
165
+ function isNumberOrUndefined(value) {
166
+ return typeof value === "number" || value === void 0;
167
+ }
168
+ function isFinite2(value) {
169
+ return typeof value === "number" && Number.isFinite(value);
170
+ }
56
171
  function isInteger(n) {
57
- return typeof n === "number" && isFinite(n) && n === Math.trunc(n);
172
+ return typeof n === "number" && isFinite2(n) && n === Math.trunc(n);
58
173
  }
59
- function linearToDecibels(linearVolume) {
60
- if (!isFinite(linearVolume)) {
61
- throw new Error("linearToDecibel: Invalid linearVolume = " + linearVolume);
62
- } else if (linearVolume <= 0) {
63
- return -Infinity;
64
- } else {
65
- return 20 * Math.log10(linearVolume);
66
- }
174
+ function isIntegerOrUndefined(n) {
175
+ return typeof n === "number" && isFinite2(n) && n === Math.trunc(n) || n === void 0;
67
176
  }
68
- function mod(m, n) {
69
- return (m % n + n) % n;
177
+ function isIntegerEq(value, compareTo) {
178
+ return isInteger(value) && value === compareTo;
70
179
  }
71
- function romanize(n) {
72
- if (!isInteger(n) || n < 0) {
73
- throw new Error("romanize: Invalid n = " + n);
74
- }
75
- var digits = String(+n).split("");
76
- var key = [
77
- "",
78
- "C",
79
- "CC",
80
- "CCC",
81
- "CD",
82
- "D",
83
- "DC",
84
- "DCC",
85
- "DCCC",
86
- "CM",
87
- "",
88
- "X",
89
- "XX",
90
- "XXX",
91
- "XL",
92
- "L",
93
- "LX",
94
- "LXX",
95
- "LXXX",
96
- "XC",
97
- "",
98
- "I",
99
- "II",
100
- "III",
101
- "IV",
102
- "V",
103
- "VI",
104
- "VII",
105
- "VIII",
106
- "IX"
107
- ];
108
- var roman = "", i = 3;
109
- while (i--) roman = (key[+digits.pop() + i * 10] || "") + roman;
110
- return Array(+digits.join("") + 1).join("M") + roman;
180
+ function isIntegerGt(value, compareTo) {
181
+ return isInteger(value) && value > compareTo;
111
182
  }
112
- function toOrdinalNumber(n) {
113
- if (!isInteger(n)) {
114
- throw new Error("toOrdinalNumber: Invalid n = " + n);
115
- }
116
- const nStr = n.toString();
117
- const lastDigit = Number(nStr.charAt(nStr.length - 1));
118
- if (n === 1 || n >= 20 && lastDigit === 1) {
119
- return nStr + "st";
120
- } else if (n === 2 || n >= 20 && lastDigit === 2) {
121
- return nStr + "nd";
122
- } else if (n === 3 || n >= 20 && lastDigit === 3) {
123
- return nStr + "rd";
124
- } else {
125
- return nStr + "th";
126
- }
183
+ function isIntegerGte(value, compareTo) {
184
+ return isInteger(value) && value >= compareTo;
127
185
  }
128
- function interpolateCoord(startX, startY, endX, endY, t) {
129
- return {
130
- x: startX + (endX - startX) * t,
131
- y: startY + (endY - startY) * t
132
- };
186
+ function isIntegerLt(value, compareTo) {
187
+ return isInteger(value) && value < compareTo;
133
188
  }
134
- function interpolateY(startX, startY, endX, endY, x) {
135
- let t = (x - startX) / (endX - startX);
136
- return startY + (endY - startY) * t;
189
+ function isIntegerLte(value, compareTo) {
190
+ return isInteger(value) && value <= compareTo;
137
191
  }
138
- function clamp(num, min, max) {
139
- return Math.min(Math.max(num, min), max);
192
+ function isIntegerBetween(value, min, max) {
193
+ return isInteger(value) && value >= min && value <= max;
140
194
  }
141
- function calcNormal(x1, y1, x2, y2) {
142
- let dx = x2 - x1;
143
- let dy = y2 - y1;
144
- let nx = -dy;
145
- let ny = dx;
146
- let len = Math.sqrt(nx * nx + ny * ny);
147
- if (len > 0) {
148
- nx /= len;
149
- ny /= len;
150
- } else {
151
- nx = 0;
152
- ny = 1;
153
- }
154
- return { nx, ny };
195
+ function isNaNValue(value) {
196
+ return typeof value === "number" && Number.isNaN(value);
155
197
  }
156
- function sum(arr) {
157
- return arr.reduce((prev, cur) => cur + prev, 0);
198
+ function isInfinity(value) {
199
+ return typeof value === "number" && Math.abs(value) === Infinity;
158
200
  }
159
- function avg(...values) {
160
- return sum(values) / values.length;
201
+ function isPosInfinity(value) {
202
+ return typeof value === "number" && value === Infinity;
161
203
  }
162
- function cmp(a, b) {
163
- return a < b ? -1 : a > b ? 1 : 0;
204
+ function isNegInfinity(value) {
205
+ return typeof value === "number" && value === -Infinity;
164
206
  }
165
207
 
166
208
  // src/utils/arr/index.ts
167
- function isArray(a) {
168
- return !!a && Object.prototype.toString.call(a) === "[object Array]";
169
- }
170
209
  function toArray(a) {
171
210
  return isArray(a) ? a : [a];
172
211
  }
@@ -253,15 +292,6 @@ __export(dom_exports, {
253
292
  styleLayoutChanged: () => styleLayoutChanged
254
293
  });
255
294
 
256
- // src/utils/enum/index.ts
257
- var enum_exports = {};
258
- __export(enum_exports, {
259
- getEnumValues: () => getEnumValues
260
- });
261
- function getEnumValues(e) {
262
- return Object.keys(e).filter((key) => Number.isNaN(Number(key))).map((key) => e[key]);
263
- }
264
-
265
295
  // src/modules/assert.ts
266
296
  var Assert;
267
297
  ((Assert2) => {
@@ -681,172 +711,139 @@ function getCanvasTextWidth(text, font) {
681
711
  return ctx.measureText(text).width;
682
712
  }
683
713
 
684
- // src/utils/is/index.ts
685
- var is_exports = {};
686
- __export(is_exports, {
687
- isArray: () => isArray2,
688
- isArrayOrUndefined: () => isArrayOrUndefined,
689
- isBoolean: () => isBoolean,
690
- isBooleanOrUndefined: () => isBooleanOrUndefined,
691
- isEmptyArray: () => isEmptyArray,
692
- isEmptyArrayOrUndefined: () => isEmptyArrayOrUndefined,
693
- isEmptyString: () => isEmptyString,
694
- isEmptyStringOrUndefined: () => isEmptyStringOrUndefined,
695
- isEnumValue: () => isEnumValue,
696
- isEnumValueOrUndefined: () => isEnumValueOrUndefined,
697
- isFinite: () => isFinite2,
698
- isFunction: () => isFunction,
699
- isFunctionOrUndefined: () => isFunctionOrUndefined,
700
- isInfinity: () => isInfinity,
701
- isInteger: () => isInteger2,
702
- isIntegerBetween: () => isIntegerBetween,
703
- isIntegerEq: () => isIntegerEq,
704
- isIntegerGt: () => isIntegerGt,
705
- isIntegerGte: () => isIntegerGte,
706
- isIntegerLt: () => isIntegerLt,
707
- isIntegerLte: () => isIntegerLte,
708
- isIntegerOrUndefined: () => isIntegerOrUndefined,
709
- isNaNValue: () => isNaNValue,
710
- isNegInfinity: () => isNegInfinity,
711
- isNonEmptyArray: () => isNonEmptyArray,
712
- isNonEmptyArrayOrUndefined: () => isNonEmptyArrayOrUndefined,
713
- isNonEmptyString: () => isNonEmptyString,
714
- isNonEmptyStringOrUndefined: () => isNonEmptyStringOrUndefined,
715
- isNull: () => isNull,
716
- isNullish: () => isNullish,
717
- isNumber: () => isNumber,
718
- isNumberOrUndefined: () => isNumberOrUndefined,
719
- isObject: () => isObject,
720
- isObjectOrUndefined: () => isObjectOrUndefined,
721
- isPosInfinity: () => isPosInfinity,
722
- isString: () => isString,
723
- isStringOrUndefined: () => isStringOrUndefined,
724
- isUndefined: () => isUndefined
714
+ // src/utils/map/index.ts
715
+ var map_exports = {};
716
+ __export(map_exports, {
717
+ getMapKeys: () => getMapKeys
725
718
  });
726
- function isUndefined(value) {
727
- return value === void 0;
728
- }
729
- function isNull(value) {
730
- return value === null;
731
- }
732
- function isNullish(value) {
733
- return value === void 0 || value === null;
734
- }
735
- function isObject(value) {
736
- return typeof value === "object" && value !== null && !isArray2(value);
737
- }
738
- function isObjectOrUndefined(value) {
739
- return value === void 0 || isObject(value);
740
- }
741
- function isArray2(a) {
742
- return !!a && Object.prototype.toString.call(a) === "[object Array]";
743
- }
744
- function isArrayOrUndefined(value) {
745
- return value === void 0 || isArray2(value);
746
- }
747
- function isEmptyArray(a) {
748
- return isArray2(a) && a.length === 0;
749
- }
750
- function isNonEmptyArray(a) {
751
- return isArray2(a) && a.length > 0;
752
- }
753
- function isEmptyArrayOrUndefined(a) {
754
- return isArray2(a) && a.length === 0 || a === void 0;
755
- }
756
- function isNonEmptyArrayOrUndefined(a) {
757
- return isArray2(a) && a.length > 0 || a === void 0;
758
- }
759
- function isString(value) {
760
- return typeof value === "string";
761
- }
762
- function isEmptyString(value) {
763
- return typeof value === "string" && value.length === 0;
764
- }
765
- function isNonEmptyString(value) {
766
- return typeof value === "string" && value.length > 0;
767
- }
768
- function isStringOrUndefined(value) {
769
- return value === void 0 || typeof value === "string";
770
- }
771
- function isEmptyStringOrUndefined(value) {
772
- return typeof value === "string" && value.length === 0 || value === void 0;
773
- }
774
- function isNonEmptyStringOrUndefined(value) {
775
- return typeof value === "string" && value.length > 0 || value === void 0;
776
- }
777
- function isBoolean(value) {
778
- return typeof value === "boolean";
779
- }
780
- function isBooleanOrUndefined(value) {
781
- return value === void 0 || typeof value === "boolean";
782
- }
783
- function isFunction(value) {
784
- return typeof value === "function";
785
- }
786
- function isFunctionOrUndefined(value) {
787
- return value === void 0 || typeof value === "function";
788
- }
789
- function isEnumValue(value, enumObj, name = "value") {
790
- return getEnumValues(enumObj).some((v) => v === value);
791
- }
792
- function isEnumValueOrUndefined(value, enumObj, name = "value") {
793
- return value === void 0 || getEnumValues(enumObj).some((v) => v === value);
794
- }
795
- function isNumber(value) {
796
- return typeof value === "number";
797
- }
798
- function isNumberOrUndefined(value) {
799
- return typeof value === "number" || value === void 0;
800
- }
801
- function isFinite2(value) {
802
- return typeof value === "number" && Number.isFinite(value);
803
- }
804
- function isInteger2(n) {
805
- return typeof n === "number" && isFinite2(n) && n === Math.trunc(n);
806
- }
807
- function isIntegerOrUndefined(n) {
808
- return typeof n === "number" && isFinite2(n) && n === Math.trunc(n) || n === void 0;
719
+ function getMapKeys(map) {
720
+ let keys = [];
721
+ map.forEach((value, key) => keys.push(key));
722
+ return keys;
809
723
  }
810
- function isIntegerEq(value, compareTo) {
811
- return isInteger2(value) && value === compareTo;
724
+
725
+ // src/utils/math/index.ts
726
+ var math_exports = {};
727
+ __export(math_exports, {
728
+ avg: () => avg,
729
+ calcNormal: () => calcNormal,
730
+ clamp: () => clamp,
731
+ cmp: () => cmp,
732
+ interpolateCoord: () => interpolateCoord,
733
+ interpolateY: () => interpolateY,
734
+ isInteger: () => isInteger,
735
+ isNumber: () => isNumber,
736
+ linearToDecibels: () => linearToDecibels,
737
+ mod: () => mod,
738
+ romanize: () => romanize,
739
+ sum: () => sum,
740
+ toOrdinalNumber: () => toOrdinalNumber
741
+ });
742
+ function linearToDecibels(linearVolume) {
743
+ if (!isFinite(linearVolume)) {
744
+ throw new Error("linearToDecibel: Invalid linearVolume = " + linearVolume);
745
+ } else if (linearVolume <= 0) {
746
+ return -Infinity;
747
+ } else {
748
+ return 20 * Math.log10(linearVolume);
749
+ }
812
750
  }
813
- function isIntegerGt(value, compareTo) {
814
- return isInteger2(value) && value > compareTo;
751
+ function mod(m, n) {
752
+ return (m % n + n) % n;
815
753
  }
816
- function isIntegerGte(value, compareTo) {
817
- return isInteger2(value) && value >= compareTo;
754
+ function romanize(n) {
755
+ if (!isInteger(n) || n < 0) {
756
+ throw new Error("romanize: Invalid n = " + n);
757
+ }
758
+ var digits = String(+n).split("");
759
+ var key = [
760
+ "",
761
+ "C",
762
+ "CC",
763
+ "CCC",
764
+ "CD",
765
+ "D",
766
+ "DC",
767
+ "DCC",
768
+ "DCCC",
769
+ "CM",
770
+ "",
771
+ "X",
772
+ "XX",
773
+ "XXX",
774
+ "XL",
775
+ "L",
776
+ "LX",
777
+ "LXX",
778
+ "LXXX",
779
+ "XC",
780
+ "",
781
+ "I",
782
+ "II",
783
+ "III",
784
+ "IV",
785
+ "V",
786
+ "VI",
787
+ "VII",
788
+ "VIII",
789
+ "IX"
790
+ ];
791
+ var roman = "", i = 3;
792
+ while (i--) roman = (key[+digits.pop() + i * 10] || "") + roman;
793
+ return Array(+digits.join("") + 1).join("M") + roman;
818
794
  }
819
- function isIntegerLt(value, compareTo) {
820
- return isInteger2(value) && value < compareTo;
795
+ function toOrdinalNumber(n) {
796
+ if (!isInteger(n)) {
797
+ throw new Error("toOrdinalNumber: Invalid n = " + n);
798
+ }
799
+ const nStr = n.toString();
800
+ const lastDigit = Number(nStr.charAt(nStr.length - 1));
801
+ if (n === 1 || n >= 20 && lastDigit === 1) {
802
+ return nStr + "st";
803
+ } else if (n === 2 || n >= 20 && lastDigit === 2) {
804
+ return nStr + "nd";
805
+ } else if (n === 3 || n >= 20 && lastDigit === 3) {
806
+ return nStr + "rd";
807
+ } else {
808
+ return nStr + "th";
809
+ }
821
810
  }
822
- function isIntegerLte(value, compareTo) {
823
- return isInteger2(value) && value <= compareTo;
811
+ function interpolateCoord(startX, startY, endX, endY, t) {
812
+ return {
813
+ x: startX + (endX - startX) * t,
814
+ y: startY + (endY - startY) * t
815
+ };
824
816
  }
825
- function isIntegerBetween(value, min, max) {
826
- return isInteger2(value) && value >= min && value <= max;
817
+ function interpolateY(startX, startY, endX, endY, x) {
818
+ let t = (x - startX) / (endX - startX);
819
+ return startY + (endY - startY) * t;
827
820
  }
828
- function isNaNValue(value) {
829
- return typeof value === "number" && Number.isNaN(value);
821
+ function clamp(num, min, max) {
822
+ return Math.min(Math.max(num, min), max);
830
823
  }
831
- function isInfinity(value) {
832
- return typeof value === "number" && Math.abs(value) === Infinity;
824
+ function calcNormal(x1, y1, x2, y2) {
825
+ let dx = x2 - x1;
826
+ let dy = y2 - y1;
827
+ let nx = -dy;
828
+ let ny = dx;
829
+ let len = Math.sqrt(nx * nx + ny * ny);
830
+ if (len > 0) {
831
+ nx /= len;
832
+ ny /= len;
833
+ } else {
834
+ nx = 0;
835
+ ny = 1;
836
+ }
837
+ return { nx, ny };
833
838
  }
834
- function isPosInfinity(value) {
835
- return typeof value === "number" && value === Infinity;
839
+ function sum(arr) {
840
+ return arr.reduce((prev, cur) => cur + prev, 0);
836
841
  }
837
- function isNegInfinity(value) {
838
- return typeof value === "number" && value === -Infinity;
842
+ function avg(...values) {
843
+ return sum(values) / values.length;
839
844
  }
840
-
841
- // src/utils/map/index.ts
842
- var map_exports = {};
843
- __export(map_exports, {
844
- getMapKeys: () => getMapKeys
845
- });
846
- function getMapKeys(map) {
847
- let keys = [];
848
- map.forEach((value, key) => keys.push(key));
849
- return keys;
845
+ function cmp(a, b) {
846
+ return a < b ? -1 : a > b ? 1 : 0;
850
847
  }
851
848
 
852
849
  // src/utils/obj/index.ts
@@ -854,13 +851,10 @@ var obj_exports = {};
854
851
  __export(obj_exports, {
855
852
  deepEqual: () => deepEqual,
856
853
  hasProperties: () => hasProperties,
857
- isObject: () => isObject2
854
+ isObject: () => isObject
858
855
  });
859
- function isObject2(obj) {
860
- return typeof obj === "object" && obj !== null && !isArray(obj);
861
- }
862
856
  function hasProperties(obj, props) {
863
- return isObject2(obj) && props.every((p) => p in obj);
857
+ return isObject(obj) && props.every((p) => p in obj);
864
858
  }
865
859
  function deepEqual(a, b) {
866
860
  if (a === b) return true;
@@ -887,6 +881,7 @@ __export(str_exports, {
887
881
  charCount: () => charCount,
888
882
  chunkString: () => chunkString,
889
883
  insertAt: () => insertAt,
884
+ isString: () => isString,
890
885
  makeSentenceFromPascal: () => makeSentenceFromPascal,
891
886
  removeAt: () => removeAt,
892
887
  repeatString: () => repeatString,
@@ -1262,6 +1257,201 @@ var SmallIntCache = class {
1262
1257
  }
1263
1258
  };
1264
1259
 
1260
+ // src/core/index-array.ts
1261
+ var IndexArray = class _IndexArray {
1262
+ constructor(entries) {
1263
+ // for indexes >= 0
1264
+ __publicField(this, "posEl");
1265
+ __publicField(this, "hasPos");
1266
+ // number of elems
1267
+ __publicField(this, "elCount");
1268
+ if (entries instanceof _IndexArray) {
1269
+ this.posEl = entries.posEl.slice();
1270
+ this.hasPos = entries.hasPos.slice();
1271
+ this.elCount = entries.elCount;
1272
+ } else {
1273
+ this.posEl = [];
1274
+ this.hasPos = [];
1275
+ this.elCount = 0;
1276
+ if (entries) {
1277
+ for (const [id, el] of entries) {
1278
+ this.set(id, el);
1279
+ }
1280
+ }
1281
+ }
1282
+ }
1283
+ static toNegIndex(id) {
1284
+ return -id - 1;
1285
+ }
1286
+ static validateIndex(id) {
1287
+ if (!isIntegerGte(id, 0)) throw new Error(`Invalid index ${id} - must be an integer >= 0!`);
1288
+ return id;
1289
+ }
1290
+ get size() {
1291
+ return this.elCount;
1292
+ }
1293
+ get posLen() {
1294
+ return this.hasPos.length;
1295
+ }
1296
+ has(id) {
1297
+ _IndexArray.validateIndex(id);
1298
+ return this.hasPos[id] === true;
1299
+ }
1300
+ set(id, el) {
1301
+ _IndexArray.validateIndex(id);
1302
+ if (this.hasPos[id] !== true) this.elCount++;
1303
+ this.posEl[id] = el;
1304
+ this.hasPos[id] = true;
1305
+ }
1306
+ get(id) {
1307
+ _IndexArray.validateIndex(id);
1308
+ return this.hasPos[id] ? this.posEl[id] : void 0;
1309
+ }
1310
+ getOrDefault(id, defaultValue) {
1311
+ return this.get(id) ?? defaultValue;
1312
+ }
1313
+ getOrCreate(id, creatorOrValue) {
1314
+ if (!this.has(id)) {
1315
+ const value = isFunction(creatorOrValue) ? creatorOrValue() : creatorOrValue;
1316
+ this.set(id, value);
1317
+ return value;
1318
+ }
1319
+ return this.get(id);
1320
+ }
1321
+ delete(id) {
1322
+ _IndexArray.validateIndex(id);
1323
+ if (!this.hasPos[id]) return false;
1324
+ this.posEl[id] = void 0;
1325
+ this.hasPos[id] = false;
1326
+ this.elCount--;
1327
+ return true;
1328
+ }
1329
+ clear() {
1330
+ this.posEl = [];
1331
+ this.hasPos = [];
1332
+ this.elCount = 0;
1333
+ }
1334
+ forEach(callbackfn, thisArg) {
1335
+ for (const [id, el] of this.entries()) {
1336
+ callbackfn.call(thisArg, el, id, this);
1337
+ }
1338
+ }
1339
+ *indices() {
1340
+ for (let id = 0; id < this.posLen; id++) {
1341
+ if (this.hasPos[id]) yield id;
1342
+ }
1343
+ }
1344
+ indicesArray() {
1345
+ return [...this.indices()];
1346
+ }
1347
+ *values() {
1348
+ for (let id = 0; id < this.posLen; id++) {
1349
+ if (this.hasPos[id]) yield this.posEl[id];
1350
+ }
1351
+ }
1352
+ valuesArray() {
1353
+ return [...this.values()];
1354
+ }
1355
+ *entries() {
1356
+ for (let id = 0; id < this.posLen; id++) {
1357
+ if (this.hasPos[id]) yield [id, this.posEl[id]];
1358
+ }
1359
+ }
1360
+ entriesArray() {
1361
+ return [...this.entries()];
1362
+ }
1363
+ *[Symbol.iterator]() {
1364
+ yield* this.entries();
1365
+ }
1366
+ clone() {
1367
+ return new _IndexArray(this);
1368
+ }
1369
+ merge(other, conflictResolver) {
1370
+ for (const [id, value] of other.entries()) {
1371
+ if (this.has(id) && conflictResolver) {
1372
+ this.set(id, conflictResolver(this.get(id), value, id));
1373
+ } else {
1374
+ this.set(id, value);
1375
+ }
1376
+ }
1377
+ return this;
1378
+ }
1379
+ some(fn) {
1380
+ for (const [id, el] of this.entries()) {
1381
+ if (fn(el, id)) return true;
1382
+ }
1383
+ return false;
1384
+ }
1385
+ every(fn) {
1386
+ for (const [id, el] of this.entries()) {
1387
+ if (!fn(el, id)) return false;
1388
+ }
1389
+ return true;
1390
+ }
1391
+ filter(fn) {
1392
+ let result = new _IndexArray();
1393
+ for (const [id, el] of this.entries()) {
1394
+ if (fn(el, id)) result.set(id, el);
1395
+ }
1396
+ return result;
1397
+ }
1398
+ reduce(fn, init) {
1399
+ let iterator = this.entries();
1400
+ let first = iterator.next();
1401
+ if (first.done) {
1402
+ if (arguments.length < 2) {
1403
+ throw new TypeError("Reduce of empty IndexArray with no initial value!");
1404
+ }
1405
+ return init;
1406
+ }
1407
+ let acc;
1408
+ let start;
1409
+ if (arguments.length < 2) {
1410
+ acc = first.value[1];
1411
+ start = iterator.next();
1412
+ } else {
1413
+ acc = init;
1414
+ start = first;
1415
+ }
1416
+ for (let current = start; !current.done; current = iterator.next()) {
1417
+ const [id, el] = current.value;
1418
+ acc = fn(acc, el, id);
1419
+ }
1420
+ return acc;
1421
+ }
1422
+ mapToArray(fn) {
1423
+ let result = [];
1424
+ for (const [id, el] of this.entries()) {
1425
+ result.push(fn(el, id));
1426
+ }
1427
+ return result;
1428
+ }
1429
+ map(fn) {
1430
+ let result = new _IndexArray();
1431
+ for (const [id, el] of this.entries()) {
1432
+ result.set(id, fn(el, id));
1433
+ }
1434
+ return result;
1435
+ }
1436
+ equals(other, eq) {
1437
+ if (this.size !== other.size) return false;
1438
+ eq ?? (eq = (a, b) => a === b);
1439
+ const posLen = Math.max(this.posLen, other.posLen);
1440
+ for (let i = 0; i < posLen; ++i) {
1441
+ const hasA = this.hasPos[i];
1442
+ const hasB = other.hasPos[i];
1443
+ if (hasA !== hasB) return false;
1444
+ if (hasA && !eq(this.posEl[i], other.posEl[i])) return false;
1445
+ }
1446
+ return true;
1447
+ }
1448
+ toString() {
1449
+ if (this.size === 0) return `IndexArray[ ]`;
1450
+ const entries = this.entriesArray().map(([id, el]) => `${id}: ${el}`).join(", ");
1451
+ return `IndexArray[ ${entries} ]`;
1452
+ }
1453
+ };
1454
+
1265
1455
  // src/core/signed-index-array.ts
1266
1456
  var SignedIndexArray = class _SignedIndexArray {
1267
1457
  constructor(entries) {
@@ -1295,38 +1485,47 @@ var SignedIndexArray = class _SignedIndexArray {
1295
1485
  static toNegIndex(id) {
1296
1486
  return -id - 1;
1297
1487
  }
1488
+ static validateIndex(id) {
1489
+ if (!isInteger(id)) throw new Error(`Invalid index ${id} - must be an integer!`);
1490
+ return id;
1491
+ }
1298
1492
  get size() {
1299
1493
  return this.elCount;
1300
1494
  }
1495
+ get posLen() {
1496
+ return this.hasPos.length;
1497
+ }
1498
+ get negLen() {
1499
+ return this.hasNeg.length;
1500
+ }
1301
1501
  has(id) {
1302
- if (!isInteger(id)) {
1303
- return false;
1304
- } else if (id >= 0) {
1502
+ _SignedIndexArray.validateIndex(id);
1503
+ if (id >= 0) {
1305
1504
  return this.hasPos[id] === true;
1306
1505
  } else {
1307
1506
  return this.hasNeg[_SignedIndexArray.toNegIndex(id)] === true;
1308
1507
  }
1309
1508
  }
1310
1509
  set(id, el) {
1311
- if (!isInteger(id)) {
1312
- throw new Error("Index must be an integer");
1313
- } else if (id >= 0) {
1510
+ _SignedIndexArray.validateIndex(id);
1511
+ if (id >= 0) {
1314
1512
  if (this.hasPos[id] !== true) this.elCount++;
1315
1513
  this.posEl[id] = el;
1316
1514
  this.hasPos[id] = true;
1317
1515
  } else {
1318
- if (this.hasNeg[_SignedIndexArray.toNegIndex(id)] !== true) this.elCount++;
1319
- this.negEl[_SignedIndexArray.toNegIndex(id)] = el;
1320
- this.hasNeg[_SignedIndexArray.toNegIndex(id)] = true;
1516
+ let negId = _SignedIndexArray.toNegIndex(id);
1517
+ if (this.hasNeg[negId] !== true) this.elCount++;
1518
+ this.negEl[negId] = el;
1519
+ this.hasNeg[negId] = true;
1321
1520
  }
1322
1521
  }
1323
1522
  get(id) {
1324
- if (!isInteger(id)) {
1325
- throw new Error("Index must be an integer");
1326
- } else if (id >= 0) {
1523
+ _SignedIndexArray.validateIndex(id);
1524
+ if (id >= 0) {
1327
1525
  return this.hasPos[id] ? this.posEl[id] : void 0;
1328
1526
  } else {
1329
- return this.hasNeg[_SignedIndexArray.toNegIndex(id)] ? this.negEl[_SignedIndexArray.toNegIndex(id)] : void 0;
1527
+ let negId = _SignedIndexArray.toNegIndex(id);
1528
+ return this.hasNeg[negId] ? this.negEl[negId] : void 0;
1330
1529
  }
1331
1530
  }
1332
1531
  getOrDefault(id, defaultValue) {
@@ -1341,7 +1540,7 @@ var SignedIndexArray = class _SignedIndexArray {
1341
1540
  return this.get(id);
1342
1541
  }
1343
1542
  delete(id) {
1344
- if (!isInteger(id)) return false;
1543
+ _SignedIndexArray.validateIndex(id);
1345
1544
  const isPos = id >= 0;
1346
1545
  const arr = isPos ? this.posEl : this.negEl;
1347
1546
  const has = isPos ? this.hasPos : this.hasNeg;
@@ -1364,39 +1563,33 @@ var SignedIndexArray = class _SignedIndexArray {
1364
1563
  callbackfn.call(thisArg, el, id, this);
1365
1564
  }
1366
1565
  }
1367
- indices() {
1368
- function* gen(self) {
1369
- for (let id = self.negEl.length - 1; id >= 0; id--) {
1370
- if (self.hasNeg[id]) yield _SignedIndexArray.toNegIndex(id);
1371
- }
1372
- for (let id = 0; id < self.posEl.length; id++) {
1373
- if (self.hasPos[id]) yield id;
1374
- }
1566
+ *indices() {
1567
+ for (let id = this.negLen - 1; id >= 0; id--) {
1568
+ if (this.hasNeg[id]) yield _SignedIndexArray.toNegIndex(id);
1569
+ }
1570
+ for (let id = 0; id < this.posLen; id++) {
1571
+ if (this.hasPos[id]) yield id;
1375
1572
  }
1376
- return gen(this);
1377
1573
  }
1378
1574
  indicesArray() {
1379
1575
  return [...this.indices()];
1380
1576
  }
1381
- values() {
1382
- function* gen(self) {
1383
- for (let id = self.negEl.length - 1; id >= 0; id--) {
1384
- if (self.hasNeg[id]) yield self.negEl[id];
1385
- }
1386
- for (let id = 0; id < self.posEl.length; id++) {
1387
- if (self.hasPos[id]) yield self.posEl[id];
1388
- }
1577
+ *values() {
1578
+ for (let id = this.negLen - 1; id >= 0; id--) {
1579
+ if (this.hasNeg[id]) yield this.negEl[id];
1580
+ }
1581
+ for (let id = 0; id < this.posLen; id++) {
1582
+ if (this.hasPos[id]) yield this.posEl[id];
1389
1583
  }
1390
- return gen(this);
1391
1584
  }
1392
1585
  valuesArray() {
1393
1586
  return [...this.values()];
1394
1587
  }
1395
1588
  *entries() {
1396
- for (let id = this.negEl.length - 1; id >= 0; id--) {
1589
+ for (let id = this.negLen - 1; id >= 0; id--) {
1397
1590
  if (this.hasNeg[id]) yield [_SignedIndexArray.toNegIndex(id), this.negEl[id]];
1398
1591
  }
1399
- for (let id = 0; id < this.posEl.length; id++) {
1592
+ for (let id = 0; id < this.posLen; id++) {
1400
1593
  if (this.hasPos[id]) yield [id, this.posEl[id]];
1401
1594
  }
1402
1595
  }
@@ -1476,7 +1669,27 @@ var SignedIndexArray = class _SignedIndexArray {
1476
1669
  }
1477
1670
  return result;
1478
1671
  }
1672
+ equals(other, eq) {
1673
+ if (this.size !== other.size) return false;
1674
+ eq ?? (eq = (a, b) => a === b);
1675
+ const posLen = Math.max(this.posLen, other.posLen);
1676
+ for (let i = 0; i < posLen; ++i) {
1677
+ const hasA = this.hasPos[i];
1678
+ const hasB = other.hasPos[i];
1679
+ if (hasA !== hasB) return false;
1680
+ if (hasA && !eq(this.posEl[i], other.posEl[i])) return false;
1681
+ }
1682
+ const negLen = Math.max(this.negLen, other.negLen);
1683
+ for (let i = 0; i < negLen; ++i) {
1684
+ const hasA = this.hasNeg[i];
1685
+ const hasB = other.hasNeg[i];
1686
+ if (hasA !== hasB) return false;
1687
+ if (hasA && !eq(this.negEl[i], other.negEl[i])) return false;
1688
+ }
1689
+ return true;
1690
+ }
1479
1691
  toString() {
1692
+ if (this.size === 0) return `SignedIndexArray[ ]`;
1480
1693
  const entries = this.entriesArray().map(([id, el]) => `${id}: ${el}`).join(", ");
1481
1694
  return `SignedIndexArray[ ${entries} ]`;
1482
1695
  }
@@ -1979,18 +2192,61 @@ var Map3 = class _Map3 {
1979
2192
  return `Map3(${this.size}) { ${entries.join(", ")} }`;
1980
2193
  }
1981
2194
  };
2195
+
2196
+ // src/core/multi-container.ts
2197
+ var MultiContainer = class {
2198
+ constructor(base) {
2199
+ this.base = base;
2200
+ }
2201
+ add(...keysAndValue) {
2202
+ const keys = keysAndValue.slice(0, -1);
2203
+ const value = keysAndValue[keysAndValue.length - 1];
2204
+ const arr = this.base.get(...keys);
2205
+ this.base.set(...[...keys, arr ? [...arr, value] : [value]]);
2206
+ return value;
2207
+ }
2208
+ remove(...keysAndValue) {
2209
+ const keys = keysAndValue.slice(0, -1);
2210
+ const value = keysAndValue[keysAndValue.length - 1];
2211
+ const arr = this.base.get(...keys);
2212
+ if (!arr) return false;
2213
+ const i = arr.indexOf(value);
2214
+ if (i === -1) return false;
2215
+ arr.splice(i, 1);
2216
+ if (arr.length === 0) this.base.delete(...keys);
2217
+ return true;
2218
+ }
2219
+ getAll(...keys) {
2220
+ return this.base.get(...keys) ?? [];
2221
+ }
2222
+ *iterAll(...keys) {
2223
+ const arr = this.getAll(...keys);
2224
+ for (const v of arr) {
2225
+ yield v;
2226
+ }
2227
+ }
2228
+ clear() {
2229
+ this.base.clear?.();
2230
+ }
2231
+ };
2232
+ function asMulti(base) {
2233
+ return new MultiContainer(base);
2234
+ }
1982
2235
  export {
1983
2236
  Assert,
1984
2237
  Cookies,
1985
2238
  Device,
2239
+ IndexArray,
1986
2240
  LRUCache,
1987
2241
  Map1,
1988
2242
  Map2,
1989
2243
  Map3,
2244
+ MultiContainer,
1990
2245
  SignedIndexArray,
1991
2246
  SmallIntCache,
1992
2247
  Stack,
1993
2248
  utils_exports as Utils,
1994
- Vec2
2249
+ Vec2,
2250
+ asMulti
1995
2251
  };
1996
2252
  //# sourceMappingURL=index.mjs.map