@lowentry/utils 2.0.4 → 2.0.6

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,gEAAgE;AAChE,OAAO,KAAK,gBAAgB,MAAM,WAAW,CAAC;AAE9C,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAElC,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,GAAG,gBAAgB;CACnB,CAAC"}
1
+ {"version":3,"sources":["../src/LeUtils.ts","../src/LeTypes.ts","../src/classes/EventEmitter.ts","../src/classes/LinkedList.ts","../src/classes/SerializableMap.ts","../src/classes/TreeSet.ts","../src/index.ts"],"sourcesContent":["/**\n * LeUtils - Core utility functions\n */\n\nimport {ISSET, IS_OBJECT, IS_ARRAY, ARRAY, STRING, INT_LAX, FLOAT_LAX, INT_LAX_ANY, FLOAT_LAX_ANY} from './LeTypes';\n\n/**\n * Helper function to safely get property value without 'as'\n * Returns undefined if property doesn't exist (this is normal, no warning)\n * This is a defensive helper - it's expected that obj might not be an object or prop might not exist\n */\nfunction safeGetProperty(obj: unknown, prop: string): unknown\n{\n\tif((typeof obj !== 'object' && typeof obj !== 'function') || obj === null)\n\t{\n\t\t// Non-object - return undefined (defensive, no warning)\n\t\treturn undefined;\n\t}\n\tif(!(prop in obj))\n\t{\n\t\t// Property doesn't exist - this is normal, no warning\n\t\treturn undefined;\n\t}\n\tconst desc = Object.getOwnPropertyDescriptor(obj, prop);\n\tif(desc === undefined)\n\t{\n\t\t// Property might be on prototype - use direct access\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\treturn (obj as any)[prop];\n\t}\n\treturn desc.value;\n}\n\n/**\n * Type predicate: check if value has numeric length property\n */\nfunction hasNumericLength(val: unknown): val is {length: number; [index: number]: unknown}\n{\n\tif((typeof val !== 'object' && typeof val !== 'function') || val === null)\n\t{\n\t\treturn false;\n\t}\n\tif(!('length' in val))\n\t{\n\t\treturn false;\n\t}\n\tconst lengthValue = safeGetProperty(val, 'length');\n\tif(typeof lengthValue !== 'number')\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Type predicate: check if value is DataView-like\n */\nfunction isDataViewLike(val: unknown): val is {byteLength: number; getUint8: (i: number) => number}\n{\n\tif((typeof val !== 'object' && typeof val !== 'function') || val === null)\n\t{\n\t\treturn false;\n\t}\n\tif(!('byteLength' in val) || !('getUint8' in val))\n\t{\n\t\treturn false;\n\t}\n\tconst byteLengthValue = safeGetProperty(val, 'byteLength');\n\tconst getUint8Value = safeGetProperty(val, 'getUint8');\n\tif(typeof byteLengthValue !== 'number' || typeof getUint8Value !== 'function')\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Type predicate: check if value is RegExp\n */\nfunction isRegExp(val: unknown): val is RegExp\n{\n\treturn val instanceof RegExp;\n}\n\n/**\n * Type predicate: check if value is Record-like\n */\nfunction isRecordLike(val: unknown): val is Record<string, unknown>\n{\n\treturn (typeof val === 'object' || typeof val === 'function') && val !== null && !Array.isArray(val) && !(val instanceof Map) && !(val instanceof Set);\n}\n\n/**\n * Type predicate: check if value is array-like (unknown[])\n */\nfunction isUnknownArray(val: unknown): val is unknown[]\n{\n\treturn Array.isArray(val);\n}\n\n/**\n * Type predicate: check if value is Map-like\n */\nfunction isMapLike(val: unknown): val is Map<unknown, unknown>\n{\n\treturn val instanceof Map;\n}\n\n/**\n * Type predicate: check if value is Set-like\n */\nfunction isSetLike(val: unknown): val is Set<unknown>\n{\n\treturn val instanceof Set;\n}\n\n/**\n * Type predicate: check if value is ArrayBufferView\n */\nfunction isArrayBufferView(val: unknown): val is ArrayBufferView\n{\n\treturn ArrayBuffer.isView(val);\n}\n\n/**\n * Type predicate: check if value has constructor property\n */\nfunction hasConstructor(val: unknown): val is {constructor: new (...args: unknown[]) => unknown}\n{\n\tif((typeof val !== 'object' && typeof val !== 'function') || val === null)\n\t{\n\t\treturn false;\n\t}\n\tconst constructorValue = safeGetProperty(val, 'constructor');\n\treturn typeof constructorValue === 'function';\n}\n\n/**\n * Type predicate: check if value is Iterable\n */\nfunction isIterable(val: unknown): val is Iterable<unknown>\n{\n\tif((typeof val !== 'object' && typeof val !== 'function') || val === null)\n\t{\n\t\treturn false;\n\t}\n\t// Check for Symbol.iterator using 'in' operator and direct property access\n\tif(!(Symbol.iterator in val))\n\t{\n\t\treturn false;\n\t}\n\tconst desc = Object.getOwnPropertyDescriptor(val, Symbol.iterator);\n\tif(desc === undefined)\n\t{\n\t\t// Property might be on prototype - use direct access\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\treturn typeof (val as any)[Symbol.iterator] === 'function';\n\t}\n\treturn typeof desc.value === 'function';\n}\n\n/**\n * Type predicate: check if value has forEach method\n */\nfunction hasForEach(val: unknown): val is {forEach: (cb: (value: unknown, key: unknown) => void) => void}\n{\n\tif(typeof val !== 'object' || val === null)\n\t{\n\t\treturn false;\n\t}\n\tconst forEach = safeGetProperty(val, 'forEach');\n\treturn typeof forEach === 'function';\n}\n\n/**\n * Type predicate: check if value is object (not null, not array, not Map, not Set)\n */\nfunction isPlainObject(val: unknown): val is Record<string, unknown>\n{\n\tif(typeof val !== 'object' || val === null)\n\t{\n\t\treturn false;\n\t}\n\tconst constructor = safeGetProperty(val, 'constructor');\n\treturn constructor === Object;\n}\n\n/**\n * Type predicate: check if value is a tuple pair [unknown, unknown]\n */\nfunction isPair(val: unknown): val is [unknown, unknown]\n{\n\tif(!Array.isArray(val))\n\t{\n\t\treturn false;\n\t}\n\treturn val.length === 2;\n}\n\n/**\n * Type predicate: check if value is a Promise\n */\nfunction isPromise(val: unknown): val is Promise<unknown>\n{\n\tif(typeof val !== 'object' || val === null)\n\t{\n\t\treturn false;\n\t}\n\tconst then = safeGetProperty(val, 'then');\n\treturn typeof then === 'function';\n}\n\n/**\n * Type predicate: check if value is TransactionalValue\n */\nfunction isTransactionalValue(val: unknown): val is {value: unknown; changes: TransactionChange[]}\n{\n\tif(typeof val !== 'object' || val === null)\n\t{\n\t\treturn false;\n\t}\n\tif(!('value' in val))\n\t{\n\t\treturn false;\n\t}\n\tif(!('changes' in val))\n\t{\n\t\treturn false;\n\t}\n\tconst changes = safeGetProperty(val, 'changes');\n\tif(!Array.isArray(changes))\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Type predicate: check if Performance has timing property (legacy API)\n */\nfunction hasPerformanceTiming(perf: unknown): perf is {timing?: {navigationStart?: number}; timeOrigin?: number; now?: () => number}\n{\n\tif(typeof perf !== 'object' || perf === null)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Type predicate: check if globalThis has setTimeout\n */\nfunction hasSetTimeout(global: unknown): global is {setTimeout: (cb: () => void, ms: number) => number}\n{\n\tif(typeof global !== 'object' || global === null)\n\t{\n\t\treturn false;\n\t}\n\tconst setTimeout = safeGetProperty(global, 'setTimeout');\n\treturn typeof setTimeout === 'function';\n}\n\n/**\n * Type predicate: check if globalThis has setInterval\n */\nfunction hasSetInterval(global: unknown): global is {setInterval: (cb: () => void, ms: number) => number}\n{\n\tif(typeof global !== 'object' || global === null)\n\t{\n\t\treturn false;\n\t}\n\tconst setInterval = safeGetProperty(global, 'setInterval');\n\treturn typeof setInterval === 'function';\n}\n\n/**\n * Type predicate: check if value is a number array (for gradients)\n */\nfunction isNumberArray(val: unknown): val is number[]\n{\n\tif(!Array.isArray(val))\n\t{\n\t\treturn false;\n\t}\n\treturn val.every((item) => typeof item === 'number');\n}\n\n/**\n * Type predicate: check if Navigator has vendor property\n */\nfunction hasNavigatorVendor(nav: unknown): nav is {vendor?: string; userAgent?: string}\n{\n\tif(typeof nav !== 'object' || nav === null)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Type predicate: check if globalThis has opera property (legacy)\n */\nfunction hasOpera(global: unknown): global is {opera?: string}\n{\n\tif(typeof global !== 'object' || global === null)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Type predicate: check if Navigator has languages\n */\nfunction hasNavigatorLanguages(nav: unknown): nav is {languages?: unknown[]}\n{\n\tif(typeof nav !== 'object' || nav === null)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Type predicate: check if globalThis has Intl\n */\nfunction hasIntl(global: unknown): global is {Intl?: {DateTimeFormat: new (locale?: string | string[]) => {format: (date?: Date) => string}}}\n{\n\tif(typeof global !== 'object' || global === null)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Type predicate: check if object has id property\n */\nfunction hasId(obj: unknown): obj is {id: string; [key: string]: unknown}\n{\n\tif(typeof obj !== 'object' || obj === null)\n\t{\n\t\treturn false;\n\t}\n\tconst id = safeGetProperty(obj, 'id');\n\treturn typeof id === 'string';\n}\n\n/**\n * Type predicate: check if value is Worker with sendMessage\n */\nfunction hasSendMessage(worker: unknown): worker is {sendMessage: (data: unknown, options?: {timeout?: number}) => Promise<unknown>}\n{\n\tif(typeof worker !== 'object' || worker === null)\n\t{\n\t\treturn false;\n\t}\n\tconst sendMessage = safeGetProperty(worker, 'sendMessage');\n\treturn typeof sendMessage === 'function';\n}\n\n/**\n * Type predicate: check if error has message property\n */\nfunction hasErrorMessage(err: unknown): err is {message: string}\n{\n\tif(typeof err !== 'object' || err === null)\n\t{\n\t\treturn false;\n\t}\n\tconst message = safeGetProperty(err, 'message');\n\treturn typeof message === 'string';\n}\n\n/**\n * Type predicate: check if version has major, minor, patch\n */\nfunction isVersionObject(version: unknown): version is {major: unknown; minor: unknown; patch: unknown; [key: string]: unknown}\n{\n\tif(!IS_OBJECT(version))\n\t{\n\t\treturn false;\n\t}\n\tconst major = safeGetProperty(version, 'major');\n\tconst minor = safeGetProperty(version, 'minor');\n\tconst patch = safeGetProperty(version, 'patch');\n\treturn major !== undefined && minor !== undefined && patch !== undefined;\n}\n\n/**\n * Transactional Value Types\n */\nexport interface TransactionChange\n{\n\tid: string;\n\tvalue: unknown;\n}\n\nexport interface TransactionalValue\n{\n\tvalue: unknown;\n\tchanges: TransactionChange[];\n}\n\n/**\n * Private helper to convert a number to bytes (Uint8ClampedArray).\n */\nfunction numberToBytes(num: number): Uint8ClampedArray\n{\n\tconst size = (num === 0) ? 0 : Math.ceil((Math.floor(Math.log2(num)) + 1) / 8);\n\tconst bytes = new Uint8ClampedArray(size);\n\tlet x = num;\n\tfor(let i = (size - 1); i >= 0; i--)\n\t{\n\t\tconst rightByte = x & 0xff;\n\t\tbytes[i] = rightByte;\n\t\tx = Math.floor(x / 0x100);\n\t}\n\treturn bytes;\n}\n\n/**\n * Deep equality comparison.\n * Compares objects, arrays, Maps, Sets, primitives, and handles special cases.\n *\n * @param a - First value to compare\n * @param b - Second value to compare\n * @returns true if values are equivalent\n */\nexport function equals(a: unknown, b: unknown): boolean\n{\n\tconst seen = new WeakSet();\n\t\n\tfunction recursiveEquals(valA: unknown, valB: unknown): boolean\n\t{\n\t\tif(valA === valB)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tif(valA && valB && typeof valA === 'object' && typeof valB === 'object')\n\t\t{\n\t\t\tif(seen.has(valA))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tseen.add(valA);\n\n\t\t\t// Type guard: check constructor equality\n\t\t\tconst constructorAValue = safeGetProperty(valA, 'constructor');\n\t\t\tconst constructorBValue = safeGetProperty(valB, 'constructor');\n\t\t\tif(constructorAValue !== constructorBValue)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif(Array.isArray(valA))\n\t\t\t{\n\t\t\t\t// Type guard: verify valB is also an array\n\t\t\t\tif(!Array.isArray(valB))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst length = valA.length;\n\t\t\t\tif(length !== valB.length)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfor(let i = length; i-- !== 0;)\n\t\t\t\t{\n\t\t\t\t\tif(!recursiveEquals(valA[i], valB[i]))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif((valA instanceof Map) && (valB instanceof Map))\n\t\t\t{\n\t\t\t\tif(valA.size !== valB.size)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfor(const [keyA, valueA] of valA.entries())\n\t\t\t\t{\n\t\t\t\t\tlet found = false;\n\t\t\t\t\tlet valueB: unknown;\n\t\t\t\t\tif(valB.has(keyA))\n\t\t\t\t\t{\n\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\tvalueB = valB.get(keyA);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(const [keyB, vb] of valB.entries())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(recursiveEquals(keyA, keyB))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\tvalueB = vb;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!found || !recursiveEquals(valueA, valueB))\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif((valA instanceof Set) && (valB instanceof Set))\n\t\t\t{\n\t\t\t\tif(valA.size !== valB.size)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfor(const itemA of valA)\n\t\t\t\t{\n\t\t\t\t\tif(valB.has(itemA))\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet found = false;\n\t\t\t\t\tfor(const itemB of valB)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(recursiveEquals(itemA, itemB))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!found)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif(ArrayBuffer.isView(valA) && ArrayBuffer.isView(valB))\n\t\t\t{\n\t\t\t\tif(hasNumericLength(valA) && hasNumericLength(valB))\n\t\t\t\t{\n\t\t\t\t\tconst lengthA = valA.length;\n\t\t\t\t\tconst lengthB = valB.length;\n\t\t\t\t\tif(lengthA !== lengthB)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any -- TypedArray index access\n\t\t\t\t\tconst a = valA as any;\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any -- TypedArray index access\n\t\t\t\t\tconst b = valB as any;\n\t\t\t\t\tfor(let i = lengthA; i-- !== 0;)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(a[i] !== b[i])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif(isDataViewLike(valA) && isDataViewLike(valB))\n\t\t\t\t{\n\t\t\t\t\tconst byteLengthA = valA.byteLength;\n\t\t\t\t\tconst byteLengthB = valB.byteLength;\n\t\t\t\t\tif(byteLengthA !== byteLengthB)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tfor(let i = byteLengthA; i-- !== 0;)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(valA.getUint8(i) !== valB.getUint8(i))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif(isRegExp(valA))\n\t\t\t{\n\t\t\t\tif(!isRegExp(valB))\n\t\t\t\t{\n\t\t\t\t\t// Type mismatch - this is normal comparison behavior, not an error\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn valA.source === valB.source && valA.flags === valB.flags;\n\t\t\t}\n\n\t\t\t// Type guard: check for valueOf method\n\t\t\tconst valueOfA = safeGetProperty(valA, 'valueOf');\n\t\t\tif(typeof valueOfA === 'function' && valueOfA !== Object.prototype.valueOf)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tconst valueOfB = safeGetProperty(valB, 'valueOf');\n\t\t\t\t\tif(typeof valueOfB === 'function' && valueOfB !== Object.prototype.valueOf)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst resultA = Function.prototype.call.call(valueOfA, valA);\n\t\t\t\t\t\tconst resultB = Function.prototype.call.call(valueOfB, valB);\n\t\t\t\t\t\treturn resultA === resultB;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\t// Error calling valueOf - this indicates the method exists but threw an error\n\t\t\t\t\t// This is unexpected and indicates invalid data or implementation\n\t\t\t\t\tconsole.error('LeUtils.equals: error calling valueOf - invalid data or implementation', e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Type guard: check for toString method\n\t\t\tconst toStringA = safeGetProperty(valA, 'toString');\n\t\t\tif(typeof toStringA === 'function' && toStringA !== Object.prototype.toString)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tconst toStringB = safeGetProperty(valB, 'toString');\n\t\t\t\t\tif(typeof toStringB === 'function' && toStringB !== Object.prototype.toString)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst resultA = Function.prototype.call.call(toStringA, valA);\n\t\t\t\t\t\tconst resultB = Function.prototype.call.call(toStringB, valB);\n\t\t\t\t\t\treturn resultA === resultB;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\t// Error calling toString - this indicates the method exists but threw an error\n\t\t\t\t\t// This is unexpected and indicates invalid data or implementation\n\t\t\t\t\tconsole.error('LeUtils.equals: error calling toString - invalid data or implementation', e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst constructorA = safeGetProperty(valA, 'constructor');\n\t\t\tconst constructorB = safeGetProperty(valB, 'constructor');\n\t\t\tif(constructorA !== constructorB)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif(!isRecordLike(valA) || !isRecordLike(valB))\n\t\t\t{\n\t\t\t\t// Type mismatch - this is normal comparison behavior, not an error\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst keys = Object.keys(valA);\n\t\t\tconst length = keys.length;\n\t\t\tif(length !== Object.keys(valB).length)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor(let i = length; i-- !== 0;)\n\t\t\t{\n\t\t\t\tif(!Object.prototype.hasOwnProperty.call(valB, keys[i]!))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(let i = length; i-- !== 0;)\n\t\t\t{\n\t\t\t\tconst key = keys[i]!;\n\t\t\t\tconst typeofA = safeGetProperty(valA, '$$typeof');\n\t\t\t\tif((key === '_owner') && typeofA)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst aVal = valA[key];\n\t\t\t\tconst bVal = valB[key];\n\n\t\t\t\tif(!recursiveEquals(aVal, bVal))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t// true if both are NaN, false otherwise\n\t\treturn ((valA !== valA) && (valB !== valB));\n\t}\n\n\treturn recursiveEquals(a, b);\n}\n\n/**\n * Deep clones a value.\n *\n * @param value - Value to clone\n * @returns Deep cloned value\n */\nexport function clone<T>(value: T): T\n{\n\tconst seen = new WeakMap();\n\n\tfunction recursiveClone(val: unknown): unknown\n\t{\n\t\tif(val === null || typeof val !== 'object')\n\t\t{\n\t\t\treturn val;\n\t\t}\n\n\t\tif(typeof val === 'function')\n\t\t{\n\t\t\treturn val;\n\t\t}\n\n\t\tif(seen.has(val))\n\t\t{\n\t\t\treturn seen.get(val);\n\t\t}\n\n\t\tlet result: unknown;\n\n\t\tif(isUnknownArray(val))\n\t\t{\n\t\t\tconst resultArray: unknown[] = [];\n\t\t\tresult = resultArray;\n\t\t\tseen.set(val, result);\n\t\t\tfor(let i = 0; i < val.length; i++)\n\t\t\t{\n\t\t\t\tresultArray.push(recursiveClone(val[i]));\n\t\t\t}\n\t\t}\n\t\telse if(val instanceof Date)\n\t\t{\n\t\t\tresult = new Date(val.getTime());\n\t\t\tseen.set(val, result);\n\t\t}\n\t\telse if(isRegExp(val))\n\t\t{\n\t\t\tresult = new RegExp(val.source, val.flags);\n\t\t\tseen.set(val, result);\n\t\t}\n\t\telse if(isMapLike(val))\n\t\t{\n\t\t\tconst resultMap = new Map<unknown, unknown>();\n\t\t\tresult = resultMap;\n\t\t\tseen.set(val, result);\n\t\t\tfor(const [k, v] of val.entries())\n\t\t\t{\n\t\t\t\tresultMap.set(recursiveClone(k), recursiveClone(v));\n\t\t\t}\n\t\t}\n\t\telse if(isSetLike(val))\n\t\t{\n\t\t\tconst resultSet = new Set<unknown>();\n\t\t\tresult = resultSet;\n\t\t\tseen.set(val, result);\n\t\t\tfor(const v of val.values())\n\t\t\t{\n\t\t\t\tresultSet.add(recursiveClone(v));\n\t\t\t}\n\t\t}\n\t\telse if(isArrayBufferView(val))\n\t\t{\n\t\t\t// TypedArray clone\n\t\t\tif(!hasConstructor(val))\n\t\t\t{\n\t\t\t\tconsole.error('LeUtils.clone: ArrayBufferView value does not have constructor property');\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tconst Constructor = val.constructor;\n\t\t\t// Create a new buffer to ensure independent memory\n\t\t\tconst buffer = val.buffer.slice(val.byteOffset, val.byteOffset + val.byteLength);\n\t\t\tresult = new Constructor(buffer);\n\t\t\tseen.set(val, result);\n\t\t}\n\t\telse if(isRecordLike(val))\n\t\t{\n\t\t\t// Generic object\n\t\t\tconst resultObj: Record<string, unknown> = Object.create(Object.getPrototypeOf(val));\n\t\t\tresult = resultObj;\n\t\t\tseen.set(val, result);\n\t\t\tfor(const key of Object.keys(val))\n\t\t\t{\n\t\t\t\tresultObj[key] = recursiveClone(val[key]);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Unknown object type - this indicates an unsupported type being cloned\n\t\t\tconsole.error('LeUtils.clone: unsupported object type, cannot clone properly', val);\n\t\t\treturn value;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tconst cloned = recursiveClone(value);\n\tif(cloned === undefined && value !== undefined)\n\t{\n\t\t// Clone should only return undefined if input is undefined - otherwise it's a bug\n\t\tconsole.error('LeUtils.clone: clone returned undefined for non-undefined input - cloning failed');\n\t\treturn value;\n\t}\n\t// Type guard: verify cloned value matches expected type T\n\t// Since we're cloning, the structure should match, but TypeScript can't verify this\n\t// We use a type predicate approach: if value is T, then cloned should also be T\n\t// This is safe because clone preserves structure\n\t// The only way to satisfy TypeScript here is through a type assertion, but we've validated the clone succeeded\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\treturn cloned as T;\n}\n\n/**\n * Checks if the given elements can be iterated over using each().\n *\n * @param elements - Value to check\n * @returns true if can iterate\n */\nexport function supportsEach(elements: unknown): boolean\n{\n\tif((elements === null) || (typeof elements === 'undefined') || (typeof elements === 'string'))\n\t{\n\t\treturn false;\n\t}\n\treturn !!(\n\t\t(Array.isArray(elements))\n\t\t|| isPlainObject(elements)\n\t\t|| isIterable(elements)\n\t\t|| hasForEach(elements)\n\t\t|| ((typeof elements === 'object') || (typeof elements === 'function'))\n\t);\n}\n\n/**\n * Returns an iterator that yields [value, key/index] for each element.\n *\n * @param elements - Collection to iterate\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty check\n * @yields [value, key/index]\n */\nexport function* eachIterator(elements: unknown, optionalSkipHasOwnPropertyCheck: boolean = false): Generator<[unknown, unknown]>\n{\n\tif((elements === null) || (typeof elements === 'undefined'))\n\t{\n\t\treturn;\n\t}\n\n\tif(Array.isArray(elements))\n\t{\n\t\tfor(let i = 0; i < elements.length; i++)\n\t\t{\n\t\t\tyield [elements[i], i];\n\t\t}\n\t\treturn;\n\t}\n\n\tif(elements instanceof Map)\n\t{\n\t\tfor(const [i, value] of elements)\n\t\t{\n\t\t\tyield [value, i];\n\t\t}\n\t\treturn;\n\t}\n\n\tif(elements instanceof Set)\n\t{\n\t\tfor(const value of elements)\n\t\t{\n\t\t\tyield [value, value];\n\t\t}\n\t\treturn;\n\t}\n\n\tif(isPlainObject(elements))\n\t{\n\t\tfor(const i in elements)\n\t\t{\n\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, i))\n\t\t\t{\n\t\t\t\tyield [elements[i], i];\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tif(typeof elements !== 'string')\n\t{\n\t\tif(isIterable(elements))\n\t\t{\n\t\t\tlet i = 0;\n\t\t\tfor(const value of elements)\n\t\t\t{\n\t\t\t\tyield [value, i];\n\t\t\t\ti++;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif(hasForEach(elements))\n\t\t{\n\t\t\tconst buffer: [unknown, unknown][] = [];\n\t\t\telements.forEach((value: unknown, i: unknown) =>\n\t\t\t{\n\t\t\t\tbuffer.push([value, i]);\n\t\t\t});\n\t\t\tfor(const entry of buffer)\n\t\t\t{\n\t\t\t\tyield entry;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif((typeof elements === 'object') && (elements !== null))\n\t{\n\t\t// Last resort: try to iterate over any object properties\n\t\tif(isRecordLike(elements))\n\t\t{\n\t\t\tfor(const i in elements)\n\t\t\t{\n\t\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, i))\n\t\t\t\t{\n\t\t\t\t\tyield [elements[i], i];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Reached end of function without yielding - invalid/unsupported type\n\t// This is unexpected - user passed a type that can't be iterated\n\tconsole.error('LeUtils.eachIterator: executed on invalid/unsupported type', typeof elements, elements);\n}\n\n/**\n * Loops through each element and calls callback.\n * Callback can return false to break iteration.\n *\n * @param elements - Collection to iterate\n * @param callback - Function called for each element\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty check\n * @returns Original elements\n */\nexport function each<T>(\n\telements: T,\n\tcallback: (value: unknown, key: unknown) => boolean | void,\n\toptionalSkipHasOwnPropertyCheck: boolean = false,\n): T\n{\n\tif(typeof callback !== 'function')\n\t{\n\t\tthrow new TypeError('The given callback is not a function');\n\t}\n\tfor(const [value, key] of eachIterator(elements, optionalSkipHasOwnPropertyCheck))\n\t{\n\t\tif(callback.call(value, value, key) === false)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn elements;\n}\n\n/**\n * Like each(), except that it expects an async callback.\n *\n * @param elements - Collection to iterate\n * @param asyncCallback - Async function called for each element\n * @param parallelCount - Number of parallel executions (default 1)\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty check\n * @returns Promise resolving to original elements\n */\nexport async function eachAsync<T>(\n\telements: T,\n\tasyncCallback: (value: unknown, key: unknown) => Promise<boolean | void>,\n\tparallelCount: number = 1,\n\toptionalSkipHasOwnPropertyCheck: boolean = false,\n): Promise<T>\n{\n\tif((elements === null) || (typeof elements === 'undefined'))\n\t{\n\t\treturn elements;\n\t}\n\n\tif(typeof asyncCallback !== 'function')\n\t{\n\t\tthrow new TypeError('The given callback is not a function');\n\t}\n\n\tconst pCount = INT_LAX(parallelCount);\n\n\tif(pCount > 1)\n\t{\n\t\tconst runningPromises = new Set<Promise<void>>();\n\t\tlet doBreak = false;\n\n\t\tfor(const [value, key] of eachIterator(elements, optionalSkipHasOwnPropertyCheck))\n\t\t{\n\t\t\tif(doBreak) break;\n\n\t\t\twhile(runningPromises.size >= pCount)\n\t\t\t{\n\t\t\t\tawait Promise.race(runningPromises);\n\t\t\t\tif(doBreak) break;\n\t\t\t}\n\n\t\t\tconst promise = (async(): Promise<void> =>\n\t\t\t{\n\t\t\t\tif((await asyncCallback.call(value, value, key)) === false)\n\t\t\t\t{\n\t\t\t\t\tdoBreak = true;\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\trunningPromises.add(promise);\n\t\t\tpromise.finally(() =>\n\t\t\t{\n\t\t\t\trunningPromises.delete(promise);\n\t\t\t});\n\t\t}\n\n\t\tawait Promise.all(runningPromises);\n\t}\n\telse\n\t{\n\t\tfor(const [value, key] of eachIterator(elements, optionalSkipHasOwnPropertyCheck))\n\t\t{\n\t\t\tif((await asyncCallback.call(value, value, key)) === false)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn elements;\n}\n\n/**\n * Returns empty collection matching type of input, plus add function.\n *\n * @param elements - Source collection to match type\n * @returns [success, emptyCollection, addFunction]\n */\nexport function getEmptySimplifiedCollection(elements: unknown): [boolean, unknown, (value: unknown, index: unknown) => void]\n{\n\tif((elements === null) || (typeof elements === 'undefined'))\n\t{\n\t\treturn [false, [], (_value: unknown, _index: unknown): void => \n\t\t{}];\n\t}\n\n\tlet collection: unknown = null;\n\tlet add: ((value: unknown, index: unknown) => void) | null = null;\n\n\tif(Array.isArray(elements))\n\t{\n\t\tconst arrayCollection: unknown[] = [];\n\t\tcollection = arrayCollection;\n\t\tadd = (value: unknown, _index: unknown): void =>\n\t\t{\n\t\t\tarrayCollection.push(value);\n\t\t};\n\t}\n\telse if(isPlainObject(elements))\n\t{\n\t\tconst objectCollection: Record<string, unknown> = {};\n\t\tcollection = objectCollection;\n\t\tadd = (value: unknown, index: unknown): void =>\n\t\t{\n\t\t\tconst stringIndex = typeof index === 'string' ? index : String(index);\n\t\t\tobjectCollection[stringIndex] = value;\n\t\t};\n\t}\n\telse if(elements instanceof Map)\n\t{\n\t\tconst mapCollection = new Map<unknown, unknown>();\n\t\tcollection = mapCollection;\n\t\tadd = (value: unknown, index: unknown): void =>\n\t\t{\n\t\t\tmapCollection.set(index, value);\n\t\t};\n\t}\n\telse if((typeof elements !== 'string') && (elements !== null) && (isIterable(elements) || hasForEach(elements)))\n\t{\n\t\tconst arrayCollection: unknown[] = [];\n\t\tcollection = arrayCollection;\n\t\tadd = (value: unknown, _index: unknown): void =>\n\t\t{\n\t\t\tarrayCollection.push(value);\n\t\t};\n\t}\n\telse if((typeof elements === 'object' || typeof elements === 'function') && (elements !== null))\n\t{\n\t\tconst objectCollection: Record<string, unknown> = {};\n\t\tcollection = objectCollection;\n\t\tadd = (value: unknown, index: unknown): void =>\n\t\t{\n\t\t\tconst stringIndex = typeof index === 'string' ? index : String(index);\n\t\t\tobjectCollection[stringIndex] = value;\n\t\t};\n\t}\n\telse\n\t{\n\t\t// Invalid/unsupported type - this is unexpected\n\t\tconsole.error('LeUtils.getEmptySimplifiedCollection: executed on invalid/unsupported type', typeof elements, elements);\n\t\treturn [false, [], (_value: unknown, _index: unknown): void => \n\t\t{}];\n\t}\n\n\treturn [true, collection, add!];\n}\n\n/**\n * Filters collection, returning only elements matching predicate.\n *\n * @param elements - Collection to filter\n * @param callback - Predicate function (truthy = keep)\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Filtered collection (same type as input)\n */\nexport function filter(elements: unknown, callback?: (value: unknown, index: unknown) => boolean, optionalSkipHasOwnPropertyCheck: boolean = false): unknown\n{\n\tif(callback && (typeof callback !== 'function'))\n\t{\n\t\tthrow new TypeError('The given callback is not a function');\n\t}\n\tconst [success, collection, add] = getEmptySimplifiedCollection(elements);\n\tif(!success)\n\t{\n\t\treturn elements;\n\t}\n\n\teach(elements, (value: unknown, index: unknown) =>\n\t{\n\t\tif(!callback)\n\t\t{\n\t\t\tif(value)\n\t\t\t{\n\t\t\t\tadd(value, index);\n\t\t\t}\n\t\t}\n\t\telse if(callback.call(value, value, index))\n\t\t{\n\t\t\tadd(value, index);\n\t\t}\n\t}, optionalSkipHasOwnPropertyCheck);\n\n\treturn collection;\n}\n\n/**\n * Maps collection, transforming each element.\n *\n * @param elements - Collection to map\n * @param callback - Transform function\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Mapped collection (same type as input)\n */\nexport function map(elements: unknown, callback?: (value: unknown, index: unknown) => unknown, optionalSkipHasOwnPropertyCheck: boolean = false): unknown\n{\n\tif(callback && (typeof callback !== 'function'))\n\t{\n\t\tthrow new TypeError('The given callback is not a function');\n\t}\n\tconst [success, collection, add] = getEmptySimplifiedCollection(elements);\n\tif(!success)\n\t{\n\t\treturn elements;\n\t}\n\n\teach(elements, (value: unknown, index: unknown) =>\n\t{\n\t\tif(!callback)\n\t\t{\n\t\t\tadd(value, index);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tadd(callback.call(value, value, index), index);\n\t\t}\n\t}, optionalSkipHasOwnPropertyCheck);\n\n\treturn collection;\n}\n\n/**\n * Maps collection to array.\n *\n * @param elements - Collection to map\n * @param callback - Transform function\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Array of transformed values\n */\nexport function mapToArray<T = unknown>(elements: unknown, callback?: (value: unknown, index: unknown) => T, optionalSkipHasOwnPropertyCheck: boolean = false): T[]\n{\n\tif(callback && (typeof callback !== 'function'))\n\t{\n\t\tthrow new TypeError('The given callback is not a function');\n\t}\n\tconst result: T[] = [];\n\teach(elements, (value: unknown, index: unknown): void =>\n\t{\n\t\tif(!callback)\n\t\t{\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tresult.push(value as T);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.push(callback.call(value, value, index));\n\t\t}\n\t}, optionalSkipHasOwnPropertyCheck);\n\treturn result;\n}\n\n/**\n * Sorts keys by comparing values with comparator.\n *\n * @param elements - Collection to get keys from\n * @param comparator - Comparison function\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Sorted array of keys\n */\nexport function sortKeys(elements: unknown, comparator: (a: unknown, b: unknown) => number, optionalSkipHasOwnPropertyCheck: boolean = false): unknown[]\n{\n\tif(typeof comparator !== 'function')\n\t{\n\t\tthrow new TypeError('The given comparator is not a function');\n\t}\n\tconst keys: unknown[] = [];\n\teach(elements, (_value: unknown, index: unknown) =>\n\t{\n\t\tkeys.push(index);\n\t}, optionalSkipHasOwnPropertyCheck);\n\n\tkeys.sort((a, b) => comparator(getValueAtIndex(elements, a, optionalSkipHasOwnPropertyCheck), getValueAtIndex(elements, b, optionalSkipHasOwnPropertyCheck)));\n\treturn keys;\n}\n\n/**\n * Gets value at index/key from collection.\n *\n * @param elements - Collection\n * @param index - Key or index\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Value at index, or undefined\n */\nexport function getValueAtIndex(elements: unknown, index: unknown, optionalSkipHasOwnPropertyCheck: boolean = false): unknown\n{\n\tif((elements === null) || (typeof elements === 'undefined'))\n\t{\n\t\treturn undefined;\n\t}\n\n\tif(Array.isArray(elements))\n\t{\n\t\tconst numIndex = typeof index === 'number' ? index : Number(index);\n\t\tif(Number.isNaN(numIndex))\n\t\t{\n\t\t\tconsole.error('LeUtils.getValueAtIndex: invalid array index (not a number)', index);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn elements[numIndex];\n\t}\n\n\tif(elements instanceof Map)\n\t{\n\t\treturn elements.get(index);\n\t}\n\n\tif(elements instanceof Set)\n\t{\n\t\treturn index;\n\t}\n\n\tif(typeof elements !== 'string')\n\t{\n\t\tif(ArrayBuffer.isView(elements) && !(elements instanceof DataView))\n\t\t{\n\t\t\t// TypedArray - access by numeric index\n\t\t\tif(hasNumericLength(elements))\n\t\t\t{\n\t\t\t\tconst numIndex = typeof index === 'number' ? index : Number(index);\n\t\t\t\tif(Number.isNaN(numIndex))\n\t\t\t\t{\n\t\t\t\t\tconsole.error('LeUtils.getValueAtIndex: invalid TypedArray index (not a number)', index);\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn elements[numIndex];\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\t\tif(isIterable(elements))\n\t\t{\n\t\t\tlet i = 0;\n\t\t\tfor(const value of elements)\n\t\t\t{\n\t\t\t\tif(i === index)\n\t\t\t\t{\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\t\tif(hasForEach(elements))\n\t\t{\n\t\t\tlet result: unknown = undefined;\n\t\t\tlet shouldContinue = true;\n\t\t\telements.forEach((value: unknown, i: unknown) =>\n\t\t\t{\n\t\t\t\tif(shouldContinue)\n\t\t\t\t{\n\t\t\t\t\tif(i === index)\n\t\t\t\t\t{\n\t\t\t\t\t\tresult = value;\n\t\t\t\t\t\tshouldContinue = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tif((typeof elements === 'object') || (typeof elements === 'function'))\n\t{\n\t\t// Type guard: verify elements is Record-like for property access\n\t\tif(isRecordLike(elements))\n\t\t{\n\t\t\tconst propertyKey = typeof index === 'string' || typeof index === 'number' || typeof index === 'symbol' ? index : String(index);\n\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(elements, propertyKey))\n\t\t\t{\n\t\t\t\tconst stringKey = typeof propertyKey === 'string' ? propertyKey : String(propertyKey);\n\t\t\t\treturn elements[stringKey];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Flattens nested arrays to single level (like Array.flat(Infinity)).\n *\n * @param array - Array to flatten\n * @returns Flattened array\n */\nexport function flattenArray(array: unknown): unknown[]\n{\n\tif(!Array.isArray(array))\n\t{\n\t\treturn [array];\n\t}\n\n\tconst result: unknown[] = [];\n\tconst flattenRecursive = (arr: unknown): void =>\n\t{\n\t\tif(!Array.isArray(arr))\n\t\t{\n\t\t\tresult.push(arr);\n\t\t\treturn;\n\t\t}\n\t\tarr.forEach((entry: unknown) =>\n\t\t{\n\t\t\tflattenRecursive(entry);\n\t\t});\n\t};\n\n\tarray.forEach((entry: unknown) =>\n\t{\n\t\tflattenRecursive(entry);\n\t});\n\n\treturn result;\n}\n\n/**\n * Flattens any collection (arrays, Sets, Maps, objects) to single array.\n *\n * @param elements - Collection to flatten\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Flattened array\n */\nexport function flattenToArray(elements: unknown, optionalSkipHasOwnPropertyCheck: boolean = false): unknown[]\n{\n\tconst result: unknown[] = [];\n\tconst flattenRecursive = (value: unknown): void =>\n\t{\n\t\tif(Array.isArray(value))\n\t\t{\n\t\t\tvalue.forEach((entry: unknown) =>\n\t\t\t{\n\t\t\t\tflattenRecursive(entry);\n\t\t\t});\n\t\t}\n\t\telse if(supportsEach(value))\n\t\t{\n\t\t\teach(value, (v: unknown) =>\n\t\t\t{\n\t\t\t\tflattenRecursive(v);\n\t\t\t}, optionalSkipHasOwnPropertyCheck);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.push(value);\n\t\t}\n\t};\n\n\tflattenRecursive(elements);\n\treturn result;\n}\n\n/**\n * Maps and sorts collection to array.\n *\n * @param elements - Collection to process\n * @param comparator - Sort comparison function\n * @param callback - Optional transform\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Sorted array\n */\nexport function mapToArraySorted(elements: unknown, comparator: (a: unknown, b: unknown) => number, callback?: (value: unknown, key: unknown) => unknown, optionalSkipHasOwnPropertyCheck: boolean = false): unknown[]\n{\n\tif(callback && (typeof callback !== 'function'))\n\t{\n\t\tthrow new TypeError('The given callback is not a function');\n\t}\n\tconst keys = sortKeys(elements, comparator, optionalSkipHasOwnPropertyCheck);\n\tconst result: unknown[] = [];\n\tfor(const key of keys)\n\t{\n\t\tconst value = getValueAtIndex(elements, key, optionalSkipHasOwnPropertyCheck);\n\t\tif(!callback)\n\t\t{\n\t\t\tresult.push(value);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult.push(callback.call(value, value, key));\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Generic comparison function for sorting.\n *\n * @param a - First value\n * @param b - Second value\n * @returns -1 if a < b, 1 if a > b, 0 if equal\n */\nexport function compare(a: unknown, b: unknown): number\n{\n\t// compare() accepts any types and uses JavaScript's native comparison operators\n\t// We can't avoid type coercion here as the function is designed to work with any types\n\t// Use Function.prototype.call to compare without type assertions\n\tconst compareResult = (valueA: unknown, valueB: unknown): number =>\n\t{\n\t\t// Use JavaScript's native comparison (handles type coercion automatically)\n\t\t// @ts-ignore - Intentional: compare() is designed to work with any types using native JS comparison\n\t\tif(valueA < valueB)\n\t\t{\n\t\t\treturn -1;\n\t\t}\n\t\t// @ts-ignore - Intentional: compare() is designed to work with any types using native JS comparison\n\t\tif(valueA > valueB)\n\t\t{\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t};\n\treturn compareResult(a, b);\n}\n\n/**\n * Compares two numbers (for sorting).\n *\n * @param a - First number\n * @param b - Second number\n * @returns Difference (a - b)\n */\nexport function compareNumbers(a: number, b: number): number\n{\n\treturn a - b;\n}\n\n/**\n * Compares two numeric strings (like version numbers).\n * Splits on '.', compares each part numerically considering length.\n *\n * @param a - First numeric string\n * @param b - Second numeric string\n * @returns Comparison result\n */\nexport function compareNumericStrings(a: string | number, b: string | number): number\n{\n\tconst aParts = STRING(a).split('.');\n\tconst bParts = STRING(b).split('.');\n\n\tfor(let i = 0; i < Math.min(aParts.length, bParts.length); i++)\n\t{\n\t\tconst aPart = aParts[i]!.trim();\n\t\tconst bPart = bParts[i]!.trim();\n\n\t\tif(aPart.length !== bPart.length)\n\t\t{\n\t\t\treturn (aPart.length < bPart.length) ? -1 : 1;\n\t\t}\n\t\tif(aPart !== bPart)\n\t\t{\n\t\t\treturn (aPart < bPart) ? -1 : 1;\n\t\t}\n\t}\n\n\tif(aParts.length !== bParts.length)\n\t{\n\t\treturn (aParts.length < bParts.length) ? -1 : 1;\n\t}\n\n\treturn 0;\n}\n\n/**\n * Natural string comparison (numbers in strings compared numerically).\n * \"file5.txt\" sorts before \"file10.txt\".\n *\n * @param a - First string\n * @param b - Second string\n * @returns Comparison result\n */\nexport function compareNaturalStrings(a: string, b: string): number\n{\n\tconst re = /(\\d+|\\D+)/g; // Split into runs of digits or non-digits\n\tconst aTokens = a.match(re) ?? [];\n\tconst bTokens = b.match(re) ?? [];\n\n\tconst len = Math.min(aTokens.length, bTokens.length);\n\tfor(let i = 0; i < len; i++)\n\t{\n\t\tconst x = aTokens[i]!;\n\t\tconst y = bTokens[i]!;\n\n\t\tif(x === y)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If both are numbers, compare numerically\n\t\tconst nx = parseInt(x, 10);\n\t\tconst ny = parseInt(y, 10);\n\t\tif(!isNaN(nx) && !isNaN(ny))\n\t\t{\n\t\t\treturn nx - ny;\n\t\t}\n\n\t\t// Otherwise compare lexically\n\t\treturn x < y ? -1 : 1;\n\t}\n\n\treturn aTokens.length - bTokens.length;\n}\n\n/**\n * Checks if object is empty (no own properties).\n *\n * @param obj - Object to check\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns true if empty\n */\nexport function isEmptyObject(obj: unknown, optionalSkipHasOwnPropertyCheck: boolean = false): boolean\n{\n\tif(obj === null || typeof obj !== 'object')\n\t{\n\t\treturn true;\n\t}\n\t// Type guard: obj is already verified as object, can iterate\n\tif (isRecordLike(obj))\n\t{\n\t\tfor(const field in obj)\n\t\t{\n\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(obj, field))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Counts own properties in object.\n *\n * @param obj - Object to count\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Number of own properties\n */\nexport function getObjectFieldsCount(obj: unknown, optionalSkipHasOwnPropertyCheck: boolean = false): number\n{\n\tif(obj === null || typeof obj !== 'object')\n\t{\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\t// Type guard: obj is already verified as object\n\tif (isRecordLike(obj))\n\t{\n\t\tfor(const field in obj)\n\t\t{\n\t\t\tif((optionalSkipHasOwnPropertyCheck === true) || Object.prototype.hasOwnProperty.call(obj, field))\n\t\t\t{\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t}\n\treturn count;\n}\n\n/**\n * Capitalizes first character of string.\n *\n * @param string - String to capitalize\n * @returns Capitalized string\n */\nexport function capitalize(string: unknown): string\n{\n\tconst str = STRING(string).trim();\n\tif(str.length <= 0)\n\t{\n\t\treturn str;\n\t}\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Checks if string ends with any of the given suffixes.\n *\n * @param string - String to check\n * @param endingCharsStringOrArray - String of chars or array of suffixes\n * @returns true if ends with any\n */\nexport function endsWithAny(string: unknown, endingCharsStringOrArray: string | string[]): boolean\n{\n\tconst str = STRING(string);\n\tlet endingCharsArray: string[];\n\n\tif(Array.isArray(endingCharsStringOrArray))\n\t{\n\t\tendingCharsArray = endingCharsStringOrArray;\n\t}\n\telse\n\t{\n\t\tendingCharsArray = STRING(endingCharsStringOrArray).split('');\n\t}\n\n\tlet result = false;\n\teach(endingCharsArray, (chars: unknown) =>\n\t{\n\t\tif(str.endsWith(STRING(chars)))\n\t\t{\n\t\t\tresult = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\n\treturn result;\n}\n\n/**\n * Checks if string starts with any of the given prefixes.\n *\n * @param string - String to check\n * @param startingCharsStringOrArray - String of chars or array of prefixes\n * @returns true if starts with any\n */\nexport function startsWithAny(string: unknown, startingCharsStringOrArray: string | string[]): boolean\n{\n\tconst str = STRING(string);\n\tlet startingCharsArray: string[];\n\n\tif(Array.isArray(startingCharsStringOrArray))\n\t{\n\t\tstartingCharsArray = startingCharsStringOrArray;\n\t}\n\telse\n\t{\n\t\tstartingCharsArray = STRING(startingCharsStringOrArray).split('');\n\t}\n\n\tlet result = false;\n\teach(startingCharsArray, (chars: unknown) =>\n\t{\n\t\tif(str.startsWith(STRING(chars)))\n\t\t{\n\t\t\tresult = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\n\treturn result;\n}\n\n/**\n * Trims specific characters from end of string.\n *\n * @param string - String to trim\n * @param trimCharsStringOrArray - Characters to remove\n * @returns Trimmed string\n */\nexport function trimEnd(string: unknown, trimCharsStringOrArray: string | string[]): string\n{\n\tlet str = STRING(string);\n\tlet endingCharsArray: string[];\n\n\tif(Array.isArray(trimCharsStringOrArray))\n\t{\n\t\tendingCharsArray = trimCharsStringOrArray;\n\t}\n\telse\n\t{\n\t\tendingCharsArray = STRING(trimCharsStringOrArray).split('');\n\t}\n\n\tlet run = true;\n\tconst trimChars = (chars: unknown): void =>\n\t{\n\t\tconst charsStr = STRING(chars);\n\t\tif(str.endsWith(charsStr))\n\t\t{\n\t\t\tstr = str.substring(0, str.length - charsStr.length);\n\t\t\trun = true;\n\t\t}\n\t};\n\n\twhile(run)\n\t{\n\t\trun = false;\n\t\teach(endingCharsArray, trimChars);\n\t}\n\n\treturn str;\n}\n\n/**\n * Trims specific characters from start of string.\n *\n * @param string - String to trim\n * @param trimCharsStringOrArray - Characters to remove\n * @returns Trimmed string\n */\nexport function trimStart(string: unknown, trimCharsStringOrArray: string | string[]): string\n{\n\tlet str = STRING(string);\n\tlet startingCharsArray: string[];\n\n\tif(Array.isArray(trimCharsStringOrArray))\n\t{\n\t\tstartingCharsArray = trimCharsStringOrArray;\n\t}\n\telse\n\t{\n\t\tstartingCharsArray = STRING(trimCharsStringOrArray).split('');\n\t}\n\n\tlet run = true;\n\tconst trimChars = (chars: unknown): void =>\n\t{\n\t\tconst charsStr = STRING(chars);\n\t\tif(str.startsWith(charsStr))\n\t\t{\n\t\t\tstr = str.substring(charsStr.length);\n\t\t\trun = true;\n\t\t}\n\t};\n\n\twhile(run)\n\t{\n\t\trun = false;\n\t\teach(startingCharsArray, trimChars);\n\t}\n\n\treturn str;\n}\n\n/**\n * Trims specific characters from both ends of string.\n *\n * @param string - String to trim\n * @param trimCharsStringOrArray - Characters to remove\n * @returns Trimmed string\n */\nexport function trim(string: unknown, trimCharsStringOrArray: string | string[]): string\n{\n\treturn trimStart(trimEnd(string, trimCharsStringOrArray), trimCharsStringOrArray);\n}\n\n/**\n * Checks if collection contains value (string comparison).\n *\n * @param array - Collection to search\n * @param value - Value to find\n * @returns true if found\n */\nexport function contains(array: unknown, value: unknown): boolean\n{\n\tif(!array)\n\t{\n\t\treturn false;\n\t}\n\tlet result = false;\n\tconst valueStr = STRING(value);\n\teach(array, (val: unknown) =>\n\t{\n\t\tif(STRING(val) === valueStr)\n\t\t{\n\t\t\tresult = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * Checks if collection contains value (case-insensitive).\n *\n * @param array - Collection to search\n * @param value - Value to find\n * @returns true if found\n */\nexport function containsCaseInsensitive(array: unknown, value: unknown): boolean\n{\n\tif(!array)\n\t{\n\t\treturn false;\n\t}\n\tlet result = false;\n\tconst valueStr = STRING(value).toLowerCase();\n\teach(array, (val: unknown) =>\n\t{\n\t\tif(STRING(val).toLowerCase() === valueStr)\n\t\t{\n\t\t\tresult = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * Checks if collection contains all given values.\n *\n * @param array - Collection to search\n * @param values - Values to find\n * @returns true if all found\n */\nexport function containsAll(array: unknown, values: unknown): boolean\n{\n\tif(!array)\n\t{\n\t\treturn false;\n\t}\n\tlet result = true;\n\teach(values, (value: unknown) =>\n\t{\n\t\tif(!contains(array, value))\n\t\t{\n\t\t\tresult = false;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * Checks if collection contains any of given values.\n *\n * @param array - Collection to search\n * @param values - Values to find\n * @returns true if any found\n */\nexport function containsAny(array: unknown, values: unknown): boolean\n{\n\tif(!array)\n\t{\n\t\treturn false;\n\t}\n\tlet result = false;\n\teach(values, (value: unknown) =>\n\t{\n\t\tif(contains(array, value))\n\t\t{\n\t\t\tresult = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * Checks if collection contains none of given values.\n *\n * @param array - Collection to search\n * @param values - Values to check\n * @returns true if none found\n */\nexport function containsNone(array: unknown, values: unknown): boolean\n{\n\tif(!array)\n\t{\n\t\treturn true;\n\t}\n\tlet result = true;\n\teach(values, (value: unknown) =>\n\t{\n\t\tif(contains(array, value))\n\t\t{\n\t\t\tresult = false;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * Finds first element matching predicate, returns {index, value}.\n *\n * @param elements - Collection to search\n * @param callback - Predicate function\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns {index, value} or null\n */\nexport function findIndexValue(elements: unknown, callback: (value: unknown, index: unknown) => boolean, optionalSkipHasOwnPropertyCheck: boolean = false): {index: unknown; value: unknown} | null\n{\n\tif(typeof callback !== 'function')\n\t{\n\t\tthrow new TypeError('The given callback is not a function');\n\t}\n\tlet result: {index: unknown; value: unknown} | null = null;\n\teach(elements, (value: unknown, index: unknown) =>\n\t{\n\t\t// Type guard: verify elements is Record-like for callback context\n\t\tif(isRecordLike(elements))\n\t\t{\n\t\t\tconst propertyKey = typeof index === 'string' || typeof index === 'number' || typeof index === 'symbol' ? index : String(index);\n\t\t\tconst stringKey = typeof propertyKey === 'string' ? propertyKey : String(propertyKey);\n\t\t\tconst elementValue = elements[stringKey];\n\t\t\tif(callback.call(elementValue, elementValue, index))\n\t\t\t{\n\t\t\t\tresult = {index, value};\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// For non-record-like elements, use value directly\n\t\t\tif(callback.call(value, value, index))\n\t\t\t{\n\t\t\t\tresult = {index, value};\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}, optionalSkipHasOwnPropertyCheck);\n\treturn result;\n}\n\n/**\n * Finds first element matching predicate, returns index.\n *\n * @param elements - Collection to search\n * @param callback - Predicate function\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Index/key or null\n */\nexport function findIndex(elements: unknown, callback: (value: unknown, index: unknown) => boolean, optionalSkipHasOwnPropertyCheck: boolean = false): unknown\n{\n\treturn findIndexValue(elements, callback, optionalSkipHasOwnPropertyCheck)?.index ?? null;\n}\n\n/**\n * Finds first element matching predicate, returns value.\n *\n * @param elements - Collection to search\n * @param callback - Predicate function\n * @param optionalSkipHasOwnPropertyCheck - Skip hasOwnProperty\n * @returns Value or null\n */\nexport function find(elements: unknown, callback: (value: unknown, index: unknown) => boolean, optionalSkipHasOwnPropertyCheck: boolean = false): unknown\n{\n\treturn findIndexValue(elements, callback, optionalSkipHasOwnPropertyCheck)?.value ?? null;\n}\n\n/**\n * Generates a base64 string (with +/ replaced by -_) that is guaranteed to be unique.\n *\n * @returns Unique ID string\n */\nexport const uniqueId: () => string = (() =>\n{\n\tlet previousUniqueIdsTime: number | null = null;\n\tconst previousUniqueIds = new Map<string, boolean>();\n\n\tconst generateUniqueId = (): {time: number; id: string} =>\n\t{\n\t\tlet now: number | null = null;\n\t\ttry\n\t\t{\n\t\t\t// @ts-ignore -- performance might not exist or might not have legacy timing API\n\t\t\t// Type guard: check if performance has timing property (legacy API)\n\t\t\tlet timingNavStart = 0;\n\t\t\tif(hasPerformanceTiming(performance) && 'timing' in performance && performance.timing)\n\t\t\t{\n\t\t\t\tconst timing = performance.timing;\n\t\t\t\tif('navigationStart' in timing && typeof timing.navigationStart === 'number')\n\t\t\t\t{\n\t\t\t\t\ttimingNavStart = timing.navigationStart;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst timeOrigin = hasPerformanceTiming(performance) && 'timeOrigin' in performance && typeof performance.timeOrigin === 'number' ? performance.timeOrigin : 0;\n\t\t\tconst nowFunc = hasPerformanceTiming(performance) && 'now' in performance && typeof performance.now === 'function' ? performance.now : ((): number => 0);\n\t\t\tnow = timeOrigin || timingNavStart || 0;\n\t\t\tnow = now + nowFunc();\n\t\t}\n\t\tcatch\n\t\t{\n\t\t\t// Ignore error\n\t\t}\n\t\tnow = now || Date.now();\n\t\tnow = Math.round(now);\n\t\tconst nowBytes = numberToBytes(now);\n\n\t\tlet uuid: Uint8Array | null = null;\n\t\ttry\n\t\t{\n\t\t\tif(typeof crypto?.randomUUID === 'function')\n\t\t\t{\n\t\t\t\tuuid = base64ToBytes(hexToBase64(crypto.randomUUID()));\n\t\t\t}\n\t\t}\n\t\tcatch\n\t\t{\n\t\t\t// Ignore error\n\t\t}\n\n\t\tif(!uuid)\n\t\t{\n\t\t\tconst bytesChunkA = numberToBytes(Number((Math.random() + ' ').substring(2, 12).padEnd(10, '0')));\n\t\t\tconst bytesChunkB = numberToBytes(Number((Math.random() + ' ').substring(2, 12).padEnd(10, '0')));\n\t\t\tconst bytesChunkC = numberToBytes(Number((Math.random() + ' ').substring(2, 12).padEnd(10, '0')));\n\t\t\tconst bytesChunkD = numberToBytes(Number((Math.random() + ' ').substring(2, 12).padEnd(10, '0')));\n\t\t\tuuid = new Uint8Array(bytesChunkA.length + bytesChunkB.length + bytesChunkC.length + bytesChunkD.length);\n\t\t\tuuid.set(bytesChunkA, 0);\n\t\t\tuuid.set(bytesChunkB, bytesChunkA.length);\n\t\t\tuuid.set(bytesChunkC, bytesChunkA.length + bytesChunkB.length);\n\t\t\tuuid.set(bytesChunkD, bytesChunkA.length + bytesChunkB.length + bytesChunkC.length);\n\t\t}\n\n\t\tconst bytes = new Uint8Array(nowBytes.length + uuid.length);\n\t\tbytes.set(nowBytes, 0);\n\t\tbytes.set(uuid, nowBytes.length);\n\t\tconst finalUuid = bytesToBase64(bytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');\n\n\t\treturn {\n\t\t\ttime: now,\n\t\t\tid: finalUuid,\n\t\t};\n\t};\n\n\treturn (): string =>\n\t{\n\t\twhile(true)\n\t\t{\n\t\t\tconst result = generateUniqueId();\n\t\t\tif(previousUniqueIdsTime !== result.time)\n\t\t\t{\n\t\t\t\tpreviousUniqueIdsTime = result.time;\n\t\t\t\tpreviousUniqueIds.clear();\n\t\t\t\tpreviousUniqueIds.set(result.id, true);\n\t\t\t\treturn result.id;\n\t\t\t}\n\t\t\telse if(previousUniqueIds.get(result.id) !== true)\n\t\t\t{\n\t\t\t\tpreviousUniqueIds.set(result.id, true);\n\t\t\t\treturn result.id;\n\t\t\t}\n\t\t}\n\t};\n})();\n\n/**\n * Generates a base64 string (with +/ replaced by -_) of the current time.\n *\n * @param now - Optional time to use\n * @returns Timestamp string\n */\nexport const timestamp: (now?: number | null) => string = (() =>\n{\n\treturn (now: number | null = null): string =>\n\t{\n\t\tlet time: number;\n\t\tif(ISSET(now))\n\t\t{\n\t\t\ttime = FLOAT_LAX(now);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlet performanceNow: number | null = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\t// @ts-ignore -- performance might not exist or might not have legacy timing API\n\t\t\t\t// Type guard: check if performance has timing property (legacy API)\n\t\t\t\tlet timingNavStart = 0;\n\t\t\t\tif(performance && hasPerformanceTiming(performance) && 'timing' in performance)\n\t\t\t\t{\n\t\t\t\t\tconst timing = safeGetProperty(performance, 'timing');\n\t\t\t\t\tif(timing && typeof timing === 'object' && timing !== null)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst navStart = safeGetProperty(timing, 'navigationStart');\n\t\t\t\t\t\tif(typeof navStart === 'number')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttimingNavStart = navStart;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst timeOrigin = performance && hasPerformanceTiming(performance) && 'timeOrigin' in performance ? safeGetProperty(performance, 'timeOrigin') : undefined;\n\t\t\t\tconst nowFunc = performance && hasPerformanceTiming(performance) && 'now' in performance ? safeGetProperty(performance, 'now') : undefined;\n\t\t\t\tconst timeOriginVal = typeof timeOrigin === 'number' ? timeOrigin : 0;\n\t\t\t\tconst nowFuncVal = typeof nowFunc === 'function' ? nowFunc() : 0;\n\t\t\t\tperformanceNow = timeOriginVal || timingNavStart || 0;\n\t\t\t\tperformanceNow = performanceNow + nowFuncVal;\n\t\t\t}\n\t\t\tcatch\n\t\t\t{\n\t\t\t\t// Ignore error\n\t\t\t}\n\t\t\ttime = performanceNow || Date.now();\n\t\t}\n\t\ttime = Math.round(time);\n\t\tconst nowBytes = numberToBytes(time);\n\t\treturn bytesToBase64(nowBytes).replaceAll('=', '').replaceAll('+', '-').replaceAll('/', '_');\n\t};\n})();\n\n/**\n * Checks if value is a generator function.\n *\n * @param value - Value to check\n * @returns true if generator, false otherwise\n */\nexport const isGeneratorFunction: (value: unknown) => boolean = (() =>\n{\n\tconst GeneratorFunction = (function* (): Generator \n\t{}).constructor;\n\tconst AsyncGeneratorFunction = (async function* (): AsyncGenerator \n\t{}).constructor;\n\n\treturn (func: unknown): boolean =>\n\t{\n\t\tif(typeof func !== 'function')\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\t// Type guard: verify func has constructor property\n\t\tif (!hasConstructor(func))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tconst constructor = func.constructor;\n\t\treturn (constructor === GeneratorFunction || constructor === AsyncGeneratorFunction);\n\t};\n})();\n\n/**\n * Environment-safe btoa.\n *\n * @param str - String to encode\n * @returns Base64 string\n */\nexport function btoa(str: string): string\n{\n\tif(typeof globalThis.btoa === 'function')\n\t{\n\t\treturn globalThis.btoa(str);\n\t}\n\t// Node.js fallback\n\t// @ts-ignore -- Buffer might not be defined in non-Node environments\n\tif(typeof globalThis.Buffer?.from === 'function')\n\t{\n\t\t// @ts-ignore -- Buffer might not be defined in non-Node environments\n\t\treturn globalThis.Buffer.from(str, 'binary').toString('base64');\n\t}\n\tthrow new Error('LeUtils.btoa: No btoa implementation found');\n}\n\n/**\n * Environment-safe atob.\n *\n * @param str - Base64 string to decode\n * @returns Decoded string\n */\nexport function atob(str: string): string\n{\n\tif(typeof globalThis.atob === 'function')\n\t{\n\t\treturn globalThis.atob(str);\n\t}\n\t// Node.js fallback\n\t// @ts-ignore -- Buffer might not be defined in non-Node environments\n\tif(typeof globalThis.Buffer?.from === 'function')\n\t{\n\t\t// @ts-ignore -- Buffer might not be defined in non-Node environments\n\t\treturn globalThis.Buffer.from(str, 'base64').toString('binary');\n\t}\n\tthrow new Error('LeUtils.atob: No atob implementation found');\n}\n\n/**\n * Encodes a UTF-8 string into a base64 string.\n *\n * @param string - UTF-8 string\n * @returns Base64 string\n */\nexport function utf8ToBase64(string: string): string\n{\n\treturn btoa(encodeURIComponent(string).replace(/%([0-9A-F]{2})/g, (_match, p1) => String.fromCharCode(parseInt(p1, 16))));\n}\n\n/**\n * Decodes a base64 string back into a UTF-8 string.\n *\n * @param base64string - Base64 string\n * @returns Decoded UTF-8 string\n */\nexport function base64ToUtf8(base64string: string): string\n{\n\treturn decodeURIComponent(atob(base64string.trim()).split('').map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''));\n}\n\n/**\n * Converts a base64 string into a hex string.\n *\n * @param base64string - Base64 string\n * @returns Hex string\n */\nexport function base64ToHex(base64string: string): string\n{\n\treturn atob(base64string.trim()).split('').map((c) => ('0' + c.charCodeAt(0).toString(16)).slice(-2)).join('');\n}\n\n/**\n * Converts a hex string into a base64 string.\n *\n * @param hexstring - Hex string\n * @returns Base64 string\n */\nexport function hexToBase64(hexstring: string): string\n{\n\tconst hexResult = hexstring.replace(/[^0-9A-F]/gi, '').match(/\\w{2}/g)?.map((a) => String.fromCharCode(parseInt(a, 16)))?.join('');\n\tif(!hexResult)\n\t{\n\t\tthrow new Error('Invalid hex string: \"' + hexstring + '\"');\n\t}\n\treturn btoa(hexResult);\n}\n\n/**\n * Converts a base64 string into bytes (Uint8Array).\n *\n * @param base64string - Base64 string\n * @returns Bytes\n */\nexport function base64ToBytes(base64string: string): Uint8Array\n{\n\tconst binary = atob(base64string.trim());\n\tconst len = binary.length;\n\tconst data = new Uint8Array(len);\n\tfor(let i = 0; i < len; i++)\n\t{\n\t\tdata[i] = binary.charCodeAt(i);\n\t}\n\treturn data;\n}\n\n/**\n * Converts bytes into a base64 string.\n *\n * @param arraybuffer - Bytes source\n * @returns Base64 string\n */\nexport function bytesToBase64(arraybuffer: ArrayLike<number> | ArrayBuffer): string\n{\n\tconst bytes = new Uint8Array(arraybuffer);\n\tconst len = bytes.byteLength;\n\tlet binary = '';\n\tfor(let i = 0; i < len; i++)\n\t{\n\t\tbinary += String.fromCharCode(bytes[i]!);\n\t}\n\treturn btoa(binary);\n}\n\n/**\n * Executes callback after ms. Delta time in seconds passed to callback.\n *\n * @param callback - Function to call\n * @param ms - Milliseconds to wait\n * @returns Handler with remove() method\n */\nexport function setTimeout(callback: (deltaTime: number) => unknown, ms: number): {remove: () => void}\n{\n\tif(!globalThis?.setTimeout || !globalThis?.clearTimeout)\n\t{\n\t\tconsole.warn('LeUtils.setTimeout: Not supported.');\n\t\treturn {remove: (): void => \n\t\t{}};\n\t}\n\n\tconst msVal = FLOAT_LAX(ms);\n\tlet lastTime = globalThis?.performance?.now?.() ?? 0;\n\t// Type guard: verify globalThis has setTimeout\n\tif(!hasSetTimeout(globalThis))\n\t{\n\t\tconsole.error('LeUtils.setTimeout: globalThis.setTimeout is not available');\n\t\treturn {remove: (): void => \n\t\t{}};\n\t}\n\t// @ts-ignore - handler type varies between Node.js (Timeout) and browser (number), using ReturnType below\n\tlet handler: ReturnType<typeof globalThis.setTimeout> | null = globalThis.setTimeout(() =>\n\t{\n\t\tconst currentTime = globalThis?.performance?.now?.() ?? 0;\n\t\ttry\n\t\t{\n\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t}\n\t\tcatch(e)\n\t\t{\n\t\t\tconsole.error(e);\n\t\t}\n\t\tlastTime = currentTime;\n\t}, msVal);\n\n\treturn {\n\t\tremove: (): void =>\n\t\t{\n\t\t\tif(handler !== null)\n\t\t\t{\n\t\t\t\tglobalThis.clearTimeout(handler);\n\t\t\t\thandler = null;\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Executes callback every intervalMs. Delta time in seconds passed to callback.\n *\n * @param callback - Function to call\n * @param intervalMs - Interval in milliseconds\n * @param fireImmediately - Whether to call immediately\n * @returns Handler with remove() method\n */\nexport function setInterval(callback: (deltaTime: number) => unknown, intervalMs: number = 1000, fireImmediately: boolean = false): {remove: () => void}\n{\n\tconst msVal = FLOAT_LAX_ANY(intervalMs, 1000);\n\n\tif(fireImmediately)\n\t{\n\t\ttry\n\t\t{\n\t\t\tcallback(0);\n\t\t}\n\t\tcatch(e)\n\t\t{\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\n\tif(!globalThis?.setInterval || !globalThis?.clearInterval)\n\t{\n\t\tconsole.warn('LeUtils.setInterval: Not supported.');\n\t\treturn {remove: (): void => \n\t\t{}};\n\t}\n\n\tlet lastTime = globalThis?.performance?.now?.() ?? 0;\n\t// Type guard: verify globalThis has setInterval\n\tif(!hasSetInterval(globalThis))\n\t{\n\t\tconsole.error('LeUtils.setInterval: globalThis.setInterval is not available');\n\t\treturn {remove: (): void => \n\t\t{}};\n\t}\n\t// @ts-ignore - handler type varies between Node.js (Timeout) and browser (number), using ReturnType below\n\tlet handler: ReturnType<typeof globalThis.setInterval> | null = globalThis.setInterval(() =>\n\t{\n\t\tconst currentTime = globalThis?.performance?.now?.() ?? 0;\n\t\ttry\n\t\t{\n\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t}\n\t\tcatch(e)\n\t\t{\n\t\t\tconsole.error(e);\n\t\t}\n\t\tlastTime = currentTime;\n\t}, msVal);\n\n\treturn {\n\t\tremove: (): void =>\n\t\t{\n\t\t\tif(handler !== null)\n\t\t\t{\n\t\t\t\tglobalThis.clearInterval(handler);\n\t\t\t\thandler = null;\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Executes callback after frames. Delta time in seconds passed to callback.\n *\n * @param callback - Function to call\n * @param frames - Number of frames to wait\n * @returns Handler with remove() method\n */\nexport function setAnimationFrameTimeout(callback: (deltaTime: number) => unknown, frames: number = 1): {remove: () => void}\n{\n\tif(!globalThis?.requestAnimationFrame || !globalThis?.cancelAnimationFrame)\n\t{\n\t\tconsole.warn('LeUtils.setAnimationFrameTimeout: Not supported.');\n\t\treturn {remove: (): void => \n\t\t{}};\n\t}\n\n\tlet framesLeft = INT_LAX_ANY(frames, 1);\n\tlet run = true;\n\tlet requestAnimationFrameId: number | null = null;\n\tlet lastTime = globalThis?.performance?.now?.() ?? 0;\n\n\tconst tick = (): void =>\n\t{\n\t\tif(run)\n\t\t{\n\t\t\tif(framesLeft <= 0)\n\t\t\t{\n\t\t\t\trun = false;\n\t\t\t\trequestAnimationFrameId = null;\n\t\t\t\tconst currentTime = globalThis?.performance?.now?.() ?? 0;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback((currentTime - lastTime) / 1000);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t\tlastTime = currentTime;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tframesLeft--;\n\t\t\trequestAnimationFrameId = globalThis.requestAnimationFrame(tick);\n\t\t}\n\t};\n\ttick();\n\n\treturn {\n\t\tremove: (): void =>\n\t\t{\n\t\t\trun = false;\n\t\t\tif(requestAnimationFrameId !== null)\n\t\t\t{\n\t\t\t\tglobalThis.cancelAnimationFrame(requestAnimationFrameId);\n\t\t\t\trequestAnimationFrameId = null;\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Executes callback every intervalFrames. Delta time in seconds passed to callback.\n *\n * @param callback - Function to call\n * @param intervalFrames - Interval in frames\n * @param fireImmediately - Whether to call immediately\n * @returns Handler with remove() method\n */\nexport function setAnimationFrameInterval(callback: (deltaTime: number) => unknown, intervalFrames: number = 1, fireImmediately: boolean = false): {remove: () => void}\n{\n\tconst iFrames = INT_LAX_ANY(intervalFrames, 1);\n\n\tif(fireImmediately)\n\t{\n\t\ttry\n\t\t{\n\t\t\tcallback(0);\n\t\t}\n\t\tcatch(e)\n\t\t{\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\n\tif(!globalThis?.requestAnimationFrame || !globalThis?.cancelAnimationFrame)\n\t{\n\t\tconsole.warn('LeUtils.setAnimationFrameInterval: Not supported.');\n\t\treturn {remove: (): void => \n\t\t{}};\n\t}\n\n\tlet run = true;\n\tlet requestAnimationFrameId: number | null = null;\n\tlet lastTimestamp = 0;\n\tlet totalTime = 0;\n\tlet frames = iFrames;\n\n\tconst tick = (timestampVal: number): void =>\n\t{\n\t\tif(run)\n\t\t{\n\t\t\tif(lastTimestamp === 0)\n\t\t\t{\n\t\t\t\tlastTimestamp = timestampVal;\n\t\t\t}\n\t\t\ttotalTime += (timestampVal - lastTimestamp);\n\t\t\tlastTimestamp = timestampVal;\n\n\t\t\tframes--;\n\t\t\tif(frames <= 0)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tcallback(totalTime / 1000);\n\t\t\t\t}\n\t\t\t\tcatch(e)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t\ttotalTime = 0;\n\t\t\t\tframes = iFrames;\n\t\t\t}\n\n\t\t\tif(run)\n\t\t\t{\n\t\t\t\trequestAnimationFrameId = globalThis.requestAnimationFrame(tick);\n\t\t\t}\n\t\t}\n\t};\n\tglobalThis.requestAnimationFrame(tick);\n\n\treturn {\n\t\tremove: (): void =>\n\t\t{\n\t\t\trun = false;\n\t\t\tif(requestAnimationFrameId !== null)\n\t\t\t{\n\t\t\t\tglobalThis.cancelAnimationFrame(requestAnimationFrameId);\n\t\t\t\trequestAnimationFrameId = null;\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Returns a promise resolved after ms.\n *\n * @param ms - Milliseconds to wait\n * @returns Promise resolving to delta time\n */\nexport function promiseTimeout(ms: number): Promise<number>\n{\n\tconst msVal = FLOAT_LAX(ms);\n\tif(msVal <= 0)\n\t{\n\t\treturn Promise.resolve(0);\n\t}\n\treturn new Promise((resolve) => setTimeout(resolve, msVal));\n}\n\n/**\n * Returns a promise resolved after frames.\n *\n * @param frames - Number of frames to wait\n * @returns Promise resolving to delta time\n */\nexport function promiseAnimationFrameTimeout(frames: number): Promise<number>\n{\n\tconst iFrames = INT_LAX(frames);\n\tif(iFrames <= 0)\n\t{\n\t\treturn Promise.resolve(0);\n\t}\n\treturn new Promise((resolve) => setAnimationFrameTimeout(resolve, iFrames));\n}\n\n/**\n * Fetch with retry and abort functionality.\n *\n * @param url - URL to fetch\n * @param options - Fetch options including retries and delay\n * @returns Object with then(), catch(), finally(), remove(), isRemoved()\n */\nexport function fetch(url: string, options?: unknown): {\n\tthen: (onfulfilled?: (value: Response) => unknown, onrejected?: (reason: unknown) => unknown) => unknown;\n\tcatch: (onrejected?: (reason: unknown) => unknown) => unknown;\n\tfinally: (onfinally?: () => unknown) => unknown;\n\tremove: () => unknown;\n\tisRemoved: () => boolean;\n}\n{\n\tlet currentRetries = 0;\n\t// Type guard: check if options has retries property\n\tconst retriesValue = isRecordLike(options) && 'retries' in options ? options.retries : undefined;\n\tconst retries = INT_LAX(retriesValue);\n\n\tlet controllerAborted = false;\n\tlet controller: AbortController | null = null;\n\tif(globalThis?.AbortController)\n\t{\n\t\tcontroller = new AbortController();\n\t}\n\n\tlet promise = (async(): Promise<Response> =>\n\t{\n\t\tconst attemptFetch = async(): Promise<Response> =>\n\t\t{\n\t\t\tif(controllerAborted || controller?.signal?.aborted)\n\t\t\t{\n\t\t\t\tthrow new Error('Aborted');\n\t\t\t}\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tconst response = await globalThis.fetch(url, {\n\t\t\t\t\tsignal: controller?.signal,\n\t\t\t\t\t...(isRecordLike(options) ? options : {}),\n\t\t\t\t\t// @ts-ignore -- removing custom options from standard fetch options\n\t\t\t\t\tretries: undefined,\n\t\t\t\t\t// @ts-ignore -- removing custom options from standard fetch options\n\t\t\t\t\tdelay: undefined,\n\t\t\t\t});\n\t\t\t\tif(!response.ok)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error('Network request failed: ' + response.status + ' ' + response.statusText);\n\t\t\t\t}\n\t\t\t\treturn response;\n\t\t\t}\n\t\t\tcatch(error)\n\t\t\t{\n\t\t\t\tif(controllerAborted || controller?.signal?.aborted)\n\t\t\t\t{\n\t\t\t\t\tthrow new Error('Aborted');\n\t\t\t\t}\n\t\t\t\tif(currentRetries >= retries)\n\t\t\t\t{\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tcurrentRetries++;\n\t\t\t\t// Type guard: check if delay is a function or a value\n\t\t\t\tconst delayValue = isRecordLike(options) && 'delay' in options ? options.delay : undefined;\n\t\t\t\tconst delay = typeof delayValue === 'function' ? INT_LAX_ANY(delayValue(currentRetries), 500) : INT_LAX_ANY(delayValue, 500);\n\t\t\t\tawait promiseTimeout(delay);\n\t\t\t\treturn await attemptFetch();\n\t\t\t}\n\t\t};\n\t\treturn await attemptFetch();\n\t})();\n\n\tconst result: {\n\t\tthen: (onfulfilled?: (value: Response) => unknown, onrejected?: (reason: unknown) => unknown) => unknown;\n\t\tcatch: (onrejected?: (reason: unknown) => unknown) => unknown;\n\t\tfinally: (onfinally?: () => unknown) => unknown;\n\t\tremove: () => unknown;\n\t\tisRemoved: () => boolean;\n\t} = {\n\t\tthen: () => result,\n\t\tcatch: () => result,\n\t\tfinally: () => result,\n\t\tremove: () => undefined,\n\t\tisRemoved: () => false,\n\t};\n\tresult.then = (...args: [((value: Response) => unknown)?, ((reason: unknown) => unknown)?]): unknown =>\n\t{\n\t\t// Type guard: verify promise is a Promise before chaining\n\t\tif(isPromise(promise))\n\t\t{\n\t\t\t// Type guard: promise.then() returns a Promise, which we know is Promise<Response> in this context\n\t\t\t// We've already verified promise is a Promise, so the result of .then() is also a Promise\n\t\t\t// The generic Promise chain maintains the Response type in this context\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tconst thenResult = promise.then(...args) as Promise<Response>;\n\t\t\tpromise = thenResult;\n\t\t}\n\t\treturn result;\n\t};\n\tresult.catch = (...args: [((reason: unknown) => unknown)?]): unknown =>\n\t{\n\t\t// Type guard: verify promise is a Promise before chaining\n\t\tif(isPromise(promise))\n\t\t{\n\t\t\t// Type guard: promise.catch() returns a Promise, which we know is Promise<Response> in this context\n\t\t\t// We've already verified promise is a Promise, so the result of .catch() is also a Promise\n\t\t\t// The generic Promise chain maintains the Response type in this context\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tconst catchResult = promise.catch(...args) as Promise<Response>;\n\t\t\tpromise = catchResult;\n\t\t}\n\t\treturn result;\n\t};\n\tresult.finally = (...args: [(() => unknown)?]): unknown =>\n\t{\n\t\t// Type guard: verify promise is a Promise before chaining\n\t\tif(isPromise(promise))\n\t\t{\n\t\t\t// Type guard: promise.finally() returns a Promise, which we know is Promise<Response> in this context\n\t\t\t// We've already verified promise is a Promise, so the result of .finally() is also a Promise\n\t\t\t// The generic Promise chain maintains the Response type in this context\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tconst finallyResult = promise.finally(...args) as Promise<Response>;\n\t\t\tpromise = finallyResult;\n\t\t}\n\t\treturn result;\n\t};\n\tresult.remove = (...args: unknown[]): unknown =>\n\t{\n\t\tcontrollerAborted = true;\n\t\tif(controller)\n\t\t{\n\t\t\tcontroller.abort(...args);\n\t\t}\n\t\treturn result;\n\t};\n\tresult.isRemoved = (): boolean => (controllerAborted || !!controller?.signal?.aborted);\n\treturn result;\n}\n\n/**\n * Cached version of fetch.\n *\n * @param url - URL to fetch\n * @param options - Fetch options\n * @param responseFunction - Optional function to process response before caching\n * @returns Promise resolving to data\n */\nexport const cachedFetch: (url: string, options?: unknown, responseFunction?: (response: Response) => unknown) => Promise<unknown> = (() =>\n{\n\tconst cache = new Map<string, unknown>();\n\treturn async(url: string, options?: unknown, responseFunction?: (response: Response) => unknown): Promise<unknown> =>\n\t{\n\t\tif(cache.has(url))\n\t\t{\n\t\t\tconst result = cache.get(url);\n\t\t\t// Type guard: check result structure\n\t\t\tif(isRecordLike(result))\n\t\t\t{\n\t\t\t\tif('data' in result && result.data !== undefined)\n\t\t\t\t{\n\t\t\t\t\treturn result.data;\n\t\t\t\t}\n\t\t\t\tif('promise' in result && isPromise(result.promise))\n\t\t\t\t{\n\t\t\t\t\treturn await result.promise;\n\t\t\t\t}\n\t\t\t\tif('error' in result && result.error !== undefined)\n\t\t\t\t{\n\t\t\t\t\tthrow result.error;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\t// Type guard: fetch returns Promise<Response>\n\t\t// Type guard: verify options is RequestInit-like for fetch\n\t\t// RequestInit is compatible with Record<string, unknown>, so we can use it directly\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst fetchOptions: RequestInit | undefined = isRecordLike(options) ? (options as unknown as RequestInit) : undefined;\n\t\tconst fetchPromise: Promise<Response> = globalThis.fetch(url, fetchOptions);\n\t\tconst promise = fetchPromise\n\t\t\t.then(async(response: Response) =>\n\t\t\t{\n\t\t\t\tconst data = responseFunction ? (await responseFunction(response)) : response;\n\t\t\t\t// Type guard: check if options has verify function\n\t\t\t\tif(isRecordLike(options) && 'verify' in options)\n\t\t\t\t{\n\t\t\t\t\tconst verify = options.verify;\n\t\t\t\t\tif(typeof verify === 'function')\n\t\t\t\t\t{\n\t\t\t\t\t\tawait verify(data, response);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\t})\n\t\t\t.then((data: unknown) =>\n\t\t\t{\n\t\t\t\tcache.set(url, {data});\n\t\t\t\treturn data;\n\t\t\t})\n\t\t\t.catch((error: unknown) =>\n\t\t\t{\n\t\t\t\tcache.set(url, {error});\n\t\t\t\tthrow error;\n\t\t\t});\n\n\t\tif(!cache.has(url))\n\t\t{\n\t\t\tcache.set(url, {promise});\n\t\t}\n\t\treturn await promise;\n\t};\n})();\n\n/**\n * Creates a new transactional value.\n *\n * @param value - Initial value\n * @returns Transactional value object\n */\nexport function createTransactionalValue(value?: unknown): TransactionalValue\n{\n\treturn {\n\t\tvalue: (typeof value === 'undefined') ? null : value,\n\t\tchanges: [],\n\t};\n}\n\n/**\n * Validates a transactional value structure.\n *\n * @param transactionalValue - Value to check\n * @returns true if valid\n */\nexport function isTransactionalValueValid(transactionalValue: unknown): transactionalValue is TransactionalValue\n{\n\treturn (\n\t\t(typeof transactionalValue === 'object') &&\n\t\t(transactionalValue !== null) &&\n\t\tisTransactionalValue(transactionalValue)\n\t);\n}\n\n/**\n * Private helper to ensure valid transactional value.\n */\nfunction checkTransactionalValue(transactionalValue: unknown): void\n{\n\tif(!isTransactionalValueValid(transactionalValue))\n\t{\n\t\tthrow new Error('Invalid TransactionalValue provided');\n\t}\n}\n\n/**\n * Private helper to find a change by ID.\n */\nfunction findTransactionalValueChange(transactionalValue: TransactionalValue, changeId: string): {change: TransactionChange; index: number} | null\n{\n\tfor(let i = 0; i < transactionalValue.changes.length; i++)\n\t{\n\t\tif(transactionalValue.changes[i]!.id === changeId)\n\t\t{\n\t\t\treturn {change: transactionalValue.changes[i]!, index: i};\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Converts transactional value to string representation of its state.\n *\n * @param transactionalValue - Transactional value\n * @returns State string\n */\nexport function transactionalValueToString(transactionalValue: unknown): string\n{\n\tif(!isTransactionalValueValid(transactionalValue))\n\t{\n\t\treturn STRING(transactionalValue);\n\t}\n\tif(transactionalValue.changes.length <= 0)\n\t{\n\t\treturn STRING(transactionalValue.value);\n\t}\n\tlet valuesString = STRING(transactionalValue.value);\n\tfor(let i = 0; i < transactionalValue.changes.length; i++)\n\t{\n\t\tvaluesString += ' -> ' + STRING(transactionalValue.changes[i]!.value);\n\t}\n\treturn STRING(transactionalValue.changes[transactionalValue.changes.length - 1]!.value) + ' (' + valuesString + ')';\n}\n\n/**\n * Sets and commits a value, clearing all uncommitted changes.\n *\n * @param transactionalValue - Transactional value\n * @param value - New value\n */\nexport function transactionSetAndCommit(transactionalValue: TransactionalValue, value: unknown): void\n{\n\tcheckTransactionalValue(transactionalValue);\n\ttransactionalValue.value = (typeof value === 'undefined') ? null : value;\n\ttransactionalValue.changes = [];\n}\n\n/**\n * Adds an uncommitted change. Returns change ID.\n *\n * @param transactionalValue - Transactional value\n * @param value - New value\n * @returns Change ID\n */\nexport function transactionSetWithoutCommitting(transactionalValue: TransactionalValue, value: unknown): string\n{\n\tcheckTransactionalValue(transactionalValue);\n\tconst id = uniqueId();\n\ttransactionalValue.changes.push({id, value: (typeof value === 'undefined') ? null : value});\n\treturn id;\n}\n\n/**\n * Commits a specific change by ID.\n *\n * @param transactionalValue - Transactional value\n * @param changeId - Change ID\n * @returns true if committed\n */\nexport function transactionCommitChange(transactionalValue: TransactionalValue, changeId: string): boolean\n{\n\tcheckTransactionalValue(transactionalValue);\n\tconst result = findTransactionalValueChange(transactionalValue, changeId);\n\tif(result === null)\n\t{\n\t\treturn false;\n\t}\n\ttransactionalValue.value = result.change.value;\n\ttransactionalValue.changes.splice(0, result.index + 1);\n\treturn true;\n}\n\n/**\n * Cancels a specific change by ID.\n *\n * @param transactionalValue - Transactional value\n * @param changeId - Change ID\n * @returns true if cancelled\n */\nexport function transactionCancelChange(transactionalValue: TransactionalValue, changeId: string): boolean\n{\n\tcheckTransactionalValue(transactionalValue);\n\tconst result = findTransactionalValueChange(transactionalValue, changeId);\n\tif(result === null)\n\t{\n\t\treturn false;\n\t}\n\ttransactionalValue.changes.splice(result.index, 1);\n\treturn true;\n}\n\n/**\n * Checks if a change is still relevant.\n *\n * @param transactionalValue - Transactional value\n * @param changeId - Change ID\n * @returns true if relevant\n */\nexport function transactionIsChangeRelevant(transactionalValue: TransactionalValue, changeId: string): boolean\n{\n\tcheckTransactionalValue(transactionalValue);\n\treturn (findTransactionalValueChange(transactionalValue, changeId) !== null);\n}\n\n/**\n * Gets current committed value.\n *\n * @param transactionalValue - Transactional value\n * @returns Committed value\n */\nexport function transactionGetCommittedValue(transactionalValue: TransactionalValue): unknown\n{\n\tcheckTransactionalValue(transactionalValue);\n\treturn transactionalValue.value;\n}\n\n/**\n * Gets current value (including most recent uncommitted change).\n *\n * @param transactionalValue - Transactional value\n * @returns Current value\n */\nexport function transactionGetValue(transactionalValue: TransactionalValue): unknown\n{\n\tcheckTransactionalValue(transactionalValue);\n\tif(transactionalValue.changes.length <= 0)\n\t{\n\t\treturn transactionalValue.value;\n\t}\n\treturn transactionalValue.changes[transactionalValue.changes.length - 1]!.value;\n}\n\n/**\n * Performs a deep equality comparison between two collections, sorting on keys first.\n *\n * @param elementsA - First collection\n * @param elementsB - Second collection\n * @param ignoreKeys - Keys to ignore\n * @returns true if equivalent\n */\nexport function equalsMapLike(elementsA: unknown, elementsB: unknown, ignoreKeys: string | string[] = []): boolean\n{\n\tconst sortKeyValueArrays = (pairA: unknown, pairB: unknown): number =>\n\t{\n\t\t// Type guard: verify both are pairs\n\t\tif(isPair(pairA) && isPair(pairB))\n\t\t{\n\t\t\treturn compare(pairA[0], pairB[0]);\n\t\t}\n\t\treturn 0;\n\t};\n\n\t// Type guard: verify mapToArray returns array of pairs\n\tconst aArray = mapToArray(elementsA, (value, key) => [key, value]);\n\tconst bArray = mapToArray(elementsB, (value, key) => [key, value]);\n\tconst aPairs = (Array.isArray(aArray) ? aArray.filter((item): item is [unknown, unknown] => isPair(item)) : []).sort(sortKeyValueArrays);\n\tconst bPairs = (Array.isArray(bArray) ? bArray.filter((item): item is [unknown, unknown] => isPair(item)) : []).sort(sortKeyValueArrays);\n\tconst ignore = (typeof ignoreKeys === 'string') ? ARRAY(ignoreKeys) : mapToArray(ignoreKeys);\n\n\tlet i = 0, j = 0;\n\twhile(i < aPairs.length && j < bPairs.length)\n\t{\n\t\tconst [ka, va] = aPairs[i]!;\n\t\tconst [kb, vb] = bPairs[j]!;\n\n\t\tif(ignore.includes(ka)) \n\t\t{\n\t\t\ti++; if(ignore.includes(kb)) j++; continue;\n\t\t}\n\t\tif(ignore.includes(kb)) \n\t\t{\n\t\t\tj++; continue;\n\t\t}\n\n\t\tif(!equals(ka, kb) || !equals(va, vb)) return false;\n\t\ti++; j++;\n\t}\n\n\twhile(i < aPairs.length && ignore.includes(aPairs[i]![0])) i++;\n\tif(i < aPairs.length) return false;\n\n\twhile(j < bPairs.length && ignore.includes(bPairs[j]![0])) j++;\n\treturn j >= bPairs.length;\n}\n\n/**\n * Executes callback when document is ready.\n *\n * @param callback - Function to call\n * @returns Handler with remove() method\n */\nexport function onDomReady(callback: () => void): {remove: () => void}\n{\n\t// @ts-ignore -- document might not be defined in non-browser environments\n\tif(!globalThis?.document?.addEventListener)\n\t{\n\t\tconsole.warn('LeUtils.onDomReady: No document found.');\n\t\treturn {remove: (): void => \n\t\t{}};\n\t}\n\n\t// @ts-ignore -- document might not be defined in non-browser environments\n\tif(globalThis.document.readyState === 'interactive' || globalThis.document.readyState === 'complete')\n\t{\n\t\treturn setTimeout(callback, 0);\n\t}\n\n\tlet listening = true;\n\tconst wrapper = (): void =>\n\t{\n\t\tif(listening)\n\t\t{\n\t\t\tlistening = false;\n\t\t\t// @ts-ignore -- document might not be defined in non-browser environments\n\t\t\tglobalThis.document.removeEventListener('DOMContentLoaded', wrapper);\n\t\t\tcallback();\n\t\t}\n\t};\n\t// @ts-ignore -- document might not be defined in non-browser environments\n\tglobalThis.document.addEventListener('DOMContentLoaded', wrapper);\n\treturn {\n\t\tremove: (): void =>\n\t\t{\n\t\t\tif(listening)\n\t\t\t{\n\t\t\t\tlistening = false;\n\t\t\t\t// @ts-ignore -- document might not be defined in non-browser environments\n\t\t\t\tglobalThis.document.removeEventListener('DOMContentLoaded', wrapper);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Parses version string into object with comparison helpers.\n *\n * @param version - Version string or object\n * @returns Version object with comparison methods\n */\nexport function parseVersionString(version: unknown): {\n\tmajor: number;\n\tminor: number;\n\tpatch: number;\n\ttoString: () => string;\n\tequals: (other: unknown) => boolean;\n\tlargerThan: (other: unknown) => boolean;\n\tlargerThanOrEquals: (other: unknown) => boolean;\n\tsmallerThan: (other: unknown) => boolean;\n\tsmallerThanOrEquals: (other: unknown) => boolean;\n}\n{\n\t// Type guard: verify version has major, minor, patch\n\tif(isVersionObject(version))\n\t{\n\t\tconst major = INT_LAX(version.major);\n\t\tconst minor = INT_LAX(version.minor);\n\t\tconst patch = INT_LAX(version.patch);\n\t\treturn {\n\t\t\tmajor,\n\t\t\tminor,\n\t\t\tpatch,\n\t\t\ttoString: () => `${major}.${minor}.${patch}`,\n\t\t\tequals: (other: unknown): boolean =>\n\t\t\t{\n\t\t\t\tif(!isVersionObject(other))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn major === INT_LAX(other.major) && minor === INT_LAX(other.minor) && patch === INT_LAX(other.patch);\n\t\t\t},\n\t\t\tlargerThan: (other: unknown): boolean =>\n\t\t\t{\n\t\t\t\tif(!isVersionObject(other))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst otherMajor = INT_LAX(other.major);\n\t\t\t\tconst otherMinor = INT_LAX(other.minor);\n\t\t\t\tconst otherPatch = INT_LAX(other.patch);\n\t\t\t\treturn (major > otherMajor) || (major === otherMajor && minor > otherMinor) || (major === otherMajor && minor === otherMinor && patch > otherPatch);\n\t\t\t},\n\t\t\tlargerThanOrEquals: (other: unknown): boolean =>\n\t\t\t{\n\t\t\t\tif(!isVersionObject(other))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst otherMajor = INT_LAX(other.major);\n\t\t\t\tconst otherMinor = INT_LAX(other.minor);\n\t\t\t\tconst otherPatch = INT_LAX(other.patch);\n\t\t\t\treturn (major > otherMajor) || (major === otherMajor && minor > otherMinor) || (major === otherMajor && minor === otherMinor && patch >= otherPatch);\n\t\t\t},\n\t\t\tsmallerThan: (other: unknown): boolean =>\n\t\t\t{\n\t\t\t\tif(!isVersionObject(other))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst otherMajor = INT_LAX(other.major);\n\t\t\t\tconst otherMinor = INT_LAX(other.minor);\n\t\t\t\tconst otherPatch = INT_LAX(other.patch);\n\t\t\t\treturn !((major > otherMajor) || (major === otherMajor && minor > otherMinor) || (major === otherMajor && minor === otherMinor && patch >= otherPatch));\n\t\t\t},\n\t\t\tsmallerThanOrEquals: (other: unknown): boolean =>\n\t\t\t{\n\t\t\t\tif(!isVersionObject(other))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst otherMajor = INT_LAX(other.major);\n\t\t\t\tconst otherMinor = INT_LAX(other.minor);\n\t\t\t\tconst otherPatch = INT_LAX(other.patch);\n\t\t\t\treturn !((major > otherMajor) || (major === otherMajor && minor > otherMinor) || (major === otherMajor && minor === otherMinor && patch > otherPatch));\n\t\t\t},\n\t\t};\n\t}\n\n\tconst v = STRING(version).trim();\n\tconst parts = v.split(' ')[0]!.split('-')[0]!.split('.');\n\tconst major = INT_LAX(parts[0]);\n\tconst minor = INT_LAX(parts[1]);\n\tconst patch = INT_LAX(parts[2]);\n\n\tconst obj = {\n\t\tmajor,\n\t\tminor,\n\t\tpatch,\n\t\ttoString: (): string => `${major}.${minor}.${patch}`,\n\t\tequals: (other: unknown): boolean =>\n\t\t{\n\t\t\tconst o = parseVersionString(other);\n\t\t\treturn major === o.major && minor === o.minor && patch === o.patch;\n\t\t},\n\t\tlargerThan: (other: unknown): boolean =>\n\t\t{\n\t\t\tconst o = parseVersionString(other);\n\t\t\tif(major > o.major) return true;\n\t\t\tif(major < o.major) return false;\n\t\t\tif(minor > o.minor) return true;\n\t\t\tif(minor < o.minor) return false;\n\t\t\treturn patch > o.patch;\n\t\t},\n\t\tlargerThanOrEquals: (other: unknown): boolean =>\n\t\t{\n\t\t\tconst o = parseVersionString(other);\n\t\t\tif(major > o.major) return true;\n\t\t\tif(major < o.major) return false;\n\t\t\tif(minor > o.minor) return true;\n\t\t\tif(minor < o.minor) return false;\n\t\t\treturn patch >= o.patch;\n\t\t},\n\t\tsmallerThan: (other: unknown): boolean =>\n\t\t{\n\t\t\treturn !obj.largerThanOrEquals(other);\n\t\t},\n\t\tsmallerThanOrEquals: (other: unknown): boolean =>\n\t\t{\n\t\t\treturn !obj.largerThan(other);\n\t\t},\n\t};\n\treturn obj;\n}\n\n/**\n * Increases numeric string by 1 without limit.\n *\n * @param str - Numeric string\n * @returns Increased string\n */\nexport function increaseNumericStringByOne(str: string): string\n{\n\tconst s = (typeof str !== 'string') ? String(str) : str;\n\tif(!s || /[^0-9]/.test(s)) return '1';\n\n\tconst chars = s.split('');\n\tfor(let i = chars.length - 1; i >= 0; i--)\n\t{\n\t\tconst n = parseInt(chars[i]!, 10);\n\t\tif(n < 9)\n\t\t{\n\t\t\tchars[i] = String(n + 1);\n\t\t\treturn chars.join('');\n\t\t}\n\t\tchars[i] = '0';\n\t}\n\treturn '1' + chars.join('');\n}\n\n/**\n * Checks if collection contains all given values (case-insensitive).\n *\n * @param array - Collection to search\n * @param values - Values to find\n * @returns true if all found\n */\nexport function containsAllCaseInsensitive(array: unknown, values: unknown): boolean\n{\n\tif(!array) return false;\n\tlet result = true;\n\teach(values, (v: unknown) =>\n\t{\n\t\tif(!containsCaseInsensitive(array, v))\n\t\t{\n\t\t\tresult = false;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * Checks if collection contains any of given values (case-insensitive).\n *\n * @param array - Collection to search\n * @param values - Values to find\n * @returns true if any found\n */\nexport function containsAnyCaseInsensitive(array: unknown, values: unknown): boolean\n{\n\tif(!array) return false;\n\tlet result = false;\n\teach(values, (v: unknown) =>\n\t{\n\t\tif(containsCaseInsensitive(array, v))\n\t\t{\n\t\t\tresult = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * Checks if collection contains none of given values (case-insensitive).\n *\n * @param array - Collection to search\n * @param values - Values to find\n * @returns true if none found\n */\nexport function containsNoneCaseInsensitive(array: unknown, values: unknown): boolean\n{\n\tif(!array) return true;\n\tlet result = true;\n\teach(values, (v: unknown) =>\n\t{\n\t\tif(containsCaseInsensitive(array, v))\n\t\t{\n\t\t\tresult = false;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn result;\n}\n\n/**\n * Returns string with start/end trimmed and ensures valid sentence ending.\n *\n * @param sentence - String to purge\n * @returns Purged sentence\n */\nexport function purgeSentence(sentence: unknown): string\n{\n\tlet s = trimEnd(STRING(sentence).trim(), '.: \\r\\n\\t');\n\ts += (endsWithAny(s, '!?;') ? '' : '.');\n\treturn s;\n}\n\n/**\n * Obtains error message from any input.\n *\n * @param error - Error source\n * @returns Error message string\n */\nexport function purgeErrorMessage(error: unknown): string\n{\n\tlet err = error;\n\t// Type guard: check if error has message property\n\tif(hasErrorMessage(err))\n\t{\n\t\terr = err.message;\n\t}\n\tif(typeof err === 'string')\n\t{\n\t\tconst errorParts = err.split('threw an error:');\n\t\terr = errorParts[errorParts.length - 1];\n\t}\n\telse\n\t{\n\t\ttry\n\t\t{\n\t\t\terr = JSON.stringify(err);\n\t\t}\n\t\tcatch\n\t\t{\n\t\t\terr = 'An unknown error occurred';\n\t\t}\n\t}\n\treturn STRING(err).trim();\n}\n\n/**\n * Generates permutations of names (e.g. foobar, fooBar, FooBar, foo-bar, foo_bar).\n *\n * @param names - Parts to combine\n * @returns Array of permutations\n */\nexport function generateNamePermutations(...names: unknown[]): string[]\n{\n\tconst n = flattenToArray(names)\n\t\t.map((name) => STRING(name).trim().toLowerCase())\n\t\t.filter((name) => (name.length > 0));\n\tconst results: string[] = [];\n\tif(n.length > 0)\n\t{\n\t\tresults.push(n.join('')); //foobar\n\t\tresults.push(n.map(capitalize).join('')); //FooBar\n\t}\n\tif(n.length > 1)\n\t{\n\t\tresults.push([n[0]].concat(n.slice(1).map(capitalize)).join('')); //fooBar\n\t\tresults.push(n.join('-')); //foo-bar\n\t\tresults.push(n.join('_')); //foo_bar\n\t}\n\treturn results;\n}\n\n/**\n * Compares two strings generated by LeUtils.timestamp(). Primarily used for sorting.\n */\nexport function compareTimestampStrings(a: string | null, b: string | null): number\n{\n\ttry\n\t{\n\t\tconst ta = base64ToHex(STRING(a).replaceAll('-', '+').replaceAll('_', '/'));\n\t\tconst tb = base64ToHex(STRING(b).replaceAll('-', '+').replaceAll('_', '/'));\n\t\treturn compare(ta, tb);\n\t}\n\tcatch\n\t{\n\t\treturn 0;\n\t}\n}\n\n/**\n * Returns true if the user is on a smartphone device (mobile).\n */\nexport function platformIsMobile(): boolean\n{\n\t// Type guard: check navigator and globalThis for vendor/opera properties\n\tlet userAgent = globalThis?.navigator?.userAgent || '';\n\tif(!userAgent && globalThis?.navigator && hasNavigatorVendor(globalThis.navigator))\n\t{\n\t\tuserAgent = globalThis.navigator.vendor || '';\n\t}\n\tif(!userAgent && hasOpera(globalThis))\n\t{\n\t\tconst operaValue = safeGetProperty(globalThis, 'opera');\n\t\tuserAgent = typeof operaValue === 'string' ? operaValue : '';\n\t}\n\tconst a = STRING(userAgent || '');\n\treturn !!(\n\t\t/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series([46])0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i\n\t\t\t.test(a) ||\n\t\t/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \\-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i\n\t\t\t.test(a)\n\t);\n}\n\n/**\n * Returns true if the user has a cursor (mouse).\n */\nexport function platformHasCursor(): boolean\n{\n\treturn !platformIsMobile() && !globalThis?.matchMedia?.('(any-hover: none)')?.matches;\n}\n\n/**\n * Returns string with email purged (lowercased, trimmed).\n */\nexport function purgeEmail(email: unknown): string\n{\n\tconst e = STRING(email).trim().toLowerCase().replace(/\\s/g, '');\n\tif(!e.includes('@') || !e.includes('.'))\n\t{\n\t\treturn '';\n\t}\n\treturn e;\n}\n\n/**\n * Returns true if the focus is effectively clear, meaning that the user is not typing in an input field.\n */\nexport const isFocusClear: () => boolean = (() =>\n{\n\tconst inputTypes = ['text', 'search', 'email', 'number', 'password', 'tel', 'time', 'url', 'week', 'month', 'date', 'datetime-local'];\n\treturn (): boolean => !((globalThis?.document?.activeElement?.tagName?.toLowerCase() === 'input') && inputTypes.includes(globalThis?.document?.activeElement?.getAttribute('type')?.toLowerCase() ?? ''));\n})();\n\n/**\n * Returns the user's locale. Returns 'en-US' if it can't be determined.\n */\nexport const getUserLocale: () => string = (() =>\n{\n\tlet userLocale: string | null = null;\n\treturn (): string =>\n\t{\n\t\tif(userLocale === null)\n\t\t{\n\t\t\tuserLocale = ((): string =>\n\t\t\t{\n\t\t\t\t// Type guard: check if navigator has languages\n\t\t\t\tlet locales: unknown[] = [];\n\t\t\t\tif(globalThis?.navigator && hasNavigatorLanguages(globalThis.navigator))\n\t\t\t\t{\n\t\t\t\t\tconst navLanguages = safeGetProperty(globalThis.navigator, 'languages');\n\t\t\t\t\tif(Array.isArray(navLanguages))\n\t\t\t\t\t{\n\t\t\t\t\t\tlocales = navLanguages;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!IS_ARRAY(locales) || (locales.length <= 0))\n\t\t\t\t{\n\t\t\t\t\treturn 'en-US';\n\t\t\t\t}\n\t\t\t\tlocales = locales.filter((locale: unknown) => ((typeof locale === 'string') && locale.includes('-') && (locale.toLowerCase() !== 'en-us')));\n\t\t\t\tif(locales.length <= 0)\n\t\t\t\t{\n\t\t\t\t\treturn 'en-US';\n\t\t\t\t}\n\t\t\t\tconst localesNoEnglish = locales.filter((locale: unknown) => STRING(locale).toLowerCase().startsWith('en-'));\n\t\t\t\tif(localesNoEnglish.length <= 0)\n\t\t\t\t{\n\t\t\t\t\treturn STRING(locales[0]);\n\t\t\t\t}\n\t\t\t\treturn STRING(localesNoEnglish[0]);\n\t\t\t})();\n\t\t}\n\t\treturn userLocale!;\n\t};\n})();\n\n/**\n * Returns the user's locale date format. Always returns YYYY MM DD, with the character in between depending on the user's locale. Returns 'YYYY/MM/DD' if the user's locale can't be determined.\n */\nexport const getUserLocaleDateFormat: () => string = (() =>\n{\n\tlet userLocaleDateFormat: string | null = null;\n\treturn (): string =>\n\t{\n\t\tif(userLocaleDateFormat === null)\n\t\t{\n\t\t\tuserLocaleDateFormat = ((): string =>\n\t\t\t{\n\t\t\t\tlet char = '/';\n\t\t\t\t// Type guard: check if globalThis has Intl\n\t\t\t\tif(hasIntl(globalThis) && globalThis.Intl && 'DateTimeFormat' in globalThis.Intl)\n\t\t\t\t{\n\t\t\t\t\tconst DateTimeFormat = safeGetProperty(globalThis.Intl, 'DateTimeFormat');\n\t\t\t\t\tif(typeof DateTimeFormat === 'function')\n\t\t\t\t\t{\n\t\t\t\t\t\t// Type guard: DateTimeFormat constructor accepts locale and returns object with format method\n\t\t\t\t\t\t// We've already verified it's a function, now construct it\n\t\t\t\t\t\t// Use Function.prototype.apply to avoid type assertion\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t\t\tconst dtfInstance = Function.prototype.apply.call(DateTimeFormat, null, [getUserLocale()]) as {format?: (date?: Date) => string};\n\t\t\t\t\t\tif('format' in dtfInstance && typeof dtfInstance.format === 'function')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst formattedDate = dtfInstance.format();\n\t\t\t\t\t\t\tif(formattedDate.includes('-'))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tchar = '-';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(formattedDate.includes('. '))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tchar = '.';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(formattedDate.includes('.'))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tchar = '.';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn 'YYYY' + char + 'MM' + char + 'DD';\n\t\t\t})();\n\t\t}\n\t\treturn userLocaleDateFormat!;\n\t};\n})();\n\n/**\n * Returns an empty 1x1 transparent image data URL.\n */\nexport function getEmptyImageSrc(): string\n{\n\treturn 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n}\n\n/**\n * Calculates and returns the percentage of the part and total ((part / total) * 100).\n */\nexport function getPercentage(part: number | string, total: number | string): number\n{\n\tconst p = FLOAT_LAX(part);\n\tconst t = FLOAT_LAX(total);\n\tif(t === 0)\n\t{\n\t\treturn 100;\n\t}\n\treturn Math.max(0, Math.min(100, ((p / t) * 100)));\n}\n\n/**\n * Returns the pixels of the given Image object.\n */\nexport async function getImagePixels(image: HTMLImageElement): Promise<Uint8ClampedArray>\n{\n\tif(!globalThis?.document?.createElement || !globalThis?.document?.body?.appendChild)\n\t{\n\t\tconsole.warn('LeUtils.getImagePixels: Document is not available, returning empty pixels.');\n\t\treturn new Uint8ClampedArray();\n\t}\n\tconst canvas = globalThis.document.createElement('canvas');\n\tglobalThis.document.body.appendChild(canvas);\n\ttry\n\t{\n\t\tconst ctx = canvas.getContext('2d');\n\t\tconst width = Math.floor(image.width);\n\t\tconst height = Math.floor(image.height);\n\t\tif(!ctx || (width <= 0) || (height <= 0))\n\t\t{\n\t\t\treturn new Uint8ClampedArray();\n\t\t}\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n\t\treturn ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n\t}\n\tfinally\n\t{\n\t\tcanvas?.parentNode?.removeChild(canvas);\n\t}\n}\n\n/**\n * Returns the data URL (mimetype \"image/png\") of a colored version of the given Image object.\n */\nexport async function getColoredImage(image: HTMLImageElement, color: string): Promise<string>\n{\n\tif(!globalThis?.document?.createElement || !globalThis?.document?.body?.appendChild)\n\t{\n\t\tconsole.warn('LeUtils.getColoredImage: Document is not available, returning empty image src.');\n\t\treturn getEmptyImageSrc();\n\t}\n\tconst canvas = globalThis.document.createElement('canvas');\n\tglobalThis.document.body.appendChild(canvas);\n\ttry\n\t{\n\t\tconst ctx = canvas.getContext('2d');\n\t\tconst width = Math.floor(image.width);\n\t\tconst height = Math.floor(image.height);\n\t\tif(!ctx || (width <= 0) || (height <= 0))\n\t\t{\n\t\t\treturn getEmptyImageSrc();\n\t\t}\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n\t\tctx.globalCompositeOperation = 'source-in';\n\t\tctx.fillStyle = color;\n\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\t\treturn canvas.toDataURL('image/png');\n\t}\n\tfinally\n\t{\n\t\tcanvas?.parentNode?.removeChild(canvas);\n\t}\n}\n\n/**\n * Returns the hex color of the given RGB(A).\n */\nexport function rgbToHex(rgb: number[]): string\n{\n\treturn '#' + rgb.map((x) =>\n\t{\n\t\tconst hex = x.toString(16);\n\t\treturn ((hex.length === 1) ? '0' + hex : hex);\n\t}).join('');\n}\n\n/**\n * Returns the RGB(A) of the given hex color.\n */\nexport function hexToRgb(hexstring: string): number[]\n{\n\tconst initialHexstring = hexstring;\n\tconst h = STRING(hexstring).replace(/[^0-9A-F]/gi, '');\n\tconst hasAlpha = ((h.length === 4) || (h.length === 8));\n\tlet finalH = h;\n\twhile(finalH.length < 6)\n\t{\n\t\tfinalH = finalH.replace(/(.)/g, '$1$1');\n\t}\n\tconst result = finalH.match(/\\w{2}/g)?.map((a) => parseInt(a, 16));\n\tif(!result || (result.length < 3))\n\t{\n\t\tthrow new Error('Invalid hex color: \"' + finalH + '\" (was given \"' + initialHexstring + '\")');\n\t}\n\treturn [\n\t\tresult[0]!,\n\t\tresult[1]!,\n\t\tresult[2]!,\n\t\t...(hasAlpha ? [result[3]!] : []),\n\t];\n}\n\n/**\n * Returns the HSL(A) of the given RGB(A).\n */\nexport function rgbToHsl(rgb: number[]): number[]\n{\n\tconst r = rgb[0]! / 255;\n\tconst g = rgb[1]! / 255;\n\tconst b = rgb[2]! / 255;\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tlet h = 0;\n\tlet s = 0;\n\tconst l = (max + min) / 2;\n\tif(max !== min)\n\t{\n\t\tconst d = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\tswitch(max)\n\t\t{\n\t\t\tcase r:\n\t\t\t\th = (g - b) / d + (g < b ? 6 : 0);\n\t\t\t\tbreak;\n\t\t\tcase g:\n\t\t\t\th = (b - r) / d + 2;\n\t\t\t\tbreak;\n\t\t\tcase b:\n\t\t\t\th = (r - g) / d + 4;\n\t\t\t\tbreak;\n\t\t}\n\t\th /= 6;\n\t}\n\treturn [h, s, l, ...((rgb.length >= 4) ? [rgb[3]! / 255] : [])];\n}\n\n/**\n * Returns the RGB(A) of the given HSL(A).\n */\nexport const hslToRgb: (hsl: number[]) => number[] = (() =>\n{\n\tconst hue2rgb = (p: number, q: number, t: number): number =>\n\t{\n\t\tif(t < 0) t += 1;\n\t\tif(t > 1) t -= 1;\n\t\tif(t < 1 / 6) return p + (q - p) * 6 * t;\n\t\tif(t < 1 / 2) return q;\n\t\tif(t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n\t\treturn p;\n\t};\n\treturn (hsl: number[]): number[] =>\n\t{\n\t\tconst h = hsl[0]!;\n\t\tconst s = hsl[1]!;\n\t\tconst l = hsl[2]!;\n\t\tlet r = 1;\n\t\tlet g = 1;\n\t\tlet b = 1;\n\t\tif(s !== 0)\n\t\t{\n\t\t\tconst q = (l < 0.5) ? (l * (1 + s)) : (l + s - (l * s));\n\t\t\tconst p = (2 * l) - q;\n\t\t\tr = hue2rgb(p, q, h + (1 / 3));\n\t\t\tg = hue2rgb(p, q, h);\n\t\t\tb = hue2rgb(p, q, h - (1 / 3));\n\t\t}\n\t\treturn [r * 255, g * 255, b * 255, ...((hsl.length >= 4) ? [hsl[3]! * 255] : [])].map((c) => Math.max(0, Math.min(255, Math.round(c))));\n\t};\n})();\n\n/**\n * Returns the LAB(A) of the given RGB(A).\n */\nexport function rgbToLab(rgb: number[]): number[]\n{\n\tlet r = rgb[0]! / 255;\n\tlet g = rgb[1]! / 255;\n\tlet b = rgb[2]! / 255;\n\tr = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : (r / 12.92);\n\tg = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : (g / 12.92);\n\tb = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : (b / 12.92);\n\tlet x = ((r * 0.4124) + (g * 0.3576) + (b * 0.1805)) / 0.95047;\n\tlet y = ((r * 0.2126) + (g * 0.7152) + (b * 0.0722));\n\tlet z = ((r * 0.0193) + (g * 0.1192) + (b * 0.9505)) / 1.08883;\n\tx = (x > 0.008856) ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = (y > 0.008856) ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = (z > 0.008856) ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\treturn [(116 * y) - 16, 500 * (x - y), 200 * (y - z), ...((rgb.length >= 4) ? [rgb[3]! / 255] : [])];\n}\n\n/**\n * Returns the difference (calculated with DeltaE) of the LAB values of the given RGB values.\n */\nexport function getDifferenceBetweenRgb(rgbA: number[], rgbB: number[]): number\n{\n\tconst labA = rgbToLab(rgbA);\n\tconst labB = rgbToLab(rgbB);\n\treturn getDifferenceBetweenLab(labA, labB);\n}\n\n/**\n * Returns the difference (calculated with DeltaE) of the given LAB values.\n */\nexport function getDifferenceBetweenLab(labA: number[], labB: number[]): number\n{\n\tconst deltaL = labA[0]! - labB[0]!;\n\tconst deltaA = labA[1]! - labB[1]!;\n\tconst deltaB = labA[2]! - labB[2]!;\n\tconst c1 = Math.sqrt(labA[1]! * labA[1]! + labA[2]! * labA[2]!);\n\tconst c2 = Math.sqrt(labB[1]! * labB[1]! + labB[2]! * labB[2]!);\n\tconst deltaC = c1 - c2;\n\tlet deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n\tdeltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\tconst sc = 1.0 + 0.045 * c1;\n\tconst sh = 1.0 + 0.015 * c1;\n\tconst deltaLKlsl = deltaL / (1.0);\n\tconst deltaCkcsc = deltaC / (sc);\n\tconst deltaHkhsh = deltaH / (sh);\n\tconst i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\treturn (i < 0) ? 0 : Math.sqrt(i);\n}\n\n/**\n * Returns the RGB(A) between the two given RGB(A) values, based on the given percentage (0-100).\n */\nexport function getRgbBetween(startRgb: number[], endRgb: number[], percentage: number): number[]\n{\n\tconst p = FLOAT_LAX(percentage);\n\tconst partEnd = Math.max(0, Math.min(1, (p / 100.0)));\n\tconst partStart = (1 - partEnd);\n\tconst length = Math.min(startRgb.length, endRgb.length);\n\tconst result: number[] = [];\n\tfor(let i = 0; i < length; i++)\n\t{\n\t\tresult.push(Math.max(0, Math.min(255, Math.round((startRgb[i]! * partStart) + (endRgb[i]! * partEnd)))));\n\t}\n\treturn result;\n}\n\n/**\n * Returns the RGB(A) of the given RGB(A) values, based on the given percentage (0-100).\n */\nexport function getRgbOfGradient(gradient: Record<number, number[]>, percentage: number): number[]\n{\n\tconst p = Math.max(0, Math.min(100, FLOAT_LAX(percentage)));\n\n\tlet closest: [number, number] | null = null;\n\teach(gradient, (_color: unknown, percentStr: unknown) =>\n\t{\n\t\tconst percent = INT_LAX(percentStr);\n\t\tif(closest === null)\n\t\t{\n\t\t\tclosest = [percent, Math.abs(p - percent)];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst difference = Math.abs(p - percent);\n\t\t\tif(difference < closest[1])\n\t\t\t{\n\t\t\t\tclosest = [percent, difference];\n\t\t\t}\n\t\t}\n\t});\n\tif(closest === null)\n\t{\n\t\treturn [0, 0, 0];\n\t}\n\tconst closestPercent = closest[0];\n\n\tconst HIGHER = 99999;\n\tconst LOWER = -99999;\n\tlet higher = HIGHER;\n\tlet lower = LOWER;\n\teach(gradient, (_color: unknown, percentStr: unknown) =>\n\t{\n\t\tconst percent = INT_LAX(percentStr);\n\t\tif(percent < closestPercent)\n\t\t{\n\t\t\tif(percent > lower)\n\t\t\t{\n\t\t\t\tlower = percent;\n\t\t\t}\n\t\t}\n\t\tif(percent > closestPercent)\n\t\t{\n\t\t\tif(percent < higher)\n\t\t\t{\n\t\t\t\thigher = percent;\n\t\t\t}\n\t\t}\n\t});\n\n\tif(((higher === HIGHER) && (lower === LOWER)) || (higher === lower))\n\t{\n\t\t// Type guard: verify gradient entry is number array\n\t\tconst gradientValue = gradient[closestPercent];\n\t\tif(isNumberArray(gradientValue))\n\t\t{\n\t\t\treturn gradientValue;\n\t\t}\n\t\tconsole.error('LeUtils.getRgbFromGradient: gradient entry is not a number array', gradientValue);\n\t\treturn [0, 0, 0];\n\t}\n\telse if((higher !== HIGHER) && (lower !== LOWER))\n\t{\n\t\tconst higherDifference = Math.abs(higher - p);\n\t\tconst lowerDifference = Math.abs(p - lower);\n\t\tif(higherDifference > lowerDifference)\n\t\t{\n\t\t\thigher = closestPercent;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlower = closestPercent;\n\t\t}\n\t}\n\telse if(lower === LOWER)\n\t{\n\t\tlower = closestPercent;\n\t}\n\telse\n\t{\n\t\thigher = closestPercent;\n\t}\n\n\tif(lower > higher)\n\t{\n\t\tconst tmp = higher;\n\t\thigher = lower;\n\t\tlower = tmp;\n\t}\n\n\tconst total = (higher - lower);\n\tconst part = (p - lower);\n\t// Type guard: verify gradient entries are number arrays\n\tconst lowerGradient = gradient[lower];\n\tconst higherGradient = gradient[higher];\n\tif(!isNumberArray(lowerGradient) || !isNumberArray(higherGradient))\n\t{\n\t\tconsole.error('LeUtils.getRgbFromGradient: gradient entries are not number arrays', lowerGradient, higherGradient);\n\t\treturn [0, 0, 0];\n\t}\n\treturn getRgbBetween(lowerGradient, higherGradient, ((part / total) * 100));\n}\n\n/**\n * Download file from URL or data.\n */\nexport function downloadFile(name: string, data: string | Blob): void\n{\n\tif(!globalThis.document?.createElement || !globalThis.URL?.createObjectURL) return;\n\tconst a = globalThis.document.createElement('a');\n\ta.style.display = 'none';\n\tconst url = (typeof data === 'string') ? data : globalThis.URL.createObjectURL(data);\n\ta.href = url;\n\ta.download = name;\n\tglobalThis.document.body.appendChild(a);\n\ta.click();\n\tsetTimeout(() =>\n\t{\n\t\tglobalThis.document.body.removeChild(a);\n\t\tif(typeof data !== 'string') globalThis.URL.revokeObjectURL(url);\n\t}, 0);\n}\n\n/**\n * LocalStorage Get.\n */\nexport function localStorageGet(key: string): string | null\n{\n\ttry\n\t{\n\t\treturn globalThis.localStorage?.getItem(key) ?? null;\n\t}\n\tcatch\n\t{\n\t\treturn null;\n\t}\n}\n\n/**\n * LocalStorage Set.\n */\nexport function localStorageSet(key: string, value: string): void\n{\n\ttry\n\t{\n\t\tglobalThis.localStorage?.setItem(key, value);\n\t}\n\tcatch\n\t{\n\t\t// Ignore error\n\t}\n}\n\n/**\n * LocalStorage Remove.\n */\nexport function localStorageRemove(key: string): void\n{\n\ttry\n\t{\n\t\tglobalThis.localStorage?.removeItem(key);\n\t}\n\tcatch\n\t{\n\t\t// Ignore error\n\t}\n}\n\n/**\n * Checks if given host is private.\n */\nexport function isGivenHostPrivate(host: string): boolean\n{\n\tconst h = STRING(host).trim().toLowerCase();\n\treturn h === 'localhost' || h === '127.0.0.1' || h.startsWith('192.168.') || h.startsWith('10.') || /^172\\.(1[6-9]|2[0-9]|3[0-1])\\./.test(h);\n}\n\n/**\n * Checks if current host is private.\n */\nexport function isCurrentHostPrivate(): boolean\n{\n\treturn isGivenHostPrivate(globalThis?.location?.hostname);\n}\n\n/**\n * Create worker thread.\n */\nexport function createWorkerThread(name: string): {worker: Worker | null; sendMessage: (data: unknown, options?: {timeout?: number}) => Promise<unknown>}\n{\n\tif(!globalThis?.Worker)\n\t{\n\t\tconsole.warn('LeUtils.createWorkerThread: Workers are not supported, returning a dummy.');\n\t\treturn {\n\t\t\tworker: null,\n\t\t\tsendMessage: (_data: unknown, _options?: {timeout?: number}): Promise<unknown> => Promise.reject('Workers are not supported in this environment'),\n\t\t};\n\t}\n\n\tconst worker = new globalThis.Worker('/workers/' + name + '.worker.js');\n\tconst listeners = new Map<string, (data: unknown) => void>();\n\n\tconst sendMessage = (data: unknown, options?: {timeout?: number}): Promise<unknown> =>\n\t{\n\t\treturn new Promise((resolve, reject) =>\n\t\t{\n\t\t\tconst id = uniqueId();\n\t\t\tlisteners.set(id, resolve);\n\t\t\tglobalThis.setTimeout(() =>\n\t\t\t{\n\t\t\t\tlisteners.delete(id);\n\t\t\t\treject('timeout');\n\t\t\t}, options?.timeout ?? 10000);\n\n\t\t\t// Type guard: verify data is Record-like for spreading\n\t\t\tconst messageData = isRecordLike(data) ? data : {data};\n\t\t\tworker.postMessage({id, ...messageData});\n\t\t});\n\t};\n\n\tworker.onerror = (error: ErrorEvent): void =>\n\t{\n\t\tconsole.error('Worker ' + name + ':', error);\n\t};\n\tworker.onmessage = (message: MessageEvent): void =>\n\t{\n\t\tconst data = message.data;\n\t\t// Type guard: verify data has id property\n\t\tif(hasId(data))\n\t\t{\n\t\t\tconst callback = listeners.get(data.id);\n\t\t\tif(callback)\n\t\t\t{\n\t\t\t\tlisteners.delete(data.id);\n\t\t\t\tcallback(data);\n\t\t\t}\n\t\t}\n\t};\n\n\treturn {worker, sendMessage};\n}\n\n/**\n * Send message to worker.\n */\nexport const sendWorkerMessage: (workerName: string, data: unknown, options?: {timeout?: number}) => Promise<unknown> = (() =>\n{\n\tconst workers = new Map<string, {sendMessage: (data: unknown, options?: {timeout?: number}) => Promise<unknown>}>();\n\treturn (workerName: string, data: unknown, options?: {timeout?: number}): Promise<unknown> =>\n\t{\n\t\tif(!workers.has(workerName))\n\t\t{\n\t\t\tworkers.set(workerName, createWorkerThread(workerName));\n\t\t}\n\t\t// Type guard: verify worker has sendMessage method\n\t\tconst worker = workers.get(workerName);\n\t\tif(worker && hasSendMessage(worker))\n\t\t{\n\t\t\treturn worker.sendMessage(data, options);\n\t\t}\n\t\tconsole.error('LeUtils.createWorkerThread: worker does not have sendMessage method', worker);\n\t\treturn Promise.reject(new Error('Worker does not have sendMessage method'));\n\t};\n})();\n","/**\n * LeTypes - Type validation and conversion utilities\n */\n\n/**\n * Checks if a value is set (not null and not undefined).\n */\nexport function ISSET(value: unknown): boolean\n{\n\treturn (value !== null) && (typeof value !== 'undefined');\n}\n\n/**\n * Converts value to string. Returns empty string if not set.\n */\nexport function STRING(value: unknown): string\n{\n\tif(!ISSET(value))\n\t{\n\t\treturn '';\n\t}\n\tif(typeof value === 'string')\n\t{\n\t\treturn value;\n\t}\n\tif(typeof value === 'number' || typeof value === 'boolean')\n\t{\n\t\treturn String(value);\n\t}\n\tif(typeof value === 'symbol')\n\t{\n\t\treturn value.description ?? '';\n\t}\n\tif(typeof value === 'bigint')\n\t{\n\t\treturn value.toString();\n\t}\n\ttry\n\t{\n\t\tif(typeof value === 'object' && value !== null)\n\t\t{\n\t\t\tif(Object.getPrototypeOf(value) === null)\n\t\t\t{\n\t\t\t\t// Type guard: check if toString exists and is a function\n\t\t\t\tif('toString' in value && typeof value.toString === 'function' && value.toString !== Object.prototype.toString)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tconst result = value.toString();\n\t\t\t\t\t\tif(typeof result === 'string')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch\n\t\t\t\t\t{\n\t\t\t\t\t\t// Ignore error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn String(value);\n\t\t}\n\t\treturn String(value);\n\t}\n\tcatch\n\t{\n\t\treturn '';\n\t}\n}\n\n/**\n * Checks if value is an array.\n */\nexport function IS_ARRAY(value: unknown): value is unknown[]\n{\n\treturn Array.isArray(value);\n}\n\n/**\n * Ensures value is an array. Wraps in array if not already one.\n */\nexport function ARRAY(value: unknown): unknown[]\n{\n\tif(Array.isArray(value))\n\t{\n\t\treturn value;\n\t}\n\tif(typeof value === 'undefined')\n\t{\n\t\treturn [];\n\t}\n\treturn [value];\n}\n\n/**\n * Checks if value is an object (and not an array).\n */\nexport function IS_OBJECT(value: unknown): value is Record<string, unknown>\n{\n\treturn (typeof value === 'object') && (value !== null) && !Array.isArray(value);\n}\n\n/**\n * Ensures value is an object. Returns empty object if not set.\n */\nexport function OBJECT(value: unknown): Record<string, unknown>\n{\n\tif(IS_OBJECT(value))\n\t{\n\t\treturn value;\n\t}\n\treturn {};\n}\n\n/**\n * Converts value to number. Returns 0 if NaN.\n */\nexport function FLOAT(value: unknown): number\n{\n\tif(typeof value === 'symbol')\n\t{\n\t\tconst v = Number(value.description ?? '');\n\t\treturn isNaN(v) ? 0 : v;\n\t}\n\tif(typeof value === 'bigint')\n\t{\n\t\tif(value > BigInt(Number.MAX_SAFE_INTEGER))\n\t\t{\n\t\t\treturn Number.MAX_SAFE_INTEGER;\n\t\t}\n\t\tif(value < BigInt(Number.MIN_SAFE_INTEGER))\n\t\t{\n\t\t\treturn Number.MIN_SAFE_INTEGER;\n\t\t}\n\t\treturn Number(value);\n\t}\n\tconst v = Number(value);\n\tif(!isNaN(v))\n\t{\n\t\treturn v;\n\t}\n\treturn 0;\n}\n\n/**\n * Converts value to integer. Returns 0 if NaN.\n */\nexport function INT(value: unknown): number\n{\n\treturn Math.round(FLOAT(value));\n}\n\n/**\n * Returns first set string among arguments.\n */\nexport function STRING_ANY(...values: unknown[]): string\n{\n\tfor(const value of values)\n\t{\n\t\tif(ISSET(value))\n\t\t{\n\t\t\treturn STRING(value);\n\t\t}\n\t}\n\treturn '';\n}\n\n/**\n * Returns first set float among arguments.\n */\nexport function FLOAT_ANY(...values: unknown[]): number\n{\n\tfor(const value of values)\n\t{\n\t\tif(ISSET(value))\n\t\t{\n\t\t\tconst v = FLOAT(value);\n\t\t\tif(v !== 0 || value === 0 || value === '0')\n\t\t\t{\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n}\n\n/**\n * Returns first set integer among arguments.\n */\nexport function INT_ANY(...values: unknown[]): number\n{\n\treturn Math.round(FLOAT_ANY(...values));\n}\n\n/**\n * Converts value to boolean.\n * Matches strings \"true\", \"1\", \"yes\", \"on\" (case-insensitive).\n */\nexport function BOOL(value: unknown): boolean\n{\n\treturn BOOL_ANY(value);\n}\n\n/**\n * Returns the first non-null non-undefined boolean-castable value as a boolean.\n */\nexport function BOOL_ANY(...values: unknown[]): boolean\n{\n\tfor(const value of values)\n\t{\n\t\tif(!ISSET(value))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif(typeof value === 'boolean')\n\t\t{\n\t\t\treturn value;\n\t\t}\n\t\tif(typeof value === 'number')\n\t\t{\n\t\t\tif(!isNaN(value))\n\t\t\t{\n\t\t\t\treturn value !== 0;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif(typeof value === 'string')\n\t\t{\n\t\t\tconst s = value.toLowerCase().trim();\n\t\t\tif((s === '') || (s === 'false') || (s === 'no') || (s === 'off') || (s === '0'))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif((s === 'true') || (s === 'yes') || (s === 'on') || (s === '1'))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst float = Number(s);\n\t\t\tif(!isNaN(float))\n\t\t\t{\n\t\t\t\treturn float !== 0;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif(Array.isArray(value) || (typeof value === 'object' && value !== null))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nconst REGEX_ALL_NON_FLOAT_CHARACTERS = /[^0-9.-]/g;\n\n/**\n * Lax float conversion. Strips non-numeric characters.\n */\nexport function FLOAT_LAX(value: unknown): number\n{\n\tif(typeof value === 'number')\n\t{\n\t\treturn isNaN(value) ? 0 : value;\n\t}\n\tconst s = STRING(value).replace(REGEX_ALL_NON_FLOAT_CHARACTERS, '');\n\tif(s === '')\n\t{\n\t\treturn 0;\n\t}\n\tconst v = parseFloat(s);\n\tif(!isNaN(v))\n\t{\n\t\treturn v;\n\t}\n\treturn 0;\n}\n\n/**\n * Lax integer conversion.\n */\nexport function INT_LAX(value: unknown): number\n{\n\treturn Math.round(FLOAT_LAX(value));\n}\n\n/**\n * Returns first set lax float.\n */\nexport function FLOAT_LAX_ANY(...values: unknown[]): number\n{\n\tfor(const value of values)\n\t{\n\t\tif(ISSET(value))\n\t\t{\n\t\t\tconst v = FLOAT_LAX(value);\n\t\t\tif(v !== 0 || value === 0 || value === '0')\n\t\t\t{\n\t\t\t\treturn v;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n}\n\n/**\n * Returns first set lax integer.\n */\nexport function INT_LAX_ANY(...values: unknown[]): number\n{\n\treturn Math.round(FLOAT_LAX_ANY(...values));\n}\n","/**\n * A simple event emitter class that allows you to register listeners for events, emit events, and remove listeners.\n */\nexport class EventEmitter\n{\n\t#events: Map<string, Set<(...args: unknown[]) => unknown>>;\n\n\t/**\n\t * Creates a new EventEmitter instance.\n\t */\n\tconstructor()\n\t{\n\t\tthis.#events = new Map();\n\t}\n\n\t/**\n\t * Registers a listener for a specific event.\n\t *\n\t * @param {string} event - The name of the event to listen for.\n\t * @param {Function} listener - The function to call when the event is emitted.\n\t * @returns {{remove:(()=>void)}}\n\t */\n\ton(event: string, listener: (...args: unknown[]) => unknown): {remove: () => void}\n\t{\n\t\tif(!this.#events.has(event))\n\t\t{\n\t\t\tthis.#events.set(event, new Set());\n\t\t}\n\t\tthis.#events.get(event)!.add(listener);\n\n\t\treturn {\n\t\t\tremove: (): void => this.off(event, listener),\n\t\t};\n\t}\n\n\t/**\n\t * Registers a listener for a specific event, this listener will be called only once.\n\t *\n\t * @param {string} event - The name of the event to listen for.\n\t * @param {Function} listener - The function to call when the event is emitted.\n\t * @returns {{remove:()=>void}}\n\t */\n\tonce(event: string, listener: (...args: unknown[]) => unknown): {remove: () => void}\n\t{\n\t\tconst wrapper = (...args: unknown[]): void =>\n\t\t{\n\t\t\tthis.off(event, wrapper);\n\t\t\tlistener(...args);\n\t\t};\n\n\t\tthis.on(event, wrapper);\n\n\t\treturn {\n\t\t\tremove: (): void => this.off(event, wrapper),\n\t\t};\n\t}\n\n\t/**\n\t * Removes a listener for a specific event.\n\t *\n\t * @param {string} event - The name of the event to stop listening for.\n\t * @param {Function} listener - The function to remove from the event listeners.\n\t */\n\toff(event: string, listener: (...args: unknown[]) => unknown): void\n\t{\n\t\tconst listeners = this.#events.get(event);\n\t\tif(listeners)\n\t\t{\n\t\t\tlisteners.delete(listener);\n\t\t\tif(listeners.size === 0)\n\t\t\t{\n\t\t\t\tthis.#events.delete(event);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Emits an event, calling all registered listeners with the provided arguments.\n\t *\n\t * @param {string} event - The name of the event to emit.\n\t * @param {...*} args - The arguments to pass to the listeners.\n\t */\n\temit(event: string, ...args: unknown[]): void\n\t{\n\t\tconst listeners = this.#events.get(event);\n\t\tif(listeners)\n\t\t{\n\t\t\tconst snapshot = Array.from(listeners);\n\t\t\tfor(const listener of snapshot)\n\t\t\t{\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tlistener(...args);\n\t\t\t\t}\n\t\t\t\tcatch(err)\n\t\t\t\t{\n\t\t\t\t\tconsole.error(`Error in listener for \"${event}\":`, err);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clears all listeners for a specific event or all events if no event is specified.\n\t *\n\t * @param {string} [event] - The name of the event to clear listeners for. If not provided, all events will be cleared.\n\t */\n\tclear(event?: string): void\n\t{\n\t\tif(typeof event !== 'undefined')\n\t\t{\n\t\t\tthis.#events.delete(event);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.#events.clear();\n\t\t}\n\t}\n}\n","class LinkedListNode<T>\n{\n\tvalue: T;\n\tnext: LinkedListNode<T> | null = null;\n\tprevious: LinkedListNode<T> | null = null;\n\n\tconstructor(value: T)\n\t{\n\t\tthis.value = value;\n\t}\n}\n\nexport class LinkedList<T>\n{\n\t#head: LinkedListNode<T> | null = null;\n\t#tail: LinkedListNode<T> | null = null;\n\t#size = 0;\n\n\tconstructor() \n\t{}\n\n\t/**\n\t * Returns the number of elements in the list.\n\t *\n\t * @returns {number}\n\t */\n\tget size(): number\n\t{\n\t\treturn this.#size;\n\t}\n\n\t/**\n\t * Adds a new value to the beginning of the list.\n\t *\n\t * @param {*} value\n\t */\n\tunshift(value: T): void\n\t{\n\t\tconst newNode = new LinkedListNode(value);\n\t\tif(this.#head === null)\n\t\t{\n\t\t\tthis.#head = newNode;\n\t\t\tthis.#tail = newNode;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnewNode.next = this.#head;\n\t\t\tthis.#head.previous = newNode;\n\t\t\tthis.#head = newNode;\n\t\t}\n\t\tthis.#size++;\n\t}\n\n\t/**\n\t * Adds a new value to the end of the list.\n\t *\n\t * @param {*} value\n\t */\n\tpush(value: T): void\n\t{\n\t\tconst newNode = new LinkedListNode(value);\n\t\tif(this.#tail === null)\n\t\t{\n\t\t\tthis.#head = newNode;\n\t\t\tthis.#tail = newNode;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnewNode.previous = this.#tail;\n\t\t\tthis.#tail.next = newNode;\n\t\t\tthis.#tail = newNode;\n\t\t}\n\t\tthis.#size++;\n\t}\n\n\t/**\n\t * Removes the first value from the list and returns it.\n\t *\n\t * @returns {*|undefined}\n\t */\n\tshift(): T | undefined\n\t{\n\t\tif(this.#head === null)\n\t\t{\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst value = this.#head.value;\n\t\tthis.#head = this.#head.next;\n\n\t\tif(this.#head !== null)\n\t\t{\n\t\t\tthis.#head.previous = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.#tail = null;\n\t\t}\n\n\t\tthis.#size--;\n\t\treturn value;\n\t}\n\n\t/**\n\t * Removes the last value from the list and returns it.\n\t *\n\t * @returns {*|undefined}\n\t */\n\tpop(): T | undefined\n\t{\n\t\tif(this.#tail === null)\n\t\t{\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst value = this.#tail.value;\n\t\tthis.#tail = this.#tail.previous;\n\n\t\tif(this.#tail !== null)\n\t\t{\n\t\t\tthis.#tail.next = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.#head = null;\n\t\t}\n\n\t\tthis.#size--;\n\t\treturn value;\n\t}\n}\n","/**\n * SerializableMap class extends the native Map to provide a JSON representation.\n *\n * This class can only have string keys, as JSON does not support non-string keys.\n */\nexport class SerializableMap<K, V> extends Map<K, V>\n{\n\t/**\n\t * Returns a JSON representation of the map.\n\t *\n\t * @returns {Record<string, V>}\n\t */\n\ttoJSON(): Record<string, V>\n\t{\n\t\t// Map is iterable and provides [key, value] pairs which Object.fromEntries expects\n\t\t// Type guard: verify this is iterable\n\t\tif(this && typeof this === 'object' && Symbol.iterator in this)\n\t\t{\n\t\t\tconst entries: [string, V][] = [];\n\t\t\tfor(const [key, value] of this)\n\t\t\t{\n\t\t\t\t// Type guard: ensure key is string (required for JSON)\n\t\t\t\tconst stringKey = typeof key === 'string' ? key : String(key);\n\t\t\t\tentries.push([stringKey, value]);\n\t\t\t}\n\t\t\treturn Object.fromEntries(entries);\n\t\t}\n\t\treturn {};\n\t}\n}\n","import {compare as defaultCompare, each} from '../LeUtils';\n\n/**\n * A TreeSet is a set of elements, sorted by a comparator.\n * Binary search is used to find elements, which makes it very fast to find elements.\n *\n * The comparator is also used to determine if two values are equal to each other.\n * This way, you can have values that aren't the same be treated as if they are. This can be used to deal with issues such as floating point errors for example.\n */\nexport class TreeSet<T>\n{\n\t#elements: T[];\n\t#comparator: (valueA: T, valueB: T) => number;\n\n\t/**\n\t * Creates a new TreeSet with the given elements and comparator.\n\t *\n\t * @param {*[]} [elements=[]] - The initial elements of the set.\n\t * @param {(valueA:*, valueB:*) => number} [comparator=defaultCompare] - The comparator function to use for sorting.\n\t */\n\tconstructor(elements?: T[], comparator?: (valueA: T, valueB: T) => number)\n\t{\n\t\tthis.#comparator = comparator || defaultCompare;\n\t\tthis.#elements = elements ? [...elements] : [];\n\t\tthis.#elements.sort(this.#comparator);\n\t}\n\n\t/**\n\t * @param {*} value - The value to search for in the set.\n\t * @returns {{found:boolean, index:number, value:*|undefined}} - An object containing whether the value was found, the index where it would be inserted, and the value at that index (if found).\n\t * @private\n\t */\n\tprivate binarySearch(value: T): {found: boolean; index: number; value: T | undefined}\n\t{\n\t\tlet low = 0;\n\t\tlet high = this.#elements.length - 1;\n\t\twhile(low <= high)\n\t\t{\n\t\t\tconst mid = Math.floor((low + high) / 2);\n\t\t\tconst midValue = this.#elements[mid]!;\n\t\t\tconst cmp = this.#comparator(midValue, value);\n\t\t\tif(cmp < 0)\n\t\t\t{\n\t\t\t\tlow = mid + 1;\n\t\t\t}\n\t\t\telse if(cmp > 0)\n\t\t\t{\n\t\t\t\thigh = mid - 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn {found: true, index: mid, value: midValue};\n\t\t\t}\n\t\t}\n\t\treturn {found: false, index: low, value: undefined};\n\t}\n\n\t/**\n\t * Returns the elements of the set.\n\t */\n\tgetElements(): T[]\n\t{\n\t\treturn this.#elements;\n\t}\n\n\t/**\n\t * Returns the comparator of the set.\n\t *\n\t * @returns {(valueA:*, valueB:*) => number}\n\t */\n\tgetComparator(): (valueA: T, valueB: T) => number\n\t{\n\t\treturn this.#comparator;\n\t}\n\n\t/**\n\t * Returns the size of the set.\n\t *\n\t * @returns {number}\n\t */\n\tsize(): number\n\t{\n\t\treturn this.#elements.length;\n\t}\n\n\t/**\n\t * Returns true if the set is empty, false otherwise.\n\t *\n\t * @returns {boolean}\n\t */\n\tisEmpty(): boolean\n\t{\n\t\treturn this.#elements.length <= 0;\n\t}\n\n\t/**\n\t * Returns true if the set contains a value that is equal to the given value, returns false otherwise.\n\t *\n\t * @param {*} value - The value to check for in the set.\n\t * @return {boolean} - True if the set contains the value, false otherwise.\n\t */\n\tcontains(value: T): boolean\n\t{\n\t\treturn this.binarySearch(value).found;\n\t}\n\n\t/**\n\t * Returns the first element of the set, or undefined if it is empty.\n\t *\n\t * @return {*|undefined} - The first element of the set, or undefined if it is empty.\n\t */\n\tfirst(): T | undefined\n\t{\n\t\treturn this.#elements.length > 0 ? this.#elements[0] : undefined;\n\t}\n\n\t/**\n\t * Returns the last element of the set, or undefined if it is empty.\n\t *\n\t * @return {*|undefined} - The last element of the set, or undefined if it is empty.\n\t */\n\tlast(): T | undefined\n\t{\n\t\treturn this.#elements.length > 0 ? this.#elements[this.#elements.length - 1] : undefined;\n\t}\n\n\t/**\n\t * Removes and returns the first element of the set, or undefined if it is empty.\n\t *\n\t * @returns {*|undefined} - The first element of the set, or undefined if it is empty.\n\t */\n\tpollFirst(): T | undefined\n\t{\n\t\treturn this.#elements.length > 0 ? this.#elements.splice(0, 1)[0] : undefined;\n\t}\n\n\t/**\n\t * Removes and returns the last element of the set, or undefined if it is empty.\n\t *\n\t * @returns {*|undefined} - The last element of the set, or undefined if it is empty.\n\t */\n\tpollLast(): T | undefined\n\t{\n\t\treturn this.#elements.length > 0 ? this.#elements.splice(this.#elements.length - 1, 1)[0] : undefined;\n\t}\n\n\t/**\n\t * Adds the given value to the set. Will only do so if no equal value already exists.\n\t * @param {*} value - The value to add to the set.\n\t */\n\tadd(value: T): void\n\t{\n\t\tconst result = this.binarySearch(value);\n\t\tif(result.found)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tthis.#elements.splice(result.index, 0, value);\n\t}\n\n\t/**\n\t * Removes the given value from the set.\n\t * @param value - The value to remove\n\t * @returns true if removed\n\t */\n\tremove(value: T): boolean\n\t{\n\t\tconst result = this.binarySearch(value);\n\t\tif(result.found)\n\t\t{\n\t\t\tthis.#elements.splice(result.index, 1);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Adds all the given values to the set. Will only do so if no equal value already exists.\n\t *\n\t * @param {unknown} values - The values to add to the set.\n\t */\n\taddAll(values: unknown): void\n\t{\n\t\teach(values, (v: unknown) => \n\t\t{\n\t\t\t// Type guard: verify value is not null/undefined before adding\n\t\t\t// Note: We can't verify at compile time that v is of type T when values is unknown,\n\t\t\t// but the add() method will handle type mismatches at runtime.\n\t\t\t// Since TreeSet<T> is generic and we're accepting unknown values for runtime flexibility,\n\t\t\t// we use Function.prototype.apply to bypass TypeScript's type checking for this specific case.\n\t\t\t// The comparator in add() will handle any type mismatches at runtime.\n\t\t\tif(v !== null && v !== undefined)\n\t\t\t{\n\t\t\t\t// Use Function.prototype.apply to call add() with unknown value\n\t\t\t\t// This bypasses TypeScript's type checking without using 'as' keyword\n\t\t\t\t// This is necessary because add() expects T but we have unknown for runtime flexibility\n\t\t\t\tFunction.prototype.apply.call(this.add, this, [v]);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Returns an equal value that's already in the tree set, or undefined if no equal values in it exist.\n\t *\n\t * @param {*} value - The value to search for in the set.\n\t * @return {*|undefined} - The equal value if found, or undefined if not found.\n\t */\n\tgetEqualValue(value: T): T | undefined\n\t{\n\t\tconst result = this.binarySearch(value);\n\t\tif(result.found)\n\t\t{\n\t\t\treturn result.value;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Returns an equal value that's already in the tree set. If no equal values in it exist, the given value will be added and returned.\n\t *\n\t * @param {*} value - The value to search for in the set.\n\t * @return {*} - The equal value if found, or the added value if not found.\n\t */\n\tgetEqualValueOrAdd(value: T): T\n\t{\n\t\tconst result = this.binarySearch(value);\n\t\tif(result.found)\n\t\t{\n\t\t\treturn result.value!;\n\t\t}\n\t\tthis.#elements.splice(result.index, 0, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Returns a string representation of the TreeSet.\n\t *\n\t * @returns {string} - A string representation of the TreeSet, including its elements and comparator.\n\t */\n\ttoString(): string\n\t{\n\t\treturn `TreeSet{elements:${this.#elements}, comparator:${this.#comparator}}`;\n\t}\n\n\t/**\n\t * Returns a JSON representation of the TreeSet.\n\t *\n\t * @returns {Object} - An object containing the elements and comparator of the TreeSet.\n\t */\n\ttoJSON(): {elements: T[]; comparator: string}\n\t{\n\t\treturn {\n\t\t\telements: this.#elements,\n\t\t\tcomparator: this.#comparator.toString(),\n\t\t};\n\t}\n}\n","// Main entry point for @lowentry/utils\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nimport * as LeUtilsFunctions from './LeUtils';\n\nexport * from './LeTypes';\nexport * from './LeUtils';\nexport * from './classes/EventEmitter';\nexport * from './classes/LinkedList';\nexport * from './classes/SerializableMap';\nexport * from './classes/TreeSet';\n\nexport const LeUtils = {\n\t...LeUtilsFunctions,\n};\n\n"],"mappings":"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","names":["v","setTimeout","setInterval","length","a","b","major","minor","patch"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowentry/utils",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "Provides utilities for general JavaScript development.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -15,7 +15,7 @@
15
15
  "dist"
16
16
  ],
17
17
  "scripts": {
18
- "build": "tsc -p tsconfig.build.json",
18
+ "build": "tsup",
19
19
  "lint": "eslint .",
20
20
  "format": "eslint . --fix",
21
21
  "test": "npm run type-check && npm run lint && vitest run",
@@ -31,6 +31,7 @@
31
31
  "eslint-plugin-jsonc": "^2.21.0",
32
32
  "jsdom": "^27.4.0",
33
33
  "jsonc-eslint-parser": "^2.4.2",
34
+ "tsup": "^8.5.1",
34
35
  "typescript": "^5.9.3",
35
36
  "typescript-eslint": "^8.53.1",
36
37
  "vitest": "^4.0.18"
package/dist/LeTypes.d.ts DELETED
@@ -1,73 +0,0 @@
1
- /**
2
- * LeTypes - Type validation and conversion utilities
3
- */
4
- /**
5
- * Checks if a value is set (not null and not undefined).
6
- */
7
- export declare function ISSET(value: unknown): boolean;
8
- /**
9
- * Converts value to string. Returns empty string if not set.
10
- */
11
- export declare function STRING(value: unknown): string;
12
- /**
13
- * Checks if value is an array.
14
- */
15
- export declare function IS_ARRAY(value: unknown): value is unknown[];
16
- /**
17
- * Ensures value is an array. Wraps in array if not already one.
18
- */
19
- export declare function ARRAY(value: unknown): unknown[];
20
- /**
21
- * Checks if value is an object (and not an array).
22
- */
23
- export declare function IS_OBJECT(value: unknown): value is Record<string, unknown>;
24
- /**
25
- * Ensures value is an object. Returns empty object if not set.
26
- */
27
- export declare function OBJECT(value: unknown): Record<string, unknown>;
28
- /**
29
- * Converts value to number. Returns 0 if NaN.
30
- */
31
- export declare function FLOAT(value: unknown): number;
32
- /**
33
- * Converts value to integer. Returns 0 if NaN.
34
- */
35
- export declare function INT(value: unknown): number;
36
- /**
37
- * Returns first set string among arguments.
38
- */
39
- export declare function STRING_ANY(...values: unknown[]): string;
40
- /**
41
- * Returns first set float among arguments.
42
- */
43
- export declare function FLOAT_ANY(...values: unknown[]): number;
44
- /**
45
- * Returns first set integer among arguments.
46
- */
47
- export declare function INT_ANY(...values: unknown[]): number;
48
- /**
49
- * Converts value to boolean.
50
- * Matches strings "true", "1", "yes", "on" (case-insensitive).
51
- */
52
- export declare function BOOL(value: unknown): boolean;
53
- /**
54
- * Returns the first non-null non-undefined boolean-castable value as a boolean.
55
- */
56
- export declare function BOOL_ANY(...values: unknown[]): boolean;
57
- /**
58
- * Lax float conversion. Strips non-numeric characters.
59
- */
60
- export declare function FLOAT_LAX(value: unknown): number;
61
- /**
62
- * Lax integer conversion.
63
- */
64
- export declare function INT_LAX(value: unknown): number;
65
- /**
66
- * Returns first set lax float.
67
- */
68
- export declare function FLOAT_LAX_ANY(...values: unknown[]): number;
69
- /**
70
- * Returns first set lax integer.
71
- */
72
- export declare function INT_LAX_ANY(...values: unknown[]): number;
73
- //# sourceMappingURL=LeTypes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LeTypes.d.ts","sourceRoot":"","sources":["../src/LeTypes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG7C;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAsD7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAG3D;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAW/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAG1E;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO9D;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAyB5C;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAUvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CActD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAGpD;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG5C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CA4CtD;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAiBhD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG9C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAc1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAGxD"}