@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/CHANGELOG.md +10 -0
- package/README.md +10 -4
- package/dist/index.d.mts +215 -130
- package/dist/index.d.ts +215 -130
- package/dist/index.js +577 -318
- package/dist/index.mjs +573 -317
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* TsUtilsLib v1.
|
|
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/
|
|
41
|
-
var
|
|
42
|
-
__export(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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" &&
|
|
172
|
+
return typeof n === "number" && isFinite2(n) && n === Math.trunc(n);
|
|
58
173
|
}
|
|
59
|
-
function
|
|
60
|
-
|
|
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
|
|
69
|
-
return (
|
|
177
|
+
function isIntegerEq(value, compareTo) {
|
|
178
|
+
return isInteger(value) && value === compareTo;
|
|
70
179
|
}
|
|
71
|
-
function
|
|
72
|
-
|
|
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
|
|
113
|
-
|
|
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
|
|
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
|
|
135
|
-
|
|
136
|
-
return startY + (endY - startY) * t;
|
|
189
|
+
function isIntegerLte(value, compareTo) {
|
|
190
|
+
return isInteger(value) && value <= compareTo;
|
|
137
191
|
}
|
|
138
|
-
function
|
|
139
|
-
return
|
|
192
|
+
function isIntegerBetween(value, min, max) {
|
|
193
|
+
return isInteger(value) && value >= min && value <= max;
|
|
140
194
|
}
|
|
141
|
-
function
|
|
142
|
-
|
|
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
|
|
157
|
-
return
|
|
198
|
+
function isInfinity(value) {
|
|
199
|
+
return typeof value === "number" && Math.abs(value) === Infinity;
|
|
158
200
|
}
|
|
159
|
-
function
|
|
160
|
-
return
|
|
201
|
+
function isPosInfinity(value) {
|
|
202
|
+
return typeof value === "number" && value === Infinity;
|
|
161
203
|
}
|
|
162
|
-
function
|
|
163
|
-
return
|
|
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/
|
|
685
|
-
var
|
|
686
|
-
__export(
|
|
687
|
-
|
|
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
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
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
|
-
|
|
811
|
-
|
|
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
|
|
814
|
-
return
|
|
751
|
+
function mod(m, n) {
|
|
752
|
+
return (m % n + n) % n;
|
|
815
753
|
}
|
|
816
|
-
function
|
|
817
|
-
|
|
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
|
|
820
|
-
|
|
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
|
|
823
|
-
return
|
|
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
|
|
826
|
-
|
|
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
|
|
829
|
-
return
|
|
821
|
+
function clamp(num, min, max) {
|
|
822
|
+
return Math.min(Math.max(num, min), max);
|
|
830
823
|
}
|
|
831
|
-
function
|
|
832
|
-
|
|
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
|
|
835
|
-
return
|
|
839
|
+
function sum(arr) {
|
|
840
|
+
return arr.reduce((prev, cur) => cur + prev, 0);
|
|
836
841
|
}
|
|
837
|
-
function
|
|
838
|
-
return
|
|
842
|
+
function avg(...values) {
|
|
843
|
+
return sum(values) / values.length;
|
|
839
844
|
}
|
|
840
|
-
|
|
841
|
-
|
|
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: () =>
|
|
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
|
|
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
|
-
|
|
1303
|
-
|
|
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
|
-
|
|
1312
|
-
|
|
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
|
-
|
|
1319
|
-
this.
|
|
1320
|
-
this.
|
|
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
|
-
|
|
1325
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
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
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
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.
|
|
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.
|
|
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
|