@zelgadis87/utils-core 5.2.9 → 5.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -1
- package/dist/time/TimeInstant.d.ts +31 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/empties.d.ts +1 -0
- package/esbuild/index.cjs +363 -171
- package/esbuild/index.cjs.map +4 -4
- package/esbuild/index.mjs +363 -184
- package/esbuild/index.mjs.map +4 -4
- package/package.json +1 -4
- package/src/time/TimeInstant.ts +421 -15
- package/src/time/TimeInstantBuilder.ts +2 -2
- package/src/utils/empties.ts +2 -0
package/esbuild/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
4
|
-
"sourcesContent": ["\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = format;\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar PATTERN_REGEX = /(M|y|d|D|h|H|m|s|S|G|Z|P|a)+/g;\nvar ESCAPE_REGEX = /\\\\\"|\"((?:\\\\\"|[^\"])*)\"|(\\+)/g;\nvar optionNames = {\n y: 'year',\n M: 'month',\n d: 'day',\n D: 'weekday',\n S: 'fractionalSecondDigits',\n G: 'era',\n Z: 'timeZoneName',\n P: 'dayPeriod',\n a: 'hour12',\n h: 'hour',\n H: 'hour',\n m: 'minute',\n s: 'second'\n};\nvar values = {\n y: ['numeric', '2-digit', undefined, 'numeric'],\n M: ['narrow', '2-digit', 'short', 'long'],\n d: ['numeric', '2-digit'],\n D: ['narrow', 'short', 'long'],\n S: [1, 2, 3],\n G: ['narrow', 'short', 'long'],\n Z: ['short', 'long'],\n P: ['narrow', 'short', 'long'],\n a: [true],\n h: [\"numeric\", \"2-digit\"],\n H: [\"numeric\", \"2-digit\"],\n m: [\"numeric\", \"2-digit\"],\n s: [\"numeric\", \"2-digit\"]\n};\n\nfunction padIf(condition, value, length) {\n return condition && length === 2 && value / 10 < 1 ? '0' + value : value;\n}\n\nfunction formatType(date, type, length) {\n var _options;\n\n var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},\n locale = _ref.locale,\n timeZone = _ref.timeZone;\n\n var option = optionNames[type];\n var value = values[type][length - 1];\n\n if (!value) {\n return;\n }\n\n var options = (_options = {}, _defineProperty(_options, option, value), _defineProperty(_options, \"timeZone\", timeZone), _options);\n\n if (type === 'a') {\n return Intl.DateTimeFormat(locale, _objectSpread(_objectSpread({}, options), {}, {\n hour: 'numeric'\n })).formatToParts(date).pop().value;\n }\n\n if (type === 'G' || type === 'Z') {\n return Intl.DateTimeFormat(locale, options).formatToParts(date).pop().value;\n }\n\n if (type === 'H' || type === 'h') {\n return Intl.DateTimeFormat('en-GB', _objectSpread(_objectSpread({}, options), {}, {\n hourCycle: type === \"H\" ? \"h23\" : \"h11\"\n })).format(date).toLocaleLowerCase().replace(\" am\", \"\").replace(\" pm\", \"\");\n }\n\n return padIf(['m', 's'].includes(type) && value === '2-digit', Intl.DateTimeFormat(locale, options).format(date), 2);\n}\n\nfunction format(date, pattern, config) {\n return pattern.split(ESCAPE_REGEX).filter(function (sub) {\n return sub !== undefined;\n }).map(function (sub, index) {\n // keep escaped strings as is\n if (index % 2 !== 0) {\n return sub;\n }\n\n return sub.replace(PATTERN_REGEX, function (match) {\n var type = match.charAt(0);\n return formatType(date, type, match.length, config) || match;\n });\n }).join('');\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.format = undefined;\n\nvar _format = require(\"./format\");\n\nvar _format2 = _interopRequireDefault(_format);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nexports.format = _format2[\"default\"];", "\r\nexport * from './async/_index.js';\r\nexport * from './lazy/_index.js';\r\nexport * from './Logger.js';\r\nexport * from './Optional.js';\r\nexport * from './sorting/_index.js';\r\nexport * from './time/_index.js';\r\nexport * from './upgrade/_index.js';\r\nexport * from './utils/_index.js';\r\n\r\n", "import { TFunction } from \"../utils/functions.js\";\r\n\r\ntype DeferredInternals<T> = {\r\n\tpromise: Promise<T>;\r\n\tresolve: TFunction<T, void>;\r\n\treject: TFunction<Error, void>;\r\n}\r\n\r\nexport interface ICancelable {\r\n\tcancel(): void;\r\n}\r\nexport interface ICancelablePromise<T> extends Promise<T>, ICancelable { }\r\n\r\nexport class DeferredCanceledError extends Error {\r\n\tconstructor() {\r\n\t\tsuper( \"Execution canceled\" );\r\n\t}\r\n}\r\n\r\nexport class Deferred<T = void> implements ICancelablePromise<T> {\r\n\r\n\tprivate _pending: boolean;\r\n\tprivate readonly _internals: DeferredInternals<T>;\r\n\r\n\tpublic get pending(): boolean { return this._pending; }\r\n\r\n\tconstructor() {\r\n\t\tthis._pending = true;\r\n\t\tthis._internals = this.createInternals();\r\n\t}\r\n\r\n\tpublic resolve( val: T ): void {\r\n\t\tif ( !this._pending )\r\n\t\t\tthrow new Error( 'Illegal state exception' );\r\n\t\tthis.resolveIfPending( val );\r\n\t}\r\n\r\n\tpublic reject( reason: Error ): void {\r\n\t\tif ( !this._pending )\r\n\t\t\tthrow new Error( 'Illegal state exception' );\r\n\t\tthis.rejectIfPending( reason );\r\n\t}\r\n\r\n\tpublic cancel(): void {\r\n\t\tif ( !this._pending )\r\n\t\t\tthrow new Error( 'Illegal state exception' );\r\n\t\tthis.cancelIfPending();\r\n\t}\r\n\r\n\tpublic resolveIfPending( val: T ): void {\r\n\t\tif ( !this._pending )\r\n\t\t\treturn;\r\n\t\tthis._pending = false;\r\n\t\tthis._internals.resolve( val );\r\n\t}\r\n\r\n\tpublic rejectIfPending( reason: Error ): void {\r\n\t\tif ( !this._pending )\r\n\t\t\treturn;\r\n\t\tthis._pending = false;\r\n\t\tthis._internals.reject( reason );\r\n\t}\r\n\r\n\tpublic cancelIfPending(): void {\r\n\t\tif ( !this._pending )\r\n\t\t\treturn;\r\n\t\tthis.reject( new DeferredCanceledError() );\r\n\t}\r\n\r\n\r\n\tpublic then<R = T, S = T>( onFulfilled: ( ( value: T ) => R | PromiseLike<R> ) | null | undefined, onRejected?: ( ( reason: Error ) => S | PromiseLike<S> ) | null | undefined ): Promise<R | S> {\r\n\t\treturn this._internals.promise.then( onFulfilled, onRejected );\r\n\t}\r\n\r\n\tpublic catch<R = T>( onRejected: ( ( reason: Error ) => R | PromiseLike<R> ) | null | undefined ): Promise<T | R> {\r\n\t\treturn this._internals.promise.catch( onRejected );\r\n\t}\r\n\r\n\tpublic finally( onfinally: ( () => void ) | null | undefined ): Promise<T> {\r\n\t\treturn this._internals.promise.finally( onfinally );\r\n\t}\r\n\r\n\tpublic asPromise(): Promise<T> {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic asCancelablePromise(): ICancelablePromise<T> {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tprotected createInternals() {\r\n\t\tlet resolveSelf: ( value: T ) => void, rejectSelf: ( reason: Error ) => void;\r\n\t\tconst promise = new Promise<T>( ( resolve, reject ) => {\r\n\t\t\tresolveSelf = resolve;\r\n\t\t\trejectSelf = reject;\r\n\t\t} );\r\n\t\treturn {\r\n\t\t\tpromise,\r\n\t\t\tresolve: resolveSelf!,\r\n\t\t\treject: rejectSelf!,\r\n\t\t};\r\n\t}\r\n\r\n\tget [ Symbol.toStringTag ]() {\r\n\t\treturn '[object Deferred]';\r\n\t}\r\n\r\n}\r\n\r\nexport default Deferred;\r\n", "import { TFunction, TimeInstant, TPromisable } from \"..\";\r\nimport TimeFrequency from \"../time/TimeFrequency\";\r\nimport Deferred from \"./Deferred\";\r\n\r\ntype TPromiseFactory<T, R> = TFunction<T, Promise<R>>;\r\n\r\nexport class RateThrottler {\r\n\r\n\tprivate readonly _availableSlots: TimeInstant[];\r\n\tprivate readonly _waitingRequests: Deferred<void>[];\r\n\r\n\tconstructor(\r\n\t\tprivate readonly _frequency: TimeFrequency\r\n\t) {\r\n\t\tconst initialOffset = this.cooldown.divideBy( _frequency.times );\r\n\t\tthis._availableSlots = new Array( _frequency.times ).fill( 0 ).map( ( _, i ) => TimeInstant.now().addMs( i * initialOffset.ms ) );\r\n\t\tthis._waitingRequests = [];\r\n\t}\r\n\r\n\tpublic get cooldown() {\r\n\t\treturn this._frequency.period;\r\n\t}\r\n\r\n\tpublic async execute<T>( fn: TPromiseFactory<void, T> ) {\r\n\t\tconst wrappedFn = async () => {\r\n\t\t\tconst slot = this._availableSlots.shift()!;\r\n\t\t\ttry {\r\n\t\t\t\treturn slot.promise().then( () => fn() );\r\n\t\t\t} finally {\r\n\t\t\t\tthis._availableSlots.push( TimeInstant.now().addDuration( this.cooldown ) );\r\n\t\t\t\tif ( this._waitingRequests.length > 0 ) this._waitingRequests.shift()!.resolve();\r\n\t\t\t}\r\n\t\t};\r\n\t\tif ( this._availableSlots.length > 0 ) {\r\n\t\t\treturn wrappedFn();\r\n\t\t} else {\r\n\t\t\t// Semaphore implementation using promises.\r\n\t\t\tconst waitingRequest = new Deferred();\r\n\t\t\tthis._waitingRequests.push( waitingRequest );\r\n\t\t\treturn waitingRequest.then<T, T>( () => wrappedFn() );\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\nexport default RateThrottler;\r\n\r\nexport function throttle<TParams extends unknown[], R>( fn: (...params: TParams) => TPromisable<R>, frequence: TimeFrequency ): (...params: TParams) => Promise<R> {\r\n\tconst semaphore = new RateThrottler( frequence );\r\n\treturn (...t: TParams): Promise<R> => {\r\n\t\treturn semaphore.execute<R>( async () => fn( ...t ) );\r\n\t};\r\n}\r\n", "import { TAsyncProducer, TProducer, TimeDuration } from \"..\";\r\nimport Deferred from \"./Deferred\";\r\n\r\nexport class Semaphore {\r\n\r\n\tprivate readonly _queuedRequests: Deferred<void>[];\r\n\tprivate _inProgress = 0;\r\n\r\n\t/** Creates a new Semaphore with a single slot. */\r\n\tpublic constructor();\r\n\t/** Creates a new Semaphore with the specified amounts of slots. */\r\n\tpublic constructor( availableSlots: number );\r\n\tpublic constructor(\r\n\t\tprivate _availableSlots: number = 1\r\n\t) {\r\n\t\tthis._queuedRequests = [];\r\n\t}\r\n\r\n\tprivate async _awaitSlot(): Promise<void> {\r\n\t\tif ( this._availableSlots > 0 ) {\r\n\t\t\tthis._availableSlots -= 1;\r\n\t\t\tthis._inProgress += 1;\r\n\t\t\treturn void 0;\r\n\t\t} else {\r\n\t\t\t// Semaphore implementation using promises.\r\n\t\t\tconst deferred = new Deferred();\r\n\t\t\tthis._queuedRequests.push( deferred );\r\n\t\t\treturn deferred.asPromise();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _releaseSlot() {\r\n\t\tconst waitingSlotToResolve = this._queuedRequests.shift();\r\n\t\tif ( waitingSlotToResolve ) {\r\n\t\t\t// Let the next request start.\r\n\t\t\twaitingSlotToResolve.resolve();\r\n\t\t} else {\r\n\t\t\t// Free a slot.\r\n\t\t\tthis._availableSlots += 1;\r\n\t\t\tthis._inProgress -= 1;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic async execute<T>( fn: TAsyncProducer<T> | TProducer<T>, cooldown: TimeDuration = TimeDuration.ZERO ) {\r\n\t\treturn this._awaitSlot().then( fn ).finally( () => { void cooldown.delay( () => this._releaseSlot() ); } );\r\n\t}\r\n\r\n\tpublic get availableSlots() {\r\n\t\treturn this._availableSlots;\r\n\t}\r\n\r\n\tpublic get queueSize() {\r\n\t\treturn this._queuedRequests.length;\r\n\t}\r\n\r\n\tpublic get inProgressSize() {\r\n\t\treturn this._inProgress;\r\n\t}\r\n\r\n}\r\n\r\nexport default Semaphore;\r\n", "import { TConsumer, TFunction, TProducer, TVoidFunction } from \"./functions.js\";\r\n\r\nexport type TMaybe<T> = T | null;\r\n\r\nexport function ensureDefined<T>( v: T, name = 'value' ): T {\r\n\tif ( isDefined( v ) )\r\n\t\treturn v;\r\n\tthrow new Error( 'Expected ' + name + ' to be defined, got: ' + v );\r\n}\r\n\r\nexport function isDefined<T>( x: T | null | undefined ): x is T {\r\n\treturn x !== null && x !== undefined;\r\n}\r\n\r\nexport function isNullOrUndefined( x: unknown ): x is null | undefined {\r\n\treturn x === null || x === undefined;\r\n}\r\n\r\nexport function ifDefined<R>( source: TMaybe<R>, callback: TConsumer<R> ): void {\r\n\tif ( isDefined( source ) )\r\n\t\tcallback( source );\r\n}\r\n\r\nexport function mapDefined<R, S>( source: TMaybe<R>, mapper: TFunction<R, S> ): TMaybe<S> {\r\n\tif ( isDefined( source ) )\r\n\t\treturn mapper( source );\r\n\treturn null;\r\n}\r\n\r\nexport function ifNullOrUndefined( source: TMaybe<unknown>, callback: TVoidFunction ): void {\r\n\tif ( isNullOrUndefined( source ) )\r\n\t\tcallback();\r\n}\r\n\r\nexport function throwIfNullOrUndefined( source: TMaybe<unknown>, errorProducer: TProducer<Error> = () => new Error( `Unexpected ${source} value` ) ): void {\r\n\treturn ifNullOrUndefined( source, () => { throw errorProducer(); } );\r\n}\r\n", "import { TConsumer, TFunction, TPredicate, TProducer, TVoidFunction } from \"./utils/functions.js\";\r\nimport { isDefined, isNullOrUndefined } from \"./utils/nulls.js\";\r\n\r\nexport class Optional<T> implements TOptional<T> {\r\n\r\n\tprivate _present: boolean;\r\n\tprivate _value: T | undefined;\r\n\r\n\tprivate constructor( t: T | null | undefined ) {\r\n\t\tconst defined = isDefined( t );\r\n\t\tthis._value = defined ? t : undefined;\r\n\t\tthis._present = defined;\r\n\t}\r\n\r\n\tpublic getRawValue(): T | undefined {\r\n\t\treturn this._value;\r\n\t}\r\n\r\n\tpublic get(): T {\r\n\t\treturn this.getOrElseThrow( () => new ErrorGetEmptyOptional() );\r\n\t}\r\n\r\n\tpublic getOrElseThrow( errorProducer: TProducer<Error> ): T {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\tthrow errorProducer();\r\n\t\treturn this._value!;\r\n\t}\r\n\r\n\tpublic set( t: T ) {\r\n\t\tif ( isNullOrUndefined( t ) )\r\n\t\t\tthrow new ErrorSetEmptyOptional();\r\n\t\tthis._value = t;\r\n\t\tthis._present = true;\r\n\t}\r\n\r\n\tprotected setNullable( t: T | null | undefined ) {\r\n\t\tif ( isDefined( t ) ) {\r\n\t\t\treturn this.set( t );\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic clear() {\r\n\t\tthis._value = undefined;\r\n\t\tthis._present = false;\r\n\t}\r\n\r\n\tpublic isEmpty(): this is TEmptyOptional<T> {\r\n\t\treturn !this._present;\r\n\t}\r\n\tpublic isPresent(): this is TPresentOptional<T> {\r\n\t\treturn this._present;\r\n\t}\r\n\r\n\tpublic ifEmpty( callback: TVoidFunction ) {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\treturn callback();\r\n\t}\r\n\tpublic ifPresent( callback: TConsumer<T> ) {\r\n\t\tif ( this.isPresent() )\r\n\t\t\treturn callback( this.get() );\r\n\t}\r\n\tpublic ifPresentThenClear( callback: TConsumer<T> ) {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\tcallback( this.get() );\r\n\t\t\tthis.clear();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic apply( callbackIfPresent: TConsumer<T>, callbackIfEmpty: TVoidFunction ) {\r\n\t\tif ( this.isEmpty() ) {\r\n\t\t\treturn callbackIfEmpty();\r\n\t\t} else {\r\n\t\t\treturn callbackIfPresent( this.get() );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseReturn( newValue: T ): T {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this.get();\r\n\t\t} else {\r\n\t\t\treturn newValue;\r\n\t\t}\r\n\t}\r\n\tpublic orElse = this.orElseReturn.bind( this );\r\n\r\n\tpublic orElseProduce( newValueProducer: TProducer<T> ): T {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this.get();\r\n\t\t} else {\r\n\t\t\treturn newValueProducer();\r\n\t\t}\r\n\t}\r\n\tpublic orElseGet = this.orElseProduce.bind( this );\r\n\r\n\tpublic orElseReturnAndApply( newValue: T ): T {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this.get();\r\n\t\t} else {\r\n\t\t\tthis.set( newValue );\r\n\t\t\treturn newValue;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseProduceAndApply( newValueProducer: TProducer<T> ): T {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this.get();\r\n\t\t} else {\r\n\t\t\tconst newValue = newValueProducer();\r\n\t\t\tthis.set( newValue );\r\n\t\t\treturn newValue;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseReturnNullableAndApply( newValue: T | null | undefined ): TOptional<T> {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\tthis.setNullable( newValue );\r\n\t\t\treturn this;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseProduceNullableAndApply( newValueProducer: TProducer<T | null | undefined> ): TOptional<T> {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\tconst newValue = newValueProducer();\r\n\t\t\tthis.setNullable( newValue );\r\n\t\t\treturn this;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseReturnNullable( newValue: T | null | undefined ) {\r\n\t\tif ( this.isEmpty() ) return Optional.ofNullable( newValue );\r\n\t\treturn this as TPresentOptional<T>;\r\n\t}\r\n\tpublic orElseNullable = this.orElseReturnNullable.bind( this );\r\n\r\n\r\n\tpublic orElseProduceNullable( newValueProducer: TProducer<T | null | undefined> ) {\r\n\t\tif ( this.isEmpty() ) {\r\n\t\t\tconst newValue = newValueProducer();\r\n\t\t\treturn Optional.ofNullable( newValue );\r\n\t\t}\r\n\t\treturn this as TPresentOptional<T>;\r\n\t}\r\n\tpublic orElseGetNullable = this.orElseProduceNullable.bind( this );\r\n\r\n\r\n\tpublic orElseThrow( errorProducer: TProducer<Error> ) {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\tthrow errorProducer();\r\n\t\treturn this as TPresentOptional<T>;\r\n\t}\r\n\r\n\tpublic throwIfPresent( errorProducer: TFunction<T, Error> ) {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\treturn this as TEmptyOptional<T>;\r\n\t\tthrow errorProducer( this.get() );\r\n\t}\r\n\r\n\tpublic mapTo<R>( mapper: TFunction<T, R | null | undefined> ) {\r\n\t\treturn this.flatMapTo( t => Optional.ofNullable( mapper( t ) ) );\r\n\t}\r\n\tpublic flatMapTo<R>( mapper: TFunction<T, TOptional<R>> ) {\r\n\t\treturn this.isPresent() ? mapper( this.get() ) : Optional.empty<R>();\r\n\t}\r\n\r\n\tpublic filter( predicate: TPredicate<T> ): this | TEmptyOptional<T> {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\treturn this;\r\n\t\tif ( predicate( this.get() ) )\r\n\t\t\treturn this;\r\n\t\treturn Optional.empty();\r\n\t}\r\n\r\n\tpublic static empty<T>(): TEmptyOptional<T> {\r\n\t\treturn new Optional( undefined ) as any;\r\n\t}\r\n\tpublic static of<T>( t: T ): TPresentOptional<T> {\r\n\t\tif ( isNullOrUndefined( t ) )\r\n\t\t\tthrow new ErrorCannotInstantiatePresentOptionalWithEmptyValue();\r\n\t\treturn new Optional( t ) as any;\r\n\t}\r\n\tpublic static ofNullable<T>( t: T | null | undefined ): TOptional<T> {\r\n\t\treturn new Optional( t ) as any;\r\n\t}\r\n\r\n}\r\nexport default Optional;\r\n\r\nexport type TOptional<T> = {\r\n\r\n\t/**\r\n\t * @returns the currently stored value, if any; throws {@link ErrorGetEmptyOptional} otherwise;\r\n\t */\r\n\tget(): T;\r\n\r\n\t/**\r\n\t * @returns the currently stored value, if any; returns undefined otherwise;\r\n\t */\r\n\tgetRawValue(): T | undefined;\r\n\r\n\t/**\r\n\t * @returns the currently stored value, if any; throws the error generated by errorProducer otherwise;\r\n\t */\r\n\tgetOrElseThrow: ( errorProducer: TProducer<Error> ) => T;\r\n\r\n\t/**\r\n\t * Places a new value inside this optional. Throws {@link ErrorSetEmptyOptional} if t is null or undefined.\r\n\t */\r\n\tset( t: T ): void;\r\n\r\n\t/**\r\n\t * Clears the current value from this optional, if any.\r\n\t */\r\n\tclear(): void;\r\n\tisEmpty(): boolean;\r\n\tisPresent(): boolean;\r\n\r\n\tifEmpty( callback: TVoidFunction ): void;\r\n\tifPresent( callback: TConsumer<T> ): void;\r\n\tapply<RP = void, RE = void>( callbackIfPresent: TFunction<T, RP>, callbackIfEmpty: TProducer<RE> ): RP | RE;\r\n\r\n\tthrowIfPresent: ( errorGenerator: TFunction<T, Error> ) => TEmptyOptional<T>;\r\n\r\n\t/** @deprecated[2025.07.25]: Replace with {@link orElseReturn} (drop-in replacement) */\r\n\torElse: ( newValue: T ) => T;\r\n\t/** @deprecated[2025.07.25]: Replace with {@link orElseProduce} (drop-in replacement) */\r\n\torElseGet: ( newValueProducer: TProducer<T> ) => T;\r\n\t/** @deprecated[2025.07.25]: Replace with {@link orElseReturnNullabe} (drop-in replacement) */\r\n\torElseNullable: ( newValue: T | null | undefined ) => TOptional<T>;\r\n\t/** @deprecated[2025.07.25]: Replace with {@link orElseProduceNullable} (drop-in replacement) */\r\n\torElseGetNullable: ( newValueProducer: TProducer<T | null | undefined> ) => TOptional<T>;\r\n\r\n\torElseReturn: ( newValue: T ) => T;\r\n\torElseProduce: ( newValueProducer: TProducer<T> ) => T;\r\n\torElseReturnNullable: ( newValue: T | null | undefined ) => TOptional<T>;\r\n\torElseProduceNullable: ( newValueProducer: TProducer<T | null | undefined> ) => TOptional<T>;\r\n\r\n\torElseReturnAndApply: ( newValue: T ) => T;\r\n\torElseProduceAndApply: ( newValueProducer: TProducer<T> ) => T;\r\n\torElseReturnNullableAndApply: ( newValue: T | null | undefined ) => TOptional<T>;\r\n\torElseProduceNullableAndApply: ( newValueProducer: TProducer<T | null | undefined> ) => TOptional<T>;\r\n\r\n\torElseThrow: ( errorProducer: TProducer<Error> ) => TPresentOptional<T>;\r\n\r\n\tmapTo<R>( mapper: TFunction<T, R> ): TOptional<R>;\r\n\tflatMapTo<R>( mapper: TFunction<T, TOptional<R>> ): TOptional<R>;\r\n\r\n\tfilter( predicate: TPredicate<T> ): TOptional<T>;\r\n}\r\nexport type TEmptyOptional<T> = TOptional<T> & {\r\n\tget(): never;\r\n\tisEmpty(): true;\r\n\tisPresent(): false;\r\n\tapply<RP = void, RE = void>( callbackIfPresent: TFunction<T, RP>, callbackIfEmpty: TProducer<RE> ): RE;\r\n}\r\nexport type TPresentOptional<T> = TOptional<T> & {\r\n\tget(): T;\r\n\tisEmpty(): false;\r\n\tisPresent(): true;\r\n\tapply<RP = void, RE = void>( callbackIfPresent: TFunction<T, RP>, callbackIfEmpty: TProducer<RE> ): RP;\r\n}\r\n\r\nexport class ErrorGetEmptyOptional extends Error {\r\n\tconstructor() {\r\n\t\tsuper( \"Cannot retrieve a value from an empty Optional.\" );\r\n\t}\r\n}\r\nexport class ErrorSetEmptyOptional extends Error {\r\n\tconstructor() {\r\n\t\tsuper( \"Cannot set a null or undefined value.\" );\r\n\t}\r\n}\r\nexport class ErrorCannotInstantiatePresentOptionalWithEmptyValue extends Error {\r\n\tconstructor() {\r\n\t\tsuper( \"Cannot initialize a PresentOptional with a null or undefined value.\" );\r\n\t}\r\n}\r\n", "\r\nimport { TFunction, TKeysOfType, TReadableArray } from \"../_index\";\r\n\r\nexport function groupByString<V, K extends TKeysOfType<V, string>>( arr: TReadableArray<V>, field: K ): Record<V[ K ] & string, V[]> {\r\n\treturn groupByStringWith( arr, t => t[ field ] as string );\r\n}\r\n\r\nexport function groupByNumber<V, K extends TKeysOfType<V, number>>( arr: TReadableArray<V>, field: K ): Record<V[ K ] & number, V[]> {\r\n\treturn groupByNumberWith( arr, t => t[ field ] as number );\r\n}\r\n\r\nexport function groupByBoolean<V, K extends TKeysOfType<V, boolean>>( arr: TReadableArray<V>, field: K ): Record<\"true\" | \"false\", V[]> {\r\n\treturn groupByBooleanWith( arr, t => t[ field ] as boolean );\r\n}\r\n\r\nexport function groupBySymbol<V, K extends TKeysOfType<V, symbol>>( arr: TReadableArray<V>, field: K ): Record<V[ K ] & symbol, V[]> {\r\n\treturn groupBySymbolWith( arr, t => t[ field ] as symbol );\r\n}\r\n\r\nexport function groupByStringWith<V, K extends string>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<K, V[]> {\r\n\treturn doGroupByWith<K, V>( arr, getter );\r\n}\r\n\r\nexport function groupByNumberWith<V, K extends number>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<K, V[]> {\r\n\treturn doGroupByWith<K, V>( arr, getter );\r\n}\r\n\r\nexport function groupByBooleanWith<V, K extends boolean>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<\"true\" | \"false\", V[]> {\r\n\treturn doGroupByWith<\"true\" | \"false\", V>( arr, item => getter( item ) ? \"true\" : \"false\" );\r\n}\r\n\r\nexport function groupBySymbolWith<V, K extends symbol>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<K, V[]> {\r\n\treturn doGroupByWith<K, V>( arr, getter );\r\n}\r\n\r\nfunction doGroupByWith<K extends string | number | symbol, V>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<K, V[]> { // TODO[2025-01-03, Native]: Migrate to native @ https://devblogs.microsoft.com/typescript/announcing-typescript-5-4/#object.groupby-and-map.groupby\r\n\treturn [ ...arr ].reduce( ( dict, cur ) => {\r\n\t\tconst key = getter( cur );\r\n\t\tif ( key !== null && key !== undefined ) {\r\n\t\t\tconst arr = dict[ key ] ?? [];\r\n\t\t\tarr.push( cur );\r\n\t\t\tdict[ key ] = arr;\r\n\t\t}\r\n\t\treturn dict;\r\n\t}, {} as Record<K, V[]> );\r\n}\r\n\r\n", "\r\nimport { TFunction, TKeysOfType } from \"../_index\";\r\n\r\nexport function indexByString<V, K extends TKeysOfType<V, string>>( arr: V[], field: K ): Record<V[K] & string, V> {\r\n\treturn indexByStringWith( arr, t => t[ field ] as string );\r\n}\r\n\r\nexport function indexByNumber<V, K extends TKeysOfType<V, number>>( arr: V[], field: K ): Record<V[K] & number, V> {\r\n\treturn indexByNumberWith( arr, t => t[ field ] as number );\r\n}\r\n\r\nexport function indexBySymbol<V, K extends TKeysOfType<V, symbol>>( arr: V[], field: K ): Record<V[K] & symbol, V> {\r\n\treturn indexBySymbolWith( arr, t => t[ field ] as symbol );\r\n}\r\n\r\nexport function indexByStringWith<V>( arr: V[], getter: TFunction<V, string> ): Record<string, V> {\r\n\treturn doIndexByWith<string, V>( arr, getter );\r\n}\r\n\r\nexport function indexByNumberWith<V>( arr: V[], getter: TFunction<V, number> ): Record<number, V> {\r\n\treturn doIndexByWith<number, V>( arr, getter );\r\n}\r\n\r\nexport function indexBySymbolWith<V>( arr: V[], getter: TFunction<V, symbol> ): Record<symbol, V> {\r\n\treturn doIndexByWith<symbol, V>( arr, getter );\r\n}\r\n\r\nfunction doIndexByWith<K extends string | number | symbol, V>( arr: V[], getter: TFunction<V, K> ): Record<K, V> {\r\n\treturn arr.reduce( ( dict, cur ) => {\r\n\t\tconst key = getter( cur );\r\n\t\tif ( key !== null && key !== undefined ) {\r\n\t\t\tif ( dict[ key ] ) {\r\n\t\t\t\tthrow new Error( `Multiple values indexed by same key \"${ String( key ) }\".` );\r\n\t\t\t}\r\n\t\t\tdict[ key ] = cur;\r\n\t\t}\r\n\t\treturn dict;\r\n\t}, {} as Record<K, V> );\r\n}\r\n\r\n", "import type { TReadableArray } from \"../arrays.js\";\r\n\r\nexport function average( arr: TReadableArray<number> ): number {\r\n\tconst f = 1 / arr.length;\r\n\treturn arr.reduce( ( tot, cur ) => tot + ( cur * f ), 0 );\r\n}\r\n\r\nexport function sum( arr: TReadableArray<number> ): number {\r\n\treturn arr.reduce( ( tot, cur ) => tot + cur, 0 );\r\n}\r\n\r\nexport function sumBy<T>( arr: TReadableArray<T>, getter: ( t: T ) => number ): number {\r\n\treturn sum( arr.map( getter ) );\r\n}\r\n\r\nexport function min( arr: TReadableArray<number> ): number {\r\n\tif ( arr.length === 0 ) throw new Error( 'Cannot calculate value on empty array' );\r\n\treturn arr.reduce( ( min, cur ) => cur < min ? cur : min );\r\n}\r\n\r\nexport function minBy<T>( arr: TReadableArray<T>, getter: ( t: T ) => number ): number {\r\n\treturn min( arr.map( getter ) );\r\n}\r\n\r\nexport function max( arr: TReadableArray<number> ): number {\r\n\tif ( arr.length === 0 ) throw new Error( 'Cannot calculate value on empty array' );\r\n\treturn arr.reduce( ( max, cur ) => cur > max ? cur : max );\r\n}\r\n\r\nexport function maxBy<T>( arr: TReadableArray<T>, getter: ( t: T ) => number ): number {\r\n\treturn max( arr.map( getter ) );\r\n}\r\n", "export function constant<T>( v: T ): () => T { return () => v; }\r\nexport function identity<T>( t: T ) { return t; }\r\nexport default constant;\r\n\r\nexport const constantNull = constant( null );\r\nexport const constantTrue = constant( true );\r\nexport const constantFalse = constant( false );\r\nexport const constantUndefined = constant( void 0 );\r\nexport const alwaysTrue = constantTrue;\r\nexport const alwaysFalse = constantFalse;\r\nexport const constantZero = constant( 0 );\r\nexport const constantOne = constant( 1 );\r\n", "import { TPredicate } from \"../_index\";\r\n\r\ntype TBooleanOrPredicate = boolean | TPredicate<void>;\r\ntype TIff<T> = {\r\n\telseIf<R>( pred: TBooleanOrPredicate, valueIfTrue: R ): TIff<T | R>;\r\n\totherwise<R>( valueIfElse: R ): T | R;\r\n}\r\n\r\nexport function iff<T>( firstPredicate: TBooleanOrPredicate, valueIfTrue: T ): TIff<T> {\r\n\r\n\tif ( firstPredicate === true || ( firstPredicate instanceof Function && firstPredicate() === true ) ) {\r\n\t\tconst ret: TIff<T> = {\r\n\t\t\telseIf: () => ret,\r\n\t\t\totherwise: () => valueIfTrue\r\n\t\t};\r\n\t\treturn ret;\r\n\t} else {\r\n\t\tconst ret: TIff<T> = {\r\n\t\t\telseIf: <R>( elseIf: TBooleanOrPredicate, valueIfElseIfTrue: R ) => iff<R>( elseIf, valueIfElseIfTrue ),\r\n\t\t\totherwise: <R>( valueIfElse: R ) => valueIfElse\r\n\t\t};\r\n\t\treturn ret;\r\n\t}\r\n\r\n}\r\n\r\nexport default iff;\r\n\r\n", "\r\nimport { constantTrue, type TPredicate } from \"../functions.ts\";\r\n\r\nexport class PredicateBuilder<T> {\r\n\r\n\tprivate _currentPredicate: TPredicate<T> = constantTrue;\r\n\r\n\tpublic and( predicate: TPredicate<T> ) {\r\n\t\tconst curPredicate = this._currentPredicate.bind( undefined );\r\n\t\tconst newPredicate = ( t: T ) => curPredicate( t ) && predicate( t );\r\n\t\tthis._currentPredicate = newPredicate;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic or( predicate: TPredicate<T> ) {\r\n\t\tconst newPredicate = ( t: T ) => this._currentPredicate( t ) || predicate( t );\r\n\t\tthis._currentPredicate = newPredicate;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic toPredicate() {\r\n\t\treturn this._currentPredicate;\r\n\t}\r\n\r\n}\r\n", "import { constantTrue, identity } from './functions/constant.js';\r\nexport * from './functions/_index.js';\r\n\r\nexport type TFunction<A, R> = ( a: A ) => R;\r\nexport type TTransformer<A, R> = TFunction<A, R>;\r\nexport type TVoidFunction = TFunction<void, void>\r\nexport type TProducer<R> = TFunction<void, R>;\r\nexport type TConsumer<T> = TFunction<T, void>;\r\nexport type TPredicate<T> = TFunction<T, boolean>;\r\nexport type TTypePredicate<T, R extends T> = ( t: T ) => t is R;\r\nexport type TIdentityFunction<T> = TFunction<T, T>;\r\n\r\nexport type TBiFunction<A, B, R> = ( a: A, b: B ) => R;\r\nexport type TBiConsumer<A, B> = TBiFunction<A, B, void>;\r\nexport type TBiPredicate<T> = TBiFunction<T, T, boolean>;\r\nexport type TAccumulator<A, B> = TBiFunction<A, B, A>;\r\n\r\nexport type TAsyncFunction<A, R> = TFunction<A, Promise<R>>;\r\nexport type TAsyncVoidFunction = TAsyncFunction<void, void>\r\nexport type TAsyncProducer<R> = TAsyncFunction<void, R>;\r\nexport type TAsyncConsumer<T> = TAsyncFunction<T, void>;\r\nexport type TAsyncPredicate<T> = TAsyncFunction<T, boolean>;\r\nexport type TAsyncBiFunction<A, B, R> = TBiFunction<A, B, Promise<R>>;\r\nexport type TAsyncBiConsumer<A, B> = TAsyncBiFunction<A, B, void>;\r\nexport type TAsyncBiPredicate<T> = TAsyncBiFunction<T, T, boolean>;\r\n\r\nexport type TAnyFunction<R> = ( ...args: unknown[] ) => R;\r\nexport type TAsyncAnyFunction<R> = ( ...args: unknown[] ) => Promise<R>;\r\n\r\nexport function isFunction( t: unknown ): t is Function { // eslint-disable-line @typescript-eslint/no-unsafe-function-type\r\n\treturn typeof t === 'function';\r\n}\r\n\r\nexport function noop(): void { } // eslint-disable-line @typescript-eslint/no-empty-function\r\n\r\nexport function filterWithTypePredicate<T, R extends T>( filter: TPredicate<T> ): TTypePredicate<T, R> {\r\n\treturn ( t: T ): t is R => filter( t );\r\n}\r\n\r\nexport function not<T>( predicate: TPredicate<T> ): TPredicate<T> {\r\n\treturn ( t: T ) => !predicate( t );\r\n}\r\n\r\nexport function and<T>( a: TPredicate<T>, b: TPredicate<T> ): TPredicate<T>;\r\nexport function and<T>( ...predicates: Array<TPredicate<T>> ): TPredicate<T> {\r\n\tif ( predicates.length === 0 ) return constantTrue;\r\n\telse if ( predicates.length === 1 ) return predicates[ 0 ];\r\n\treturn ( t: T ) => predicates.reduce( ( prev, cur ) => prev ? cur( t ) : false, true );\r\n}\r\n\r\nexport function or<T>( a: TPredicate<T>, b: TPredicate<T> ): TPredicate<T>;\r\nexport function or<T>( ...predicates: Array<TPredicate<T>> ): TPredicate<T> {\r\n\tif ( predicates.length === 0 ) return constantTrue;\r\n\telse if ( predicates.length === 1 ) return predicates[ 0 ];\r\n\treturn ( t: T ) => predicates.reduce( ( prev, cur ) => prev ? true : cur( t ), false );\r\n}\r\n\r\nexport function xor<T>( a: TPredicate<T>, b: TPredicate<T> ): TPredicate<T> {\r\n\treturn ( t: T ) => a( t ) !== b( t );\r\n}\r\n\r\nexport function pipedInvoke<T, A>( op1: TFunction<T, A> ): TFunction<T, A>;\r\nexport function pipedInvoke<T, A, B>( op1: TFunction<T, A>, op2: TFunction<A, B> ): TFunction<T, B>;\r\nexport function pipedInvoke<T, A, B, C>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C> ): TFunction<T, C>;\r\nexport function pipedInvoke<T, A, B, C, D>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D> ): TFunction<T, D>;\r\nexport function pipedInvoke<T, A, B, C, D, E>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E> ): TFunction<T, E>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F> ): TFunction<T, F>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F, G>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F>, op7: TFunction<F, G> ): TFunction<T, G>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F, G, H>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F>, op7: TFunction<F, G>, op8: TFunction<G, H> ): TFunction<T, H>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F, G, H, I>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F>, op7: TFunction<F, G>, op8: TFunction<G, H>, op9: TFunction<H, I> ): TFunction<T, I>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F, G, H, I>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F>, op7: TFunction<F, G>, op8: TFunction<G, H>, op9: TFunction<H, I>, ...operations: TFunction<any, any>[] ): TFunction<T, unknown>;\r\nexport function pipedInvoke( ...fns: Array<TFunction<any, any>>): TFunction<any, any> { return pipedInvokeFromArray( fns ) }\r\n\r\nexport function pipedInvokeFromArray<T, R>( fns: Array<TFunction<any, any>>): TFunction<any, any> {\r\n\tif ( fns.length === 0 ) {\r\n\t\treturn identity as TFunction<any, any>;\r\n\t}\r\n\r\n\tif ( fns.length === 1 ) {\r\n\t\treturn fns[ 0 ];\r\n\t}\r\n\r\n\treturn function piped( input: T ): R {\r\n\t\treturn fns.reduce( ( prev: any, fn: TFunction<T, R> ) => fn( prev ), input as any );\r\n\t};\r\n}\r\n", "\r\nimport { TFunction, identity } from \"../functions.js\";\r\n\r\nexport function uniq<T>( arr: T[] ): T[] {\r\n\treturn uniqBy( arr, identity );\r\n}\r\n\r\nexport function uniqBy<T, K>( arr: T[], getter: TFunction<T, K> ): T[] {\r\n\treturn arr.reduce( ( dict, cur ) => {\r\n\t\tconst key = getter( cur );\r\n\t\tif ( dict.keys.includes( key ) ) {\r\n\t\t\treturn dict;\r\n\t\t} else {\r\n\t\t\treturn {\r\n\t\t\t\tkeys: [ ...dict.keys, key ],\r\n\t\t\t\tvalues: [ ...dict.values, cur ]\r\n\t\t\t};\r\n\t\t}\r\n\t}, { keys: [], values: [] } as { keys: K[], values: T[] } ).values;\r\n}\r\n\r\nexport function uniqByKey<T, K extends keyof T>( arr: T[], key: K ): T[] {\r\n\treturn uniqBy( arr, item => item[ key ] );\r\n}\r\n", "import Optional, { type TOptional } from \"../Optional.js\";\r\nimport type { TComparisonFunction } from \"../sorting/_index.js\";\r\nimport type { TAccumulator, TBiPredicate, TPredicate, TTransformer } from \"./functions.js\";\r\nimport { isNullOrUndefined, type TMaybe } from \"./nulls.js\";\r\n\r\nexport * from './arrays/groupBy.js';\r\nexport * from './arrays/indexBy.js';\r\nexport * from './arrays/statistics.js';\r\nexport * from './arrays/uniqBy.js';\r\n\r\nexport type TReadableArray<T> = Array<T> | ReadonlyArray<T>;\r\nexport type TArrayable<T> = T | T[];\r\nexport type TEmptyArray = [];\r\n\r\nexport function ensureArray<const T>( t: T | Array<T> | null | undefined ): Array<T> {\r\n\tif ( isNullOrUndefined( t ) ) return [];\r\n\treturn t instanceof Array ? t : [ t ];\r\n}\r\nexport function ensureReadableArray<const T>( t: T | Array<T> | ReadonlyArray<T> | null | undefined ): TReadableArray<T> {\r\n\tif ( isNullOrUndefined( t ) ) return [];\r\n\treturn t instanceof Array ? t : [ t ];\r\n}\r\n\r\nexport function isArray<const T>( t: unknown ): t is Array<T> {\r\n\treturn t instanceof Array;\r\n}\r\n\r\n/**\r\n * Generate a new copy of an array with:\r\n * - the first instance of an item matching the predicate being replaced with the given argument\r\n * - the given argument added as last item of the array if the predicate did not produce a match\r\n * @param arr - the original array of items\r\n * @param item - the item to insert or update\r\n * @param predicate - a function that returns true iff an item is equal to the given argument\r\n * @returns a new copy of the array with the item updated or added in last place\r\n */\r\nexport function upsert<T>( arr: ReadonlyArray<T>, item: T, isEqual: TBiPredicate<T> ): Array<T> {\r\n\tconst index = arr.findIndex( a => isEqual( a, item ) );\r\n\tif ( index === -1 ) {\r\n\t\treturn [ ...arr, item ];\r\n\t} else {\r\n\t\treturn [\r\n\t\t\t...arr.slice( 0, index ),\r\n\t\t\titem,\r\n\t\t\t...arr.slice( index + 1 )\r\n\t\t];\r\n\t}\r\n}\r\n\r\nexport function range( start: number, end: number ): Array<number> {\r\n\tif ( end < start ) throw new Error();\r\n\tlet length = ( end - start ) + 1;\r\n\treturn new Array( length ).fill( 1 ).map( ( _, i ) => start + i );\r\n}\r\n\r\nexport function fill<T>( length: number, value: T ): Array<T> {\r\n\treturn new Array<T>( length ).fill( value );\r\n}\r\n\r\nexport function extendArray<T extends Record<string | number | symbol, unknown>, X extends Record<string | number | symbol, unknown>>( arr: TReadableArray<T>, props: X ): Array<( T & X )> {\r\n\treturn arr.map( ( t: T ) => ( {\r\n\t\t...t,\r\n\t\t...props\r\n\t} ) );\r\n}\r\n\r\nexport function extendArrayWith<T extends Record<string | number | symbol, unknown>, X extends Record<string | number | symbol, unknown>>( arr: TReadableArray<T>, propsFn: ( t: T ) => X ): Array<( T & X )> {\r\n\treturn arr.map( ( t: T ) => ( {\r\n\t\t...t,\r\n\t\t...propsFn( t )\r\n\t} ) );\r\n}\r\n\r\nexport function reverse<T>( arr: TReadableArray<T> ): Array<T> {\r\n\treturn [ ...arr ].reverse();\r\n}\r\n\r\nexport function first<T>( arr: TReadableArray<T>, defaultValue: TMaybe<T> = null ): TMaybe<T> {\r\n\treturn ( arr.length ? arr[ 0 ] : defaultValue );\r\n}\r\nexport function last<T>( arr: TReadableArray<T>, defaultValue: TMaybe<T> = null ): TMaybe<T> {\r\n\treturn ( arr.length ? arr[ arr.length - 1 ] : defaultValue );\r\n}\r\n\r\nexport const head = first;\r\nexport function tail<T>( arr: TReadableArray<T> ): T[] {\r\n\treturn ( arr.length ? arr.slice( 1 ) : [] );\r\n}\r\n\r\nexport function sortedArray<T>( arr: Array<T>, sortFn?: TComparisonFunction<T> | undefined ): Array<T>;\r\nexport function sortedArray<T>( arr: ReadonlyArray<T>, sortFn?: TComparisonFunction<T> | undefined ): ReadonlyArray<T>;\r\nexport function sortedArray<T>( arr: TReadableArray<T>, sortFn?: TComparisonFunction<T> | undefined ) {\r\n\treturn [ ...arr ].sort( sortFn );\r\n}\r\n\r\n/**\r\n * Custom implementation of includes which allows checking for arbitrary items inside the array.\r\n */\r\nexport function includes<T>( arr: TReadableArray<T>, item: unknown, fromIndex?: number ) {\r\n\treturn arr.includes( item as any, fromIndex );\r\n}\r\n\r\nexport function mapTruthys<T, R>( arr: Array<T>, mapper: ( value: T, index: number, array: T[] ) => R | undefined ): Array<R> {\r\n\treturn arr.map( mapper ).filter( value => value !== undefined ) as Array<R>;\r\n}\r\nexport function flatMapTruthys<T, R>( arr: Array<T>, mapper: ( value: T, index: number, array: T[] ) => R | undefined ): Array<R> {\r\n\treturn arr.flatMap( mapper ).filter( value => value !== undefined ) as Array<R>;\r\n}\r\n\r\nexport function filterMap<T, R>( array: T[], filterFn: TPredicate<T>, mapFn: TTransformer<T, R> ): R[] {\r\n\treturn array.filter( filterFn ).map( mapFn );\r\n}\r\n\r\nexport function filterMapReduce<T, U, R>( array: T[], filterFn: TPredicate<T>, mapFn: TTransformer<T, U>, reduceFn: TAccumulator<R, U>, initialValue: R ): R {\r\n\treturn array.filter( filterFn ).map( mapFn ).reduce( reduceFn, initialValue );\r\n}\r\n\r\n/**\r\n * Partitions the given array in two groups, in the first one there will be any and only values of the array that match the given predicate, in the second one there will be any and only values that don't.\r\n * @param arr the array of items\r\n * @param predicate the predicate to use to partition the array\r\n * @returns a tuple, where the first array contains items matching the predicate, and the second array contains items not matching the predicate.\r\n */\r\nexport function partition<T>( arr: T[], predicate: TPredicate<T> ): [ T[], T[] ] {\r\n\treturn arr.reduce( ( partition, item ) => {\r\n\t\tpartition[ ( predicate( item ) ? 0 : 1 ) ].push( item );\r\n\t\treturn partition;\r\n\t}, [ [], [] ] as [ T[], T[] ] );\r\n}\r\n\r\n/**\r\n * Maps the first truthy value in the array using the provided mapping function.\r\n * @param arr - The array of items.\r\n * @param mapFn - The mapping function.\r\n * @returns The first truthy value returned by the mapping function, or null if no truthy value is found.\r\n */\r\nexport function mapFirstTruthy<T, R>( arr: T[], mapFn: TTransformer<T, R> ): R | null {\r\n\tfor ( let i = 0; i < arr.length; i++ ) {\r\n\t\tconst result = mapFn( arr[ i ] );\r\n\t\tif ( result ) return result;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nexport function listToDict<T, K extends string, V>( arr: T[], mapFn: TTransformer<T, [ K, V ]> ): Record<K, V> {\r\n\treturn arr.reduce( ( dict: Partial<Record<K, V>>, cur: T ) => {\r\n\t\tconst [ key, value ] = mapFn( cur );\r\n\t\treturn { ...dict, [ key ]: value };\r\n\t}, {} satisfies Partial<Record<K, V>> );\r\n}\r\n\r\nexport function shallowArrayEquals( a: unknown[], b: unknown[] ): boolean {\r\n\tif ( a === b ) return true;\r\n\tif ( a.length !== b.length ) return false;\r\n\tfor ( let i = 0; i < a.length; i++ ) {\r\n\t\tif ( a[ i ] !== b[ i ] ) return false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\nexport function findInArray<T>( arr: T[], predicate: TPredicate<T> ): TOptional<T> {\r\n\treturn Optional.ofNullable( arr.find( predicate ) );\r\n}\r\n\r\nexport function findIndexInArray<T>( arr: T[], predicate: TPredicate<T> ): TOptional<number> {\r\n\tconst idx = arr.findIndex( predicate );\r\n\treturn idx === -1 ? Optional.empty() : Optional.of( idx );\r\n}\r\n\r\nexport function zip<T, R>( ts: T[], rs: R[] ): [ T, R ][] {\r\n\tif ( ts.length !== rs.length )\r\n\t\tthrow new Error( `Arrays must have the same length. Got ${ts.length} and ${rs.length}` );\r\n\treturn ts.map( ( t, i ) => [ t, rs[ i ]! ] as [ T, R ] );\r\n}\r\n\r\nexport function unzip<T, R>( arr: [ T, R ][] ): [ T[], R[] ] {\r\n\treturn arr.reduce( ( [ ts, rs ], [ t, r ] ) => {\r\n\t\treturn [ [ ...ts, t ], [ ...rs, r ] ];\r\n\t}, [ [], [] ] as [ T[], R[] ] );\r\n}\r\n\r\n/**\r\n * Gets the element at the specified index in the array, wrapped in an Optional.\r\n * Returns an empty Optional if the index is out of bounds (negative or >= array length).\r\n * @param arr - The array to get the element from\r\n * @param index - The index of the element to retrieve\r\n * @returns An Optional containing the element at the index, or empty if index is out of bounds\r\n */\r\nexport function arrayGet<T>( arr: TReadableArray<T>, index: number ) {\r\n\tif ( index < 0 || index >= arr.length )\r\n\t\treturn Optional.empty<T>();\r\n\treturn Optional.of<T>( arr[ index ] );\r\n}\r\n", "\r\nexport function isTrue( x: unknown ): x is true {\r\n\treturn x === true;\r\n}\r\n\r\nexport function isFalse( x: unknown ): x is false {\r\n\treturn x === false;\r\n}\r\n", "import { isDefined, isFunction, repeat, type TProducer } from \"./_index.ts\";\r\nimport { type TKeysOfType } from \"./records.ts\";\r\n\r\nexport type TCssRuleDeclarationKey = TKeysOfType<CSSStyleDeclaration, string> & string;\r\nexport type TCssVariableDeclarationKey = `--${string}`;\r\nexport type TCssGenericDeclarationKey = TCssRuleDeclarationKey | TCssVariableDeclarationKey;\r\nexport type TCssDeclarationRulesDictionary = Partial<Record<TCssGenericDeclarationKey, string>>;\r\nexport type TCssSelectorDeclarationRulesDictionary = {\r\n\t[ selector: string ]: TCssDeclarationRulesDictionary | TCssSelectorDeclarationRulesDictionary;\r\n}\r\n\r\nconst newLine = '\\n', tabulation = '\\t', colon = ':', semiColon = ';', space = ' ', openBracket = '{', closeBracket = '}';\r\n\r\nexport function cssDeclarationRulesDictionaryToCss( syleDeclarationRulesForSelectorsProduceable: TProduceable<TCssSelectorDeclarationRulesDictionary>, indent = 0 ) {\r\n\tconst syleDeclarationRulesForSelectors = produceableToValue( syleDeclarationRulesForSelectorsProduceable );\r\n\treturn Object.entries( syleDeclarationRulesForSelectors ).map( ( [ selector, styleDeclarationRules ] ) => {\r\n\t\tconst cssRules = cssSelectorDeclarationRulesDictionaryToCss( styleDeclarationRules, indent + 1 );\r\n\t\tif ( !cssRules.length ) return null;\r\n\t\treturn repeat( tabulation, indent ) + selector + space + openBracket + newLine + cssRules.join( newLine ) + newLine + closeBracket;\r\n\t} ).filter( Boolean ).join( newLine + newLine );\r\n}\r\n\r\n/* exported for test purposes only */\r\nexport function cssSelectorDeclarationRulesDictionaryToCss( styleDeclarationRules: TCssDeclarationRulesDictionary | TCssSelectorDeclarationRulesDictionary, indent = 0 ): string[] {\r\n\treturn Object.entries( styleDeclarationRules ).map( ( [ key, value ]: [ string, string | TCssSelectorDeclarationRulesDictionary ] ) => {\r\n\t\tif ( typeof value === 'string' ) {\r\n\t\t\tif ( key.startsWith( '--' ) ) {\r\n\t\t\t\treturn repeat( tabulation, indent ) + key + colon + space + value + semiColon;\r\n\t\t\t} else {\r\n\t\t\t\treturn repeat( tabulation, indent ) + pascalCaseToKebabCase( key ) + colon + space + value + semiColon;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\treturn repeat( tabulation, indent ) + key + space + openBracket + newLine + cssSelectorDeclarationRulesDictionaryToCss( value, indent + 1 ).join( newLine ) + newLine + repeat( tabulation, indent ) + closeBracket;\r\n\t\t}\r\n\t} );\r\n}\r\n\r\nexport function transformCssDictionary(\r\n\tdict: TCssSelectorDeclarationRulesDictionary,\r\n\ttransformer: ( key: TCssGenericDeclarationKey, value: string ) => string,\r\n): TCssSelectorDeclarationRulesDictionary {\r\n\tconst recurse = ( dict: TCssSelectorDeclarationRulesDictionary | Partial<Record<TCssGenericDeclarationKey, string>> ) => {\r\n\t\tconst newDict: TCssSelectorDeclarationRulesDictionary | Partial<Record<TCssGenericDeclarationKey, string>> = {};\r\n\t\tfor ( const [ key, value ] of Object.entries( dict ) ) {\r\n\t\t\tif ( typeof value === 'string' ) {\r\n\t\t\t\tconst newValue = transformer( key as TCssGenericDeclarationKey, value );\r\n\t\t\t\tif ( isDefined( newValue ) ) {\r\n\t\t\t\t\tnewDict[ key ] = newValue;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnewDict[ key ] = transformCssDictionary( value, transformer );\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn newDict;\r\n\t};\r\n\r\n\treturn recurse( dict ) as TCssSelectorDeclarationRulesDictionary;\r\n}\r\n\r\nfunction pascalCaseToKebabCase( s: string ) {\r\n\treturn s.split( /([A-Z][a-z]*)/ ).filter( Boolean ).map( n => n.toLowerCase() ).join( '-' );\r\n}\r\n\r\ntype TProduceable<T> = T | TProducer<T>;\r\nfunction produceableToValue<T>( t: TProduceable<T> ): T {\r\n\treturn isFunction( t ) ? t() : t;\r\n}\r\n", "import { asError } from \"../errors.js\";\r\nimport { identity, type TFunction, type TTransformer } from \"../functions.js\";\r\nimport type { TAsyncOperationTuple, TOperationTuple } from \"../operations.js\";\r\n\r\nexport function withTryCatch<R>( fn: TFunction<void, R>, errMapFn: TTransformer<Error, Error> = identity ): TOperationTuple<R, Error> {\r\n\ttry {\r\n\t\treturn [ fn(), void 0 ] as const;\r\n\t} catch ( e: unknown ) {\r\n\t\treturn [ void 0, errMapFn( asError( e ) ) ] as const;\r\n\t}\r\n}\r\n\r\nexport async function withTryCatchAsync<R>( fn: TFunction<void, Promise<R>>, errMapFn: TTransformer<Error, Error> = identity ): TAsyncOperationTuple<R, Error> {\r\n\ttry {\r\n\t\treturn [ await fn(), void 0 ] as const;\r\n\t} catch ( e: unknown ) {\r\n\t\treturn [ void 0, errMapFn( asError( e ) ) ] as const;\r\n\t}\r\n}\r\n", "import { isNullOrUndefined } from './nulls.js';\r\n\r\nexport * from './errors/withTryCatch.js';\r\n\r\nexport function asError( e: unknown ): Error {\r\n\tif ( e === undefined || e === null )\r\n\t\treturn new Error( 'Void message' );\r\n\tif ( isError( e ) )\r\n\t\treturn e;\r\n\tif ( typeof e === 'string' )\r\n\t\treturn new Error( e );\r\n\tif ( e instanceof String )\r\n\t\treturn new Error( e.toString() );\r\n\treturn new Error( JSON.stringify( e ) );\r\n}\r\n\r\nexport function isError( e: unknown ): e is Error {\r\n\treturn e instanceof Error;\r\n}\r\n\r\nexport function getMessageFromError( error: Error ): string {\r\n\treturn `${error.name}: ${error.message}${getCauseMessageFromError( error )}`;\r\n}\r\n\r\nexport function getStackFromError( error: Error ): string {\r\n\tconst stack = error.stack && error.stack.includes( error.message ) ? error.stack : error.message + ' ' + ( error.stack ?? '' );\r\n\treturn `${error.name}: ${stack}${getCauseStackFromError( error )}`;\r\n}\r\n\r\nexport function getCauseMessageFromError( error: Error ) {\r\n\tif ( isNullOrUndefined( error.cause ) )\r\n\t\treturn '';\r\n\treturn `\\ncaused by: ${getMessageFromError( asError( error.cause ) )}`\r\n}\r\n\r\nexport function getCauseStackFromError( error: Error ) {\r\n\tif ( isNullOrUndefined( error.cause ) )\r\n\t\treturn '';\r\n\treturn `\\ncaused by: ${getStackFromError( asError( error.cause ) )}`\r\n}\r\n\r\n/**\r\n * Throws an error if a switch discriminated union type does not cover all the expected cases. \r\n * Expected usage: `\r\n * switch ( x.type ) { \r\n * case \"x\": return doX();\r\n * case \"y\": return doY();\r\n * ...\r\n * default: throw new NonExhaustiveSwitchError( x satisfies never );\r\n * }`\r\n */\r\nexport class NonExhaustiveSwitchError extends Error {\r\n\r\n\tconstructor( value: unknown ) {\r\n\t\tsuper( \"Expected switch to be exhaustive, got: \" + value );\r\n\t}\r\n\r\n}\r\n", "import { withTryCatch } from \"./errors.js\";\r\n\r\nexport type TJsonPrimitive = string | number | boolean | null | undefined;\r\nexport type TJsonArray = Array<TJsonSerializable> | ReadonlyArray<TJsonSerializable>;\r\nexport type TJsonObject = { [ key: string ]: TJsonSerializable }\r\nexport type TJsonSerializable = TJsonPrimitive | TJsonArray | TJsonObject;\r\n\r\nexport function tryToParseJson<T extends TJsonSerializable>( jsonContent: string ): [ T, undefined ] | [ undefined, Error ] {\r\n\treturn withTryCatch( () => parseJson<T>( jsonContent ) );\r\n}\r\n\r\nexport function parseJson<T extends TJsonSerializable>( jsonContent: string ): T {\r\n\treturn JSON.parse( jsonContent ) as T;\r\n}\r\n\r\nexport function stringifyJson( jsonSerializable: TJsonSerializable, minify = false ): string {\r\n\treturn JSON.stringify( jsonSerializable, undefined, minify ? undefined : 2 );\r\n}\r\n\r\nexport function jsonCloneDeep<A extends TJsonSerializable>( a: A ): A {\r\n\r\n\t// Handle the 3 simple types, and null or undefined\r\n\tif ( null === a || \"object\" !== typeof a ) return a;\r\n\r\n\tif ( a instanceof Date ) {\r\n\t\t// Handle Date\r\n\t\treturn new Date( a.getTime() ) as unknown as A;\r\n\t} else if ( a instanceof Array ) {\r\n\t\t// Handle Array\r\n\t\tconst copy = [] as unknown[];\r\n\t\tfor ( let i = 0, len = a.length; i < len; i++ ) {\r\n\t\t\tcopy[ i ] = jsonCloneDeep( a[ i ] );\r\n\t\t}\r\n\t\treturn copy as A;\r\n\t} else if ( a instanceof Object ) {\r\n\t\t// Handle Object\r\n\t\tconst copy = {} as Record<string | number | symbol, unknown>;\r\n\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n\t\tfor ( let attr in ( a as TJsonObject ) ) {\r\n\t\t\tif ( a.hasOwnProperty( attr ) )\r\n\t\t\t\tcopy[ attr ] = jsonCloneDeep( a[ attr ] );\r\n\t\t}\r\n\t\treturn copy as A;\r\n\t}\r\n\r\n\tthrow new Error( \"Unable to copy obj! Its type isn't supported.\" );\r\n\r\n}\r\n\r\nexport function omitFromJsonObject<T extends TJsonObject, K extends keyof T>( o: T, ...keys: K[] ): Omit<T, K> {\r\n\treturn keys.reduce( ( obj, key ) => {\r\n\t\tdelete obj[ key ];\r\n\t\treturn obj;\r\n\t}, { ...o } );\r\n}\r\n", "\r\ntype TRoundMode = 'toNearest' | 'toLower' | 'toUpper' | 'towardsZero' | 'awayFromZero';\r\ntype TIntegerNumber = number;\r\n\r\nconst roundModes: Record<TRoundMode, ( n: number ) => TIntegerNumber> = {\r\n\t'toNearest': Math.round,\r\n\t'toLower': Math.floor,\r\n\t'toUpper': Math.ceil,\r\n\t'towardsZero': n => n > 0 ? Math.floor( n ) : Math.ceil( n ),\r\n\t'awayFromZero': n => n > 0 ? Math.ceil( n ) : Math.floor( n ),\r\n};\r\n\r\nexport function round( n: number, precision: number = 0, mode: TRoundMode = 'toNearest' ) {\r\n\tconst base = 10;\r\n\tconst power = Math.pow( base, precision );\r\n\treturn roundModes[ mode ]( n * power ) / power;\r\n}\r\n\r\nexport default round;\r\nexport const roundToNearest = ( n: number, precision: number = 0 ) => round( n, precision, 'toNearest' );\r\nexport const roundToLower = ( n: number, precision: number = 0 ) => round( n, precision, 'toLower' );\r\nexport const roundToUpper = ( n: number, precision: number = 0 ) => round( n, precision, 'toUpper' );\r\nexport const roundTowardsZero = ( n: number, precision: number = 0 ) => round( n, precision, 'towardsZero' );\r\nexport const roundAwayFromZero = ( n: number, precision: number = 0 ) => round( n, precision, 'awayFromZero' );\r\n\r\n", "\r\nimport { withTryCatch } from \"./errors.js\";\r\nimport type { TFunction } from \"./functions.js\";\r\nimport { ensureDefined } from \"./nulls.js\";\r\n\r\nexport * from './numbers/round.js';\r\n\r\nexport type TNumericString = `${number}`;\r\nexport type TNumericFloatingPointString = `${number}.${number}`;\r\nexport type TPositiveNumber = number; // Only used for semantics. Cannot do better typechecking at the moment.\r\nexport type TNegativeNumber = number; // Only used for semantics. Cannot do better typechecking at the moment.\r\n\r\nexport type TZero = 0;\r\nexport type TDigit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\r\nexport type TDigit1_9 = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\r\nexport type TNumber0_100 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100;\r\nexport type TNumber0_1000 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |\r\n\t100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 |\r\n\t200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 |\r\n\t300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 |\r\n\t400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 |\r\n\t500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 |\r\n\t600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 |\r\n\t700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 |\r\n\t800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 |\r\n\t900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999\r\nexport type TNumber0_5 = 0 | 1 | 2 | 3 | 4 | 5;\r\nexport type TNumber0_10 = TNumber0_5 | 6 | 7 | 8 | 9 | 10;\r\nexport type TNumber0_15 = TNumber0_10 | 11 | 12 | 13 | 14 | 15;\r\nexport type TNumber0_20 = TNumber0_15 | 16 | 17 | 18 | 19 | 20;\r\nexport type TNumber1_10 = Exclude<TNumber0_10, 0>;\r\n\r\nexport type TParseInt<T> = T extends `${infer N extends number}` ? N : never;\r\nexport type TParseableInt<T> = T extends `${number}` ? T : never;\r\n\r\nexport function ensurePositiveNumber( v: number, name = 'value' ): number {\r\n\tif ( v !== undefined && v !== null && v > 0 )\r\n\t\treturn v;\r\n\tthrow new Error( `Expected ${name} to be positive, got: ${v}` );\r\n}\r\nexport function ensureNonNegativeNumber( v: number, name = 'value' ): number {\r\n\tif ( v !== undefined && v !== null && v >= 0 )\r\n\t\treturn v;\r\n\tthrow new Error( `Expected ${name} to be non-negative, got: ${v}` );\r\n}\r\nexport function ensureNonPositiveNumber( v: number, name = 'value' ): number {\r\n\tif ( v !== undefined && v !== null && v <= 0 )\r\n\t\treturn v;\r\n\tthrow new Error( `Expected ${name} to be non-positive, got: ${v}` );\r\n}\r\nexport function ensureNegativeNumber( v: number, name = 'value' ): number {\r\n\tif ( v !== undefined && v !== null && v < 0 )\r\n\t\treturn v;\r\n\tthrow new Error( `Expected ${name} to be negative, got: ${v}` );\r\n}\r\n\r\nexport function incrementBy( n: number ): TFunction<number, number> {\r\n\treturn ( v ) => v + n;\r\n}\r\nexport function multiplyBy( n: number ): TFunction<number, number> {\r\n\treturn ( v ) => v * n;\r\n}\r\nexport function divideBy( n: number ): TFunction<number, number> {\r\n\treturn ( v ) => v / n;\r\n}\r\nexport const increment = incrementBy( 1 );\r\nexport const decrement = incrementBy( -1 );\r\nexport const decrementBy = ( n: number ) => incrementBy( -n );\r\n\r\nexport function isNumber( v: unknown ): v is number {\r\n\treturn typeof v === \"number\";\r\n}\r\n\r\nexport function isPositiveNumber( v: number ): v is TPositiveNumber {\r\n\treturn v > 0;\r\n}\r\n\r\nexport function isNegativeNumber( v: number ): v is TNegativeNumber {\r\n\treturn v < 0;\r\n}\r\n\r\nexport function isZero( v: number ): v is TZero {\r\n\treturn v === 0;\r\n}\r\n\r\nexport function clamp( n: number, min: number, max: number ): number {\r\n\tif ( min === null || max === null || n === null || isNaN( min ) || isNaN( max ) || isNaN( n ) || min > max )\r\n\t\tthrow new Error();\r\n\tif ( n > max ) {\r\n\t\treturn max;\r\n\t} else if ( n < min ) {\r\n\t\treturn min;\r\n\t} else {\r\n\t\treturn n;\r\n\t}\r\n}\r\nexport function clampInt0_100( n: number ) {\r\n\treturn clamp( Math.round( n ), 0, 100 ) as TNumber0_100;\r\n}\r\n\r\nexport function tryToParseNumber( numberStr: string ) {\r\n\treturn withTryCatch( () => {\r\n\t\tconst type = typeof ensureDefined( numberStr );\r\n\t\tif ( type !== \"string\" ) throw new Error( 'Invalid number given: ' + numberStr );\r\n\t\tif ( numberStr.trim().length === 0 ) throw new Error( 'Invalid number given: ' + numberStr );\r\n\t\tconst num = Number( numberStr );\r\n\t\tif ( isNaN( num ) ) throw new Error( 'Invalid number given: ' + numberStr );\r\n\t\treturn num;\r\n\t} );\r\n}\r\n", "\r\nexport type TOperation<T, E = Error> = {\r\n\tsuccess: false;\r\n\terror: E;\r\n} | {\r\n\tsuccess: true;\r\n\tdata: T;\r\n};\r\n\r\nexport type TAsyncOperation<T, E = Error> = Promise<TOperation<T, E>>;\r\n\r\nexport type TOperationTuple<T, E = Error> = [ T, undefined ] | [ undefined, E ];\r\n\r\nexport type TAsyncOperationTuple<T, E = Error> = Promise<TOperationTuple<T, E>>;\r\n\r\nexport type TValidation<T, E = Error> = {\r\n\tsuccess: false;\r\n\terrors: E[];\r\n} | {\r\n\tsuccess: true;\r\n\tdata: T;\r\n};\r\n\r\nexport type TAsyncValidation<T, E = Error> = Promise<TValidation<T, E>>;\r\n\r\nexport const Operation = {\r\n\tok: <const T>( data: T ) => {\r\n\t\treturn { success: true, data } as const satisfies TOperation<T, unknown>;\r\n\t},\r\n\tko: <const E>( error: E ) => {\r\n\t\treturn { success: false, error } as const satisfies TOperation<unknown, E>;\r\n\t},\r\n}\r\n", "import TimeDuration from \"../time/TimeDuration.js\";\r\nimport { TAsyncFunction, TFunction } from \"./functions.js\";\r\n\r\nexport type TPromisable<T> = T | Promise<T>;\r\n\r\nexport function asPromise<T>( promisable: TPromisable<T> ): Promise<T> {\r\n\treturn Promise.resolve( promisable );\r\n}\r\n\r\nexport function promiseSequence<R>( ...fns: TFunction<void, Promise<R>>[] ): TFunction<void, Promise<R[]>> {\r\n\tconst fn = async function (): Promise<R[]> {\r\n\t\tconst results: R[] = [];\r\n\t\tfor ( let i = 0; i < fns.length; i++ ) {\r\n\t\t\tresults[ i ] = await fns[ i ]();\r\n\t\t}\r\n\t\treturn results;\r\n\t};\r\n\treturn fn;\r\n}\r\n\r\nexport function delayPromise<T>( duration: TimeDuration ): TAsyncFunction<T, T> {\r\n\treturn ( result: T ) => duration.promise().then( () => result );\r\n}\r\n\r\ntype TAwaitAtMostOutput<T> = { status: 'ok', value: T } | { status: 'timeout', value?: never };\r\nexport class TimeoutError extends Error {}\r\n\r\nexport async function awaitAtMost<T>( promise: Promise<T>, duration: TimeDuration ): Promise<T> {\r\n\treturn Promise.race<TAwaitAtMostOutput<T>>( [\r\n\t\tpromise.then( value => ( { status: 'ok', value } ) ),\r\n\t\tduration.promise().then( () => ( { status: 'timeout' } ) )\r\n\t] ).then( ( { status, value } ) => {\r\n\t\tif ( status === 'ok' )\r\n\t\t\treturn value;\r\n\t\tthrow new TimeoutError( \"Time out reached while waiting for a promise to resolve.\" );\r\n\t} );\r\n}\r\n\r\nexport const NEVER = new Promise( _resolve => { /* never end */ } );\r\n", "import { TPositiveNumber } from \"./numbers.ts\";\r\n\r\nexport function randomNumberInInterval( min: number, max: number ): number {\r\n\treturn Math.floor( Math.random() * ( max - min + 1 ) + min );\r\n}\r\n\r\nexport const randomId = ( length: TPositiveNumber ): string => {\r\n\treturn Math.random().toString(36).substring(2, length + 2);\r\n}\r\n", "import { TFunction } from \"../_index\";\r\n\r\nexport function dictToEntries<V, K extends string = string>( obj: Record<K, V> ): [ K, V ][] {\r\n\treturn Object.entries( obj ) as [ K, V ][];\r\n}\r\n\r\nexport function entriesToDict<V, K extends string = string>( entries: [ K, V ][] ): Record<K, V> {\r\n\treturn Object.fromEntries( entries ) as Record<K, V>;\r\n}\r\n\r\nexport function entriesToEntries<K1 extends string, V1, K2 extends string, V2>( dict: Record<K1, V1>, mapper: TFunction<[ K1, V1 ], [ K2, V2 ]> ): Record<K2, V2> {\r\n\treturn entriesToDict( dictToEntries( dict ).map( ( entry ) => mapper( entry ) ) );\r\n}\r\n\r\n/** @deprecated[2025.08.01]: Compatibility layer. */\r\nexport const mapEntries = entriesToEntries;\r\n\r\nexport function entriesToList<K1 extends string, V1, R>( dict: Record<K1, V1>, mapper: TFunction<[ K1, V1 ], R> ): Array<R> {\r\n\treturn dictToEntries( dict ).map( ( entry ) => mapper( entry ) );\r\n}\r\n", "\r\nexport * from './records/entries.js';\r\n\r\nexport type TEmpty = Record<string, never>;\r\nexport type TKeysOfType<T, V> = { [ K in keyof T ]-?: T[ K ] extends V ? K : never }[ keyof T ];\r\n\r\nexport function dictToList<T>( obj: Record<string | number, T> ): T[] {\r\n\treturn Object.keys( obj ).map( key => obj[ key ] );\r\n}\r\n\r\nexport function pick<T extends object, K extends keyof T>( o: T, keys: K[] ): Pick<T, K> {\r\n\treturn keys.reduce( ( obj, key ) => {\r\n\t\tobj[ key ] = o[ key ];\r\n\t\treturn obj;\r\n\t}, {} as Pick<T, K> );\r\n}\r\n\r\nexport type TOptionsWithoutDefaults<T, R> = Partial<T> & Required<Omit<T, keyof R>>;\r\nexport type TOptionalKeysForType<T> = { [ K in keyof T ]-?: {} extends Pick<T, K> ? K : never }[ keyof T ];\r\nexport type TRequiredKeysForType<T> = Exclude<keyof T, TOptionalKeysForType<T>>;\r\nexport type TAllKeysOptional<T> = TRequiredKeysForType<T> extends never ? true : false;\r\nexport type TConditionalParameter<T> = TAllKeysOptional<T> extends true ? T | undefined : T;\r\nexport type TConditionalParameterOptions<T, R> = TConditionalParameter<TOptionsWithoutDefaults<T, R>>;\r\n\r\n/**\r\n * Given a type T, replaces all fields of type From to fields of type To.\r\n */\r\nexport type TReplaceType<T, From, To> = { [ K in keyof T ]: T[ K ] extends From ? To : T[ K ]; };\r\n\r\n/**\r\n * Given a type T, make field K required instead of optional.\r\n */\r\nexport type TWithRequiredProperty<T, K extends keyof T> = T & {\r\n\t[ Property in K ]-?: T[ Property ];\r\n};\r\n\r\n/**\r\n * Given a type T, make all fields required instead of optional.\r\n */\r\nexport type TWithRequiredProperties<T> = Required<T>;\r\n\r\n/**\r\n * Type that forces a record to contain a few properties, but allows for extraneous properties.\r\n */\r\nexport type TWithExtras<R extends Record<any, any>, T extends Record<any, any> = Record<string, unknown>> = R & T;\r\n\r\n/**\r\n * Types that improves the human readability of a Typescript type.\r\n */\r\nexport type TPrettify<T> = { [ K in keyof T ]: T[ K ]; } & {};\r\n\r\nexport function shallowRecordEquals( a: Record<string, unknown>, b: Record<string, unknown> ): boolean {\r\n\tif ( a === b ) return true;\r\n\tconst aKeys = Object.keys( a ), bKeys = Object.keys( b );\r\n\tif ( aKeys.length !== bKeys.length ) return false;\r\n\tfor ( const key of aKeys ) {\r\n\t\tif ( a[ key ] !== b[ key ] ) return false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\n/**\r\n * A utility type that checks if any property in a record type `T` has the `never` type.\r\n * This type evaluates to `true` if at least one property in `T` is of type `never`, and `false` otherwise.\r\n * It's commonly used to create compile-time assertions that prevent unintended changes where properties might accidentally become `never` due to type mismatches.\r\n *\r\n * @example Advanced usage for type guards\r\n * ```typescript\r\n * type TMap = { a: string; b: number; c: boolean };\r\n * type TJsonSerializable = string | number | boolean;\r\n *\r\n * type TFiltered = {\r\n * [K in keyof TMap]: TMap[K] extends TJsonSerializable ? TMap[K] : never;\r\n * };\r\n *\r\n * // If TMap changes and some property becomes not serializable, TFiltered will have 'never' values\r\n * const _guard: THasNever<TFiltered> = false; // Compile error if any property became 'never'\r\n * ```\r\n */\r\nexport type THasNever<T> = { [ K in keyof T ]: [ T[ K ] ] extends [ never ] ? true : false }[ keyof T ] extends false ? false : true;\r\n", "import { TReadableArray } from \"../arrays.js\";\r\nimport { TMaybe } from \"../nulls.js\";\r\nimport { capitalizeWord } from \"../strings.js\";\r\n\r\nexport class StringParts {\r\n\r\n\tprivate readonly _parts: string[];\r\n\r\n\tprivate constructor( ...parts: string[] ) {\r\n\t\tthis._parts = parts;\r\n\t}\r\n\r\n\tpublic toUpperCase() {\r\n\t\treturn new StringParts( ...this.parts.map( part => part.toUpperCase() ) );\r\n\t}\r\n\r\n\tpublic toLowerCase() {\r\n\t\treturn new StringParts( ...this.parts.map( part => part.toLowerCase() ) );\r\n\t}\r\n\r\n\tpublic capitalizeFirst() {\r\n\t\tif ( !this.length ) return this;\r\n\t\treturn new StringParts( capitalizeWord( this.first! ), ...this.tail.map( part => part.toLowerCase() ) );\r\n\t}\r\n\r\n\tpublic capitalizeEach() {\r\n\t\treturn new StringParts( ...this.parts.map( part => capitalizeWord( part ) ) );\r\n\t}\r\n\r\n\tpublic get parts() {\r\n\t\treturn this._parts;\r\n\t}\r\n\r\n\tpublic get tail() {\r\n\t\tconst [ _first, ...tail ] = this.parts;\r\n\t\treturn tail;\r\n\t}\r\n\r\n\tpublic get first(): TMaybe<string> {\r\n\t\treturn this._parts[ 0 ] ?? null;\r\n\t}\r\n\r\n\tpublic get last(): TMaybe<string> {\r\n\t\treturn this._parts[ this.length - 1 ] ?? null;\r\n\t}\r\n\r\n\tpublic get length() {\r\n\t\treturn this._parts.length;\r\n\t}\r\n\r\n\tpublic trim() {\r\n\t\treturn new StringParts( ...this.parts.map( part => part.trim() ) );\r\n\t}\r\n\r\n\tpublic toSnakeCase() {\r\n\t\treturn this.toLowerCase().join( '_' );\r\n\t}\r\n\r\n\tpublic toCamelCase() {\r\n\t\tif ( !this.length ) return '';\r\n\t\treturn [ this.first!.toLowerCase(), ...this.tail.map( capitalizeWord ) ].join( '' );\r\n\t}\r\n\r\n\tpublic toKebabCase() {\r\n\t\treturn this.toLowerCase().join( '-' );\r\n\t}\r\n\r\n\tpublic toPascalCase() {\r\n\t\treturn this.capitalizeEach().join( '' );\r\n\t}\r\n\r\n\tpublic toHumanCase() {\r\n\t\treturn this.capitalizeFirst().join( ' ' );\r\n\t}\r\n\r\n\tpublic join( separator: string ) {\r\n\t\treturn this.parts.join( separator );\r\n\t}\r\n\r\n\tpublic mergeWith( { parts: otherParts }: { parts: TReadableArray<string>; } ) {\r\n\t\treturn new StringParts( ...this.parts, ...otherParts );\r\n\t}\r\n\r\n\tpublic slice( start: number, end?: number ) {\r\n\t\treturn new StringParts( ...this.parts.slice( start, end ) );\r\n\t}\r\n\r\n\tpublic splice( start: number, deleteCount: number, ...items: string[] ) {\r\n\t\treturn new StringParts( ...this.parts.splice( start, deleteCount, ...items ) );\r\n\t}\r\n\r\n\tpublic push( part: string ) {\r\n\t\treturn new StringParts( ...this.parts, part );\r\n\t}\r\n\r\n\tpublic shift( part: string ) {\r\n\t\treturn new StringParts( part, ...this.parts );\r\n\t}\r\n\r\n\tpublic reverse() {\r\n\t\treturn new StringParts( ...this.parts.reverse() );\r\n\t}\r\n\r\n\tpublic static fromString = ( s: string, separator: string | RegExp = /\\s+/g ) => {\r\n\t\tif ( s === null || separator === null )\r\n\t\t\tthrow new Error( 'Invalid arguments' );\r\n\t\treturn new StringParts( ...s.split( separator ) );\r\n\t};\r\n\r\n\tpublic static fromParts = ( ...parts: string[] ) => {\r\n\t\treturn new StringParts( ...parts );\r\n\t};\r\n\r\n\t/**\r\n\t * Tries to convert a word in PascalCase to an array of words. Will not work if there are spaces or special characters. Does not cope well on uppercase abbreviations (eg, \"CSS\").\r\n\t * @param s a string in PascalCase. \r\n\t * @returns a StringParts where each sub-word in PascalCase is now a part.\r\n\t */\r\n\tpublic static tryToParsePascalCaseWord( s: string ): StringParts {\r\n\t\treturn new StringParts( ...s.split( /([A-Z][a-z]*)/ ).filter( Boolean ).map( n => n.toLowerCase() ) );\r\n\t}\r\n\r\n}\r\n\r\n\r\n", "import { range } from \"./arrays.js\";\r\nimport { ensureDefined, isDefined, isNullOrUndefined, TMaybe } from \"./nulls.js\";\r\n\r\nexport * from './strings/StringParts.js';\r\n\r\n// Semantic-only\r\nexport type THtmlString = string;\r\nexport type TUrl = string;\r\nexport type TRelativeUrl = string;\r\n\r\nexport function hashCode( str: string ): number {\r\n\tlet hash = 0\r\n\tfor ( let i = 0; i < str.length; ++i )\r\n\t\thash = Math.imul( 31, hash ) + str.charCodeAt( i )\r\n\treturn hash | 0\r\n}\r\n\r\nexport function repeat( char: string, times: number ): string {\r\n\treturn times > 0 ? range( 0, times - 1 ).map( _ => char ).join( '' ) : '';\r\n}\r\n\r\nexport function capitalizeWord( word: string ): string {\r\n\treturn word[ 0 ].toUpperCase() + word.substring( 1 ).toLowerCase();\r\n}\r\n\r\nexport function splitWords( text: string, regEx: RegExp = /\\s+/ ): string[] {\r\n\treturn text.split( regEx ).filter( t => t.length > 0 );\r\n}\r\n\r\nexport function stringToNumber( s: string | null | undefined ): number | null {\r\n\tif ( isNullOrUndefined( s ) )\r\n\t\treturn null;\r\n\treturn Number( s );\r\n}\r\n\r\nexport function pad( str: string, n: number, char: string, where: 'left' | 'right' = 'left' ): string {\r\n\tconst length = ensureDefined( str ).length;\r\n\tif ( length >= ensureDefined( n ) ) return str;\r\n\r\n\tif ( ensureDefined( char ).length !== 1 )\r\n\t\tthrow new Error( 'Illegal pad character' );\r\n\tconst padding = repeat( char, n - length );\r\n\treturn ( where === 'left' ? padding : '' ) + str + ( where === 'right' ? padding : '' );\r\n}\r\n\r\nexport function padLeft( str: string, n: number, char: string ): string {\r\n\treturn pad( str, n, char, 'left' );\r\n}\r\n\r\nexport function padRight( str: string, n: number, char: string ): string {\r\n\treturn pad( str, n, char, 'right' );\r\n}\r\n\r\nexport function ellipsis( str: string, maxLength: number ): string {\r\n\tif ( maxLength < 4 ) \r\n\t\tthrow new Error( 'Invalid argument maxLength' );\r\n\tif ( str.length <= maxLength ) {\r\n\t\treturn str;\r\n\t} else {\r\n\t\treturn str.substring( 0, maxLength - 3 ) + '...';\r\n\t}\r\n}\r\n\r\nexport function pluralize( n: number, singular: string, plural?: string ): string {\r\n\r\n\tif ( !singular || !singular.length )\r\n\t\tthrow new Error();\r\n\tif ( n === 1 )\r\n\t\treturn singular;\r\n\r\n\tplural = plural ?? singular + 's';\r\n\r\n\tconst firstUppercase = singular.charAt( 0 ) === singular.charAt( 0 ).toUpperCase();\r\n\tif ( firstUppercase ) {\r\n\t\tconst PLURAL = plural.toUpperCase();\r\n\t\tconst isAllUppercase = plural === PLURAL;\r\n\t\tplural = isAllUppercase ? PLURAL : plural.charAt( 0 ).toUpperCase() + plural.slice( 1 ).toLowerCase();\r\n\t}\r\n\r\n\treturn plural;\r\n\r\n}\r\n\r\nexport function isString( source: unknown ): source is string {\r\n\treturn isDefined( source ) && typeof source === \"string\";\r\n}\r\n\r\nexport function isEmpty( source: string ): boolean {\r\n\treturn source.trim().length === 0;\r\n}\r\n\r\nexport function isNullOrUndefinedOrEmpty( source: TMaybe<string> ): boolean {\r\n\treturn isNullOrUndefined( source ) || isEmpty( source );\r\n}\r\n\r\n\r\nexport function wrapWithString( str: string, delimiter: string ): string;\r\nexport function wrapWithString( str: string, start: string, end: string ): string;\r\nexport function wrapWithString( str: string, start: string, end = start ): string {\r\n\tif ( isNullOrUndefinedOrEmpty( str ) )\r\n\t\tthrow new Error( `Expected string to be non-empty, got: \"${str}\"` );\r\n\tif ( isNullOrUndefinedOrEmpty( start ) )\r\n\t\tthrow new Error( `Expected start delimiter to be non-empty, got: \"${start}\"` );\r\n\tif ( isNullOrUndefinedOrEmpty( end ) )\r\n\t\tthrow new Error( `Expected end delimiter to be non-empty, got: \"${end}\"` );\r\n\treturn start + str + end;\r\n}\r\n", "\nimport { ensureDefined } from \"../utils/_index\";\n\n/**\n * Class that stores a value that is computationally/memory intensive to initialize.\n * The initialization of the value is done once and only if required (lazy initialization).\n * @author gtomberli\n */\nexport class Lazy<T> {\n\n\tprivate _value: T | undefined = undefined;\n\tprivate _initialized: boolean = false;\n\tprivate _generator: () => T;\n\n\tprivate constructor( generator: () => T ) {\n\t\tthis._generator = ensureDefined( generator );\n\t}\n\n\tpublic get value(): T | undefined {\n\t\treturn this._value;\n\t}\n\n\tpublic getOrCreate(): T {\n\t\tif ( !this._initialized ) {\n\t\t\tthis._value = this._generator();\n\t\t\tthis._initialized = true;\n\t\t}\n\t\treturn this._value!;\n\t}\n\n\tpublic getOrThrow( errorMessage?: \"Value not initialized\" ): T {\n\t\tif ( !this._initialized )\n\t\t\tthrow new Error( errorMessage );\n\t\treturn this._value!;\n\t}\n\n\tpublic or( t: T ): T {\n\t\tif ( !this._initialized ) {\n\t\t\treturn t;\n\t\t} else {\n\t\t\treturn this._value!;\n\t\t}\n\t}\n\n\tpublic isPresent() {\n\t\treturn this._initialized;\n\t}\n\n\tpublic isEmpty() {\n\t\treturn !this._initialized;\n\t}\n\n\tpublic ifPresent( fn: (t: T) => void ): void {\n\t\tif ( this.isPresent() ) {\n\t\t\tfn( this._value! );\n\t\t}\n\t}\n\n\tpublic ifEmpty( fn: () => void ): void {\n\t\tif ( this.isEmpty() ) {\n\t\t\tfn();\n\t\t}\n\t}\n\n\tpublic apply( fnPresent: (t: T) => void, fnEmpty: () => void ): void {\n\t\tif ( this.isPresent() ) {\n\t\t\tfnPresent( this._value! );\n\t\t} else {\n\t\t\tfnEmpty( );\n\t\t}\n\t}\n\n\tpublic static of<T>( generator: () => T ): Lazy<T> {\n\t\treturn new Lazy( generator );\n\t}\n\n}\n\nexport default Lazy;\n", "import { ensureDefined } from \"../utils/nulls.js\";\r\n\r\nexport class LazyAsync<T> {\r\n\r\n\tprivate _promise: Promise<T> | undefined = undefined;\r\n\tprivate _pending: boolean = false;\r\n\tprivate _resolvedValue: T | undefined = undefined;\r\n\tprivate _error: Error | undefined = undefined;\r\n\tprivate _generator: () => Promise<T>;\r\n\r\n\tprivate constructor( generator: () => Promise<T> ) {\r\n\t\tthis._generator = ensureDefined( generator );\r\n\t}\r\n\r\n\tpublic getOrCreate(): Promise<T> {\r\n\t\tif ( this.isEmpty() ) {\r\n\t\t\tthis._pending = true;\r\n\t\t\tthis._promise = this._generator();\r\n\t\t\tthis._promise.then( value => {\r\n\t\t\t\tthis._pending = false;\r\n\t\t\t\tthis._resolvedValue = value;\r\n\t\t\t}, err => {\r\n\t\t\t\tthis._pending = false;\r\n\t\t\t\tthis._error = err;\r\n\t\t\t} );\r\n\t\t}\r\n\t\treturn this._promise as Promise<T>;\r\n\t}\r\n\r\n\tpublic isPresent() {\r\n\t\treturn this._promise !== undefined;\r\n\t}\r\n\r\n\tpublic isEmpty() {\r\n\t\treturn this._promise === undefined;\r\n\t}\r\n\r\n\tpublic isPending() {\r\n\t\treturn this.isPresent() && this._pending === true;\r\n\t}\r\n\r\n\tpublic isReady() {\r\n\t\treturn this.isPresent() && this._pending === false;\r\n\t}\r\n\r\n\tpublic isResolved() {\r\n\t\treturn this.isReady() && this._error === undefined;\r\n\t}\r\n\t\r\n\tpublic isError() {\r\n\t\treturn this.isReady() && this._error !== undefined;\r\n\t}\r\n\r\n\tpublic ifPresent( fn: ( t: Promise<T> ) => void ): void {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\tfn( this._promise! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifEmpty( fn: () => void ): void {\r\n\t\tif ( this.isEmpty() ) {\r\n\t\t\tfn();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifPending( fn: ( t: Promise<T> ) => void ): void {\r\n\t\tif ( this.isPending() ) {\r\n\t\t\tfn( this._promise! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifReady( fn: ( t: Promise<T> ) => void ): void {\r\n\t\tif ( this.isReady() ) {\r\n\t\t\tfn( this._promise! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifResolved( fn: ( t: T ) => void ): void {\r\n\t\tif ( this.isResolved() ) {\r\n\t\t\tfn( this._resolvedValue! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifError( fn: ( err: Error ) => void ): void {\r\n\t\tif ( this.isError() ) {\r\n\t\t\tfn( this._error! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getOrThrow( errorMessage?: \"Value not initialized\" ): Promise<T> | never {\r\n\t\tif ( !this._promise )\r\n\t\t\tthrow new Error( errorMessage );\r\n\t\treturn this._promise;\r\n\t}\r\n\r\n\tpublic static of<T>( generator: () => Promise<T> ): LazyAsync<T> {\r\n\t\treturn new LazyAsync( generator );\r\n\t}\r\n\r\n}\r\n\r\nexport default LazyAsync;\r\n", "import type { TFunction } from \"../utils/_index.ts\";\r\n\r\nexport class LazyDictionary<K extends string | number | symbol, T> {\r\n\r\n\tprivate readonly _dictionary: Partial<Record<K, T>> = {};\r\n\r\n\tprivate constructor(\r\n\t\tprivate readonly _generator: TFunction<K, T>\r\n\t) { }\r\n\r\n\tpublic static of<K extends string | number | symbol, T>( generator: TFunction<K, T> ) {\r\n\t\treturn new LazyDictionary<K, T>( generator );\r\n\t}\r\n\r\n\tpublic getOrCreate( key: K ): T {\r\n\t\tif ( key in this._dictionary ) {\r\n\t\t\treturn this._dictionary[ key ] as T;\r\n\t\t}\r\n\r\n\t\tconst value = this._generator( key );\r\n\t\tthis._dictionary[ key ] = value;\r\n\r\n\t\treturn value;\r\n\t}\r\n\r\n\tpublic getOrThrow( key: K , errorMessage?: \"Value not initialized\" ): T {\r\n\t\tif ( key in this._dictionary ) {\r\n\t\t\treturn this._dictionary[ key ] as T;\r\n\t\t}\r\n\t\tthrow new Error( errorMessage );\r\n\t}\r\n\r\n}\r\n", "import { format } from \"small-date\";\r\nimport { ICancelable, ICancelablePromise } from \"../async/Deferred.js\";\r\nimport { TComparisonResult } from \"../sorting/_index.js\";\r\nimport TimeBase from \"./TimeBase\";\r\nimport TimeDuration from \"./TimeDuration\";\r\nimport { TTimeInstantBuilder, TTimeInstantCreationParameters, createTimeInstantFromParameters, timeInstantBuilder } from \"./TimeInstantBuilder.js\";\r\nimport { TimeUnit } from \"./TimeUnit\";\r\nimport { TDayOfMonth, TDayOfWeek, TIso8601DateString, TIso8601DateUtcString, TMonth, TWeekNumber } from \"./types\";\r\n\r\nexport class TimeInstant extends TimeBase<TimeInstant> {\r\n\r\n\tprotected constructor( number: number, unit: TimeUnit ) {\r\n\t\tsuper( number, unit );\r\n\t}\r\n\r\n\tprotected create( value: number, unit: TimeUnit ) {\r\n\t\treturn new TimeInstant( value, unit );\r\n\t}\r\n\r\n\tpublic addDuration( duration: TimeDuration ): TimeInstant {\r\n\t\treturn TimeInstant.fromUnixTimestamp( this.ms + duration.ms );\r\n\t}\r\n\r\n\tpublic removeDuration( duration: TimeDuration ): TimeInstant {\r\n\t\treturn TimeInstant.fromUnixTimestamp( this.ms - duration.ms );\r\n\t}\r\n\r\n\tpublic distanceFrom( instant: TimeInstant ): TimeDuration {\r\n\t\treturn TimeDuration.fromMs( Math.abs( this.ms - instant.ms ) );\r\n\t}\r\n\r\n\tpublic distanceFromNow(): TimeDuration {\r\n\t\treturn TimeDuration.fromMs( Math.abs( this.ms - Date.now() ) );\r\n\t}\r\n\t\r\n\tpublic distanceFromUnixTimestamp( timestamp: number ): TimeDuration {\r\n\t\treturn TimeDuration.ms( this.ms - timestamp );\r\n\t}\r\n\r\n\tpublic timeLeftFrom( instant: TimeInstant ): TimeDuration {\r\n\t\tconst distance = this.ms - instant.ms;\r\n\t\treturn TimeDuration.fromMs( Math.max( distance, 0 ) );\r\n\t}\r\n\r\n\tpublic timeLeftFromNow(): TimeDuration {\r\n\t\tconst distance = this.ms - Date.now();\r\n\t\treturn TimeDuration.fromMs( Math.max( distance, 0 ) );\r\n\t}\r\n\r\n\tpublic distanceFromStartOfDay(): TimeDuration {\r\n\t\treturn this.distanceFrom( this.atStartOfDay() );\r\n\t}\r\n\r\n\tpublic atStartOfDay(): TimeInstant {\r\n\t\treturn this.atTime( { hours: 0, minutes: 0, seconds: 0, milliseconds: 0 } );\r\n\t}\r\n\r\n\tpublic distanceFromEndOfDay(): TimeDuration {\r\n\t\treturn this.distanceFrom( this.atEndOfDay() );\r\n\t}\r\n\r\n\tpublic atEndOfDay(): TimeInstant {\r\n\t\treturn this.atTime( { hours: 23, minutes: 59, seconds: 59, milliseconds: 999 } );\r\n\t}\r\n\r\n\tpublic promise(): Promise<void> {\r\n\t\treturn this.timeLeftFromNow().promise();\r\n\t}\r\n\r\n\tpublic cancelablePromise(): ICancelablePromise<void> {\r\n\t\treturn this.timeLeftFromNow().cancelablePromise();\r\n\t}\r\n\r\n\tpublic delay( cb: () => unknown ): void {\r\n\t\treturn this.timeLeftFromNow().delay( cb );\r\n\t}\r\n\r\n\tpublic cancelableDelay( cb: () => unknown ): ICancelable {\r\n\t\treturn this.timeLeftFromNow().cancelableDelay( cb );\r\n\t}\r\n\r\n\tpublic ensureInTheFuture() {\r\n\t\tif ( !this.isInTheFuture() )\r\n\t\t\tthrow new Error( 'Instant is not in the future' );\r\n\t}\r\n\r\n\tpublic ensureInThePast() {\r\n\t\tif ( !this.isInThePast() )\r\n\t\t\tthrow new Error( 'Instant is not in the past' );\r\n\t}\r\n\r\n\tpublic isToday(): boolean {\r\n\t\treturn Math.floor( this.days ) === Math.floor( TimeInstant.now().days );\r\n\t}\r\n\r\n\t/**\r\n\t * Formats this instant using the given pattern. The pattern can contain the following tokens:\r\n\t * \r\n\t * | Token | Description | Example |\r\n\t * |:------|:--------------------------------|:------------------------------|\r\n\t * | D | Weekday, 1 letter | W |\r\n\t * | DD | Weekday, 3 letters | Wed |\r\n\t * | DDD | Weekday, long | Wednesday |\r\n\t * | d | Day of the month, no padding | 3 |\r\n\t * | dd | Day of the month, padded to 2 | 03 |\r\n\t * | M | Month, numeric | 3 |\r\n\t * | MM | Month, 2 digits | 03 |\r\n\t * | MMM | Month, 3 letters | Mar |\r\n\t * | MMMM | Month, long | March |\r\n\t * | y | Year, numeric | 2021 |\r\n\t * | yy | Year, 2 digits | 21 |\r\n\t * | yyyy | Year, numeric | 2021 |\r\n\t * | h | Hours, no padding | 6 |\r\n\t * | hh | Hours, padded to 2 | 06 |\r\n\t * | H | Hours in 24-format, no padding | 18 |\r\n\t * | HH | Hours in 24-format, padded to 2 | 18 |\r\n\t * | m | Minutes, no padding | 7 |\r\n\t * | m | Minutes, padded to 2 | 07 |\r\n\t * | s | Seconds, no padding | 8 |\r\n\t * | ss | Seconds, padded to 2 | 08 |\r\n\t * | S | Milliseconds, no padding | 9 |\r\n\t * | SS | Milliseconds, padded to 2 | 09 |\r\n\t * | SSS | Milliseconds, padded to 3 | 009 |\r\n\t * | G | Era, narrow | A |\r\n\t * | GG | Era, short | AD |\r\n\t * | GGG | Era, long | Anno Domino |\r\n\t * | Z | Time zone, short | GMT+1 |\r\n\t * | ZZ | Time short, long\tC | entral European Standard Time |\r\n\t * | P | Period of the day, narrow | in the morning |\r\n\t * | PP | Period of the day, short | in the morning |\r\n\t * | PPP | Period of the day, long | in the morning |\r\n\t * | a | Meridiem | pm |\r\n\t * @param pattern The pattern to use. Refer to the token table above for details.\r\n\t * @param config An optional locale and timeZone definition to use during the format.\r\n\t * @returns a string, formatted using the given pattern, at the given timeZone with the given locale.\r\n\t */\r\n\tpublic format( pattern: string, config: { locale?: string, timeZone?: string } = {} ) {\r\n\t\treturn format( this.toDate(), pattern, config );\r\n\t}\r\n\r\n\t/**\r\n * @returns this instant, in ISO 8601 format (eg, 2024-11-01T15:49:22.024Z). The format is meant to always be realiable.\r\n */\r\n\tpublic asIso8601(): TIso8601DateUtcString {\r\n\t\treturn this.format( 'yyyy-MM-dd\"T\"HH:mm:ss.SSS\"Z\"', { timeZone: 'UTC' } ) as TIso8601DateUtcString;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns this instant, in a human readable format, containing both the date and the time. The format COULD change in the future, do NOT use this method for consistent outputs.\r\n\t */\r\n\tpublic asHumanTimestamp(): string {\r\n\t\treturn this.format( 'yyyy-MM-dd HH:mm:ss' )\r\n\t}\r\n\r\n\tpublic toUnixTimestamp(): number {\r\n\t\t// Syntatic sugar for this.ms;\r\n\t\treturn this.ms;\r\n\t}\r\n\r\n\tpublic toDate(): Date {\r\n\t\treturn new Date( this.ms );\r\n\t}\r\n\r\n\tpublic toDateUTC(): Date {\r\n\t\treturn new Date( this.ms + new Date().getTimezoneOffset() * 60 * 1000 );\r\n\t}\r\n\r\n\t/**\r\n\t * @returns true if the instant is in the past, false otherwise\r\n\t */\r\n\tpublic isInThePast(): boolean {\r\n\t\treturn this.ms < Date.now();\r\n\t}\r\n\r\n\t/**\r\n\t * @returns true if the instant is in the future, false otherwise\r\n\t */\r\n\tpublic isInTheFuture(): boolean {\r\n\t\treturn this.ms > Date.now();\r\n\t}\r\n\r\n\tpublic isAfter( other: TimeInstant ): boolean {\r\n\t\treturn this.ms > other.ms;\r\n\t}\r\n\r\n\tpublic isBefore( other: TimeInstant ): boolean {\r\n\t\treturn this.ms < other.ms;\r\n\t}\r\n\r\n\tpublic compareTo( other: TimeInstant ): TComparisonResult {\r\n\t\tif ( this.ms === other.ms ) {\r\n\t\t\treturn 0;\r\n\t\t} else if ( this.isBefore( other ) ) {\r\n\t\t\treturn -1;\r\n\t\t} else {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic atTime( parameters: Partial<TTimeInstantCreationParameters & { year: never; month: never; date: never; }> ) {\r\n\t\treturn TimeInstant.fromParameters( parameters, this );\r\n\t}\r\n\r\n\tpublic atDate( parameters: Partial<TTimeInstantCreationParameters & { hours: never; minutes: never; seconds: never; milliseconds: never; }> ) {\r\n\t\treturn TimeInstant.fromParameters( parameters, this );\r\n\t}\r\n\r\n\tpublic at( parameters: Partial<TTimeInstantCreationParameters> ) {\r\n\t\treturn TimeInstant.fromParameters( parameters, this );\r\n\t}\r\n\r\n\tpublic isBetween( start: TimeInstant, end: TimeInstant ) {\r\n\t\treturn this.ms >= start.ms && this.ms <= end.ms;\r\n\t}\r\n\r\n\tpublic static fromDate( date: Date ): TimeInstant {\r\n\t\treturn this.fromUnixTimestamp( date.getTime() );\r\n\t}\r\n\r\n\tpublic static fromUnixTimestamp( unixTimestamp: number ): TimeInstant {\r\n\t\treturn new TimeInstant( unixTimestamp, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic static fromUnixSeconds( unixSeconds: number ): TimeInstant {\r\n\t\treturn new TimeInstant( unixSeconds, TimeUnit.SECONDS );\r\n\t}\r\n\r\n\tpublic static fromParameters( parameters: Partial<TTimeInstantCreationParameters>, referenceDate?: Date | TimeInstant ): TimeInstant {\r\n\t\treturn createTimeInstantFromParameters( parameters, referenceDate );\r\n\t}\r\n\r\n\tpublic static highest( instant1: TimeInstant, instant2: TimeInstant ): TimeInstant {\r\n\t\treturn instant1.isAfter( instant2 ) ? instant1 : instant2;\r\n\t}\r\n\r\n\tpublic static lowest( instant1: TimeInstant, instant2: TimeInstant ): TimeInstant {\r\n\t\treturn instant1.isBefore( instant2 ) ? instant1 : instant2;\r\n\t}\r\n\r\n\tpublic static builder(): TTimeInstantBuilder {\r\n\t\treturn timeInstantBuilder();\r\n\t}\r\n\r\n\tpublic static fromIso8601( str: TIso8601DateString ) {\r\n\t\treturn TimeInstant.fromUnixTimestamp( new Date( str ).getTime() );\r\n\t}\r\n\r\n\tpublic static tryFromIso8601( str: string ) {\r\n\t\tif ( !str.match( /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:.\\d{3}|)(?:Z|[+-]\\d{2}:\\d{2})?$/ ) )\r\n\t\t\tthrow new Error( 'Invalid date given: ' + str );\r\n\t\treturn TimeInstant.fromUnixTimestamp( new Date( str ).getTime() );\r\n\t}\r\n\r\n\tpublic static now(): TimeInstant {\r\n\t\treturn TimeInstant.fromUnixTimestamp( Date.now() );\r\n\t}\r\n\r\n\tpublic static compare( a: TimeInstant, b: TimeInstant ): TComparisonResult {\r\n\t\treturn a.compareTo( b );\r\n\t}\r\n\r\n\tpublic roundedToStartOf( unit: TimeUnit ) {\r\n\t\treturn TimeInstant.fromUnixTimestamp( this.ms - ( this.ms % unit.multiplier ) );\r\n\t}\r\n\r\n\tpublic roundedToEndOf( unit: TimeUnit ) {\r\n\t\treturn TimeInstant.fromUnixTimestamp( this.ms - ( this.ms % unit.multiplier ) + unit.toMs( 1 ) - 1 );\r\n\t}\r\n\r\n\tpublic roundedToNext( unit: TimeUnit, factor = 1 ) {\r\n\t\tconst unitMs = unit.toMs( factor );\r\n\t\tconst timestamp = Math.ceil( this.ms / unitMs ) * unitMs;\r\n\t\treturn TimeInstant.fromUnixTimestamp( timestamp );\r\n\t}\r\n\r\n\tpublic roundedToPrevious( unit: TimeUnit, factor = 1 ) {\r\n\t\tconst unitMs = unit.toMs( factor );\r\n\t\tconst timestamp = Math.floor( this.ms / unitMs ) * unitMs;\r\n\t\treturn TimeInstant.fromUnixTimestamp( timestamp );\r\n\t}\r\n\r\n\tpublic roundedTo( unit: TimeUnit, factor = 1 ) {\r\n\t\tconst unitMs = unit.toMs( factor );\r\n\t\tconst timestamp = Math.round( this.ms / unitMs ) * unitMs;\r\n\t\treturn TimeInstant.fromUnixTimestamp( timestamp );\r\n\t}\r\n\r\n\tpublic get dayOfMonth(): TDayOfMonth {\r\n\t\treturn this.toDate().getDate() as TDayOfMonth;\r\n\t}\r\n\r\n\tpublic get dayOfWeek(): TDayOfWeek {\r\n\t\treturn this.toDate().getDay() + 1 as TDayOfWeek;\r\n\t}\r\n\r\n\tpublic get month(): TMonth {\r\n\t\treturn this.toDate().getMonth() + 1 as TMonth;\r\n\t}\r\n\r\n\tpublic get year(): number {\r\n\t\treturn this.toDate().getFullYear();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the week number represented by this instant, according to the ISO 8601 standard.\r\n\t\t* Please note that the instant and the week number could be of two different years, eg the friday 1st january is actually part of week 52 of the previous year.\r\n\t */\r\n\tpublic get weekNumber(): { weekNumber: TWeekNumber, year: number } {\r\n\t\t/**\r\n\t\t\t* According to the ISO 8601 Standard, week number 1 is defined as the week containing the 4th of january (or, equivalently, the week that contains the first Thursday of the year).\r\n\t\t\t* As such, we basically have to count how many Thursdays there has been in this year.\r\n\t\t\t* Please note that the thursdayOfThisWeek could be in the previous year.\r\n\t\t */\r\n\t\tconst date = this.toDate();\r\n\t\tconst oneDay = 1000 * 60 * 60 * 24;\r\n\t\tconst thursdayOfThisWeek = new Date( date.getFullYear(), date.getMonth(), date.getDate() + 4 - ( date.getDay() || 7 ), 14, 0, 0 );\r\n\t\tconst firstOfJanuary = new Date( thursdayOfThisWeek.getFullYear(), 0, 1, 14, 0, 0 );\r\n\t\tconst dayOfTheYear = Math.round( ( thursdayOfThisWeek.getTime() - firstOfJanuary.getTime() ) / oneDay );\r\n\t\tconst weekNumber = Math.floor( dayOfTheYear / 7 ) + 1;\r\n\t\treturn { weekNumber: weekNumber as TWeekNumber, year: thursdayOfThisWeek.getFullYear() };\r\n\t}\r\n\r\n\t/**\r\n\t * This method is used to provide a better DX when inspecting a TimeInstant object in DevTools.\r\n\t */\r\n\tprotected get _time() {\r\n\t\treturn this.asHumanTimestamp();\r\n\t}\r\n\r\n\tpublic override toString() {\r\n\t\treturn `${this.constructor.name}[${this.asHumanTimestamp()}]`;\r\n\t}\r\n\r\n\tpublic static ZERO: TimeInstant = TimeInstant.fromUnixTimestamp( 0 );\r\n\r\n\tpublic static fromJSON( ms: number ) {\r\n\t\treturn TimeInstant.fromUnixTimestamp( ms );\r\n\t}\r\n\r\n}\r\n\r\nexport function isTimeInstant( x: unknown ): x is TimeInstant {\r\n\treturn x !== null && x !== undefined && x instanceof TimeInstant;\r\n}\r\n\r\nexport default TimeInstant;\r\n", "\r\nexport class TimeUnit {\r\n\r\n\tprivate constructor(\r\n\t\tpublic readonly multiplier: number\r\n\t) { }\r\n\r\n\tpublic toUnit( value: number, unit: TimeUnit ): number {\r\n\t\treturn value * ( this.multiplier / unit.multiplier );\r\n\t}\r\n\r\n\tpublic toMs( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic toSeconds( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.SECONDS );\r\n\t}\r\n\r\n\tpublic toMinutes( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.MINUTES );\r\n\t}\r\n\r\n\tpublic toHours( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.HOURS );\r\n\t}\r\n\r\n\tpublic toDays( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.DAYS );\r\n\t}\r\n\r\n\tpublic static readonly MILLISECONDS = new TimeUnit( 1 );\r\n\tpublic static readonly SECONDS = new TimeUnit( 1000 * TimeUnit.MILLISECONDS.multiplier );\r\n\tpublic static readonly MINUTES = new TimeUnit( 60 * TimeUnit.SECONDS.multiplier );\r\n\tpublic static readonly HOURS = new TimeUnit( 60 * TimeUnit.MINUTES.multiplier );\r\n\tpublic static readonly DAYS = new TimeUnit( 24 * TimeUnit.HOURS.multiplier );\r\n\r\n}\r\n", "import { TimeUnit } from \"./TimeUnit\";\r\n\r\nexport type TTimeInUnits = {\r\n\tmilliseconds: number;\r\n\tseconds: number;\r\n\tminutes: number;\r\n\thours: number;\r\n\tdays: number;\r\n}\r\n\r\nexport default abstract class TimeBase<T> {\r\n\r\n\tprivate readonly _ms: number;\r\n\r\n\tprotected constructor(\r\n\t\tvalue: number,\r\n\t\tunit: TimeUnit\r\n\t) {\r\n\t\tthis._ms = unit.toMs( value );\r\n\t}\r\n\r\n\tprotected abstract create( value: number, unit: TimeUnit ): T;\r\n\r\n\t/**\r\n\t * Total number of milliseconds, rounded down.\r\n\t */\r\n\tpublic get ms(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.MILLISECONDS.multiplier );\r\n\t}\r\n\r\n\t/**\r\n\t * Total number of seconds, rounded down.\r\n\t */\r\n\tpublic get seconds(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.SECONDS.multiplier );\r\n\t}\r\n\r\n\t/**\r\n\t * Total number of minutes, rounded down.\r\n\t */\r\n\tpublic get minutes(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.MINUTES.multiplier );\r\n\t}\r\n\r\n\t/**\r\n\t * Total number of hours, rounded down.\r\n\t */\r\n\tpublic get hours(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.HOURS.multiplier );\r\n\t}\r\n\r\n\t/**\r\n\t * Total number of days, rounded down.\r\n\t */\r\n\tpublic get days(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.DAYS.multiplier );\r\n\t}\r\n\r\n\tpublic addMs( milliseconds: number ): T {\r\n\t\treturn this.addUnits( milliseconds, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic addSeconds( seconds: number ): T {\r\n\t\treturn this.addUnits( seconds, TimeUnit.SECONDS );\r\n\t}\r\n\r\n\tpublic addMinutes( minutes: number ): T {\r\n\t\treturn this.addUnits( minutes, TimeUnit.MINUTES );\r\n\t}\r\n\r\n\tpublic addHours( hours: number ): T {\r\n\t\treturn this.addUnits( hours, TimeUnit.HOURS );\r\n\t}\r\n\r\n\tpublic addDays( days: number ): T {\r\n\t\treturn this.addUnits( days, TimeUnit.DAYS );\r\n\t}\r\n\r\n\tpublic removeDays( days: number ): T {\r\n\t\treturn this.removeUnits( days, TimeUnit.DAYS );\r\n\t}\r\n\r\n\tpublic addUnits( n: number, unit: TimeUnit ): T {\r\n\t\treturn this.create( this._ms + unit.toMs( n ), TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic removeMs( milliseconds: number ): T {\r\n\t\treturn this.addUnits( -milliseconds, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic removeSeconds( seconds: number ): T {\r\n\t\treturn this.addUnits( -seconds, TimeUnit.SECONDS );\r\n\t}\r\n\r\n\tpublic removeMinutes( minutes: number ): T {\r\n\t\treturn this.addUnits( -minutes, TimeUnit.MINUTES );\r\n\t}\r\n\r\n\tpublic removeHours( hours: number ): T {\r\n\t\treturn this.addUnits( -hours, TimeUnit.HOURS );\r\n\t}\r\n\r\n\tpublic removeUnits( n: number, unit: TimeUnit ): T {\r\n\t\treturn this.addUnits( -n, unit );\r\n\t}\r\n\r\n\tpublic getUnit( unit: TimeUnit ): number {\r\n\t\treturn this._ms / unit.multiplier;\r\n\t}\r\n\r\n\tprotected toUnits(): TTimeInUnits {\r\n\t\treturn {\r\n\t\t\tmilliseconds: this.ms % TimeUnit.SECONDS.multiplier,\r\n\t\t\tseconds: Math.floor( this.seconds % 60 ),\r\n\t\t\tminutes: Math.floor( this.minutes % 60 ),\r\n\t\t\thours: Math.floor( this.hours % 24 ),\r\n\t\t\tdays: Math.floor( this.days ),\r\n\t\t};\r\n\t}\r\n\r\n\tprotected static unitsToMs( units: Partial<TTimeInUnits> ): number {\r\n\t\tif ( !units )\r\n\t\t\tthrow new Error( 'Invalid units given' );\r\n\t\tlet ms = 0\r\n\t\tms += ( units.milliseconds ?? 0 ) * TimeUnit.MILLISECONDS.multiplier;\r\n\t\tms += ( units.seconds ?? 0 ) * TimeUnit.SECONDS.multiplier;\r\n\t\tms += ( units.minutes ?? 0 ) * TimeUnit.MINUTES.multiplier;\r\n\t\tms += ( units.hours ?? 0 ) * TimeUnit.HOURS.multiplier;\r\n\t\tms += ( units.days ?? 0 ) * TimeUnit.DAYS.multiplier;\r\n\t\treturn ms;\r\n\t}\r\n\r\n\tpublic toJSON() {\r\n\t\treturn this._ms;\r\n\t}\r\n\r\n}\r\n", "import Deferred, { DeferredCanceledError, ICancelable, ICancelablePromise } from \"../async/Deferred.js\";\r\nimport { TComparisonResult } from \"../sorting/_index.js\";\r\nimport { TIntervalHandle, TMaybe, TTimeoutHandle, ensureNonNegativeNumber, ensurePositiveNumber, pad } from \"../utils/_index.js\";\r\nimport TimeBase, { type TTimeInUnits } from \"./TimeBase\";\r\nimport TimeInstant from \"./TimeInstant\";\r\nimport { TimeUnit } from \"./TimeUnit\";\r\n\r\nexport class TimeDuration extends TimeBase<TimeDuration> {\r\n\r\n\tprotected constructor( value: number, unit: TimeUnit ) {\r\n\t\tsuper( value, unit );\r\n\t\tif ( value < 0 )\r\n\t\t\tthrow new Error( 'Duration cannot be less than 0' );\r\n\t}\r\n\r\n\tprotected create( value: number, unit: TimeUnit ) {\r\n\t\treturn new TimeDuration( value, unit );\r\n\t}\r\n\r\n\tpublic addDuration( duration: TimeDuration ): TimeDuration {\r\n\t\treturn this.addUnits( duration.ms, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic removeDuration( duration: TimeDuration ): TimeDuration {\r\n\t\treturn this.removeUnits( duration.ms, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic override removeUnits( n: number, unit: TimeUnit ): TimeDuration {\r\n\t\tconst nn = Math.min( n, this.getUnit( unit ) ); // Avoid going negative.\r\n\t\treturn super.removeUnits( nn, unit );\r\n\t}\r\n\r\n\tpublic multiplyBy( times: number ): TimeDuration {\r\n\t\tensureNonNegativeNumber( times, \"times\" );\r\n\t\treturn TimeDuration.ms( this.ms * times );\r\n\t}\r\n\r\n\tpublic divideBy( times: number ): TimeDuration {\r\n\t\tensurePositiveNumber( times, \"times\" );\r\n\t\treturn TimeDuration.ms( this.ms / times );\r\n\t}\r\n\r\n\t/**\r\n\t\t* Returns the current duration in a human readable format, prioritizing the most significant unit of time and excluding the rest.\r\n\t\t* @todo[2023-06] Should allow more customization options\r\n\t\t* @todo[2023-06] By default should show the secondary unit only when actually needed (eg, 1h 20m & 3h, instead of 1h 20m & 3h 28m)\r\n\t\t* @todo[2023-06] Should not allow negative durations, as this is a duration and not an instant.\r\n\t\t* @returns the duration, with only the most significant units displayed as a human readable string, eg: 1d 20h, 10m 30s.\r\n\t*/\r\n\tpublic get formatted(): string {\r\n\t\tconst format = ( x: number, u1: string, y: number, u2: string ): string => `${x}${u1} ${pad( y.toString(), 2, '0' )}${u2}`;\r\n\t\tconst units = this.toUnits();\r\n\r\n\t\tif ( units.days >= 1 ) return format( units.days, 'd', units.hours, 'h' );\r\n\t\telse if ( units.hours >= 1 )\r\n\t\t\treturn format( units.hours, 'h', units.minutes, 'm' );\r\n\t\telse if ( units.minutes >= 1 )\r\n\t\t\treturn format( units.minutes, 'm', units.seconds, 's' );\r\n\t\telse if ( units.seconds >= 0 )\r\n\t\t\treturn units.seconds.toString() + 's';\r\n\t\telse if ( units.seconds > -60 )\r\n\t\t\treturn 'A few moments ago';\r\n\t\telse\r\n\t\t\treturn 'Some time ago';\r\n\t}\r\n\r\n\tpublic interval( cb: () => unknown ): TIntervalHandle {\r\n\t\treturn setInterval( cb, this.ms );\r\n\t}\r\n\r\n\tpublic timeout( cb: () => unknown ): TTimeoutHandle {\r\n\t\treturn setTimeout( cb, this.ms );\r\n\t}\r\n\r\n\tpublic cancelablePromise(): ICancelablePromise<void> {\r\n\t\tconst deferred = new Deferred<void>;\r\n\t\tif ( this.ms > 0 ) {\r\n\t\t\tthis.timeout( () => deferred.resolve() );\r\n\t\t} else {\r\n\t\t\tdeferred.resolve();\r\n\t\t}\r\n\t\treturn deferred.asCancelablePromise();\r\n\t}\r\n\r\n\tpublic promise(): Promise<void> {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\treturn Promise.resolve();\r\n\r\n\t\tconst deferred = new Deferred<void>;\r\n\t\tthis.timeout( () => deferred.resolve() );\r\n\t\treturn deferred.asPromise();\r\n\t}\r\n\r\n\tpublic delay( cb: () => unknown ): void {\r\n\t\tvoid this.promise().then( () => cb() );\r\n\t}\r\n\r\n\tpublic cancelableDelay( cb: () => unknown ): ICancelable {\r\n\t\tconst deferred = this.cancelablePromise();\r\n\t\tvoid deferred.then( () => {\r\n\t\t\tcb();\r\n\t\t}, err => {\r\n\t\t\tif ( err instanceof DeferredCanceledError )\r\n\t\t\t\treturn; // Do nothing on cancelation\r\n\t\t\tthrow err;\r\n\t\t} );\r\n\t\treturn { cancel: () => deferred.cancel() };\r\n\t}\r\n\r\n\tpublic debounce<T>( fn: ( t: T ) => void ) {\r\n\t\tlet handle: TMaybe<TTimeoutHandle> = null;\r\n\t\treturn ( t: T ) => {\r\n\t\t\tif ( handle )\r\n\t\t\t\tclearTimeout( handle );\r\n\t\t\thandle = this.timeout( () => {\r\n\t\t\t\thandle = null;\r\n\t\t\t\tfn( t );\r\n\t\t\t} );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic toDigitalClock(): string {\r\n\t\tconst units = this.toUnits();\r\n\t\t// data.hours += data.days * 24; // roll over days as hours.\r\n\t\treturn pad( units.hours.toString(), 2, '0' ) + ':' + pad( units.minutes.toString(), 2, '0' ) + ':' + pad( units.seconds.toString(), 2, '0' );\r\n\t}\r\n\r\n\tpublic get asSeconds(): string {\r\n\t\tif ( this.ms < 0 )\r\n\t\t\treturn \"0\";\r\n\t\tif ( this.ms < 1000 )\r\n\t\t\treturn ( this.ms / 1000 ).toFixed( 1 );\r\n\t\treturn Math.floor( this.seconds ).toString();\r\n\t}\r\n\r\n\tpublic fromNow(): TimeInstant {\r\n\t\treturn TimeInstant.now().addDuration( this );\r\n\t}\r\n\r\n\tpublic differenceFrom( other: TimeDuration ): TimeDuration {\r\n\t\treturn new TimeDuration( Math.abs( this.ms - other.ms ), TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic isGreaterThan( other: TimeDuration ): boolean {\r\n\t\treturn this.ms > other.ms;\r\n\t}\r\n\r\n\tpublic isLessThan( other: TimeDuration ): boolean {\r\n\t\treturn this.ms < other.ms;\r\n\t}\r\n\r\n\tpublic compareTo( other: TimeDuration ): TComparisonResult {\r\n\t\tif ( this.ms === other.ms ) {\r\n\t\t\treturn 0;\r\n\t\t} else if ( this.isLessThan( other ) ) {\r\n\t\t\treturn -1;\r\n\t\t} else {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic atLeast( other: TimeDuration ): TimeDuration {\r\n\t\tif ( !this.isLessThan( other ) ) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\treturn other;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic atMost( other: TimeDuration ): TimeDuration {\r\n\t\tif ( !this.isGreaterThan( other ) ) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\treturn other;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic isEmpty(): boolean {\r\n\t\treturn this.ms <= 0;\r\n\t}\r\n\r\n\tpublic isNotEmpty(): boolean {\r\n\t\treturn this.ms > 0;\r\n\t}\r\n\r\n\tpublic override toUnits() {\r\n\t\treturn super.toUnits();\r\n\t}\r\n\r\n\t/**\r\n\t\t* This method is used to provide a better DX when inspecting a TimeInstant object in DevTools.\r\n\t\t*/\r\n\tprotected get _duration() {\r\n\t\treturn this.formatted;\r\n\t}\r\n\r\n\tpublic override toString() {\r\n\t\treturn `${this.constructor.name}[${this.formatted}]`;\r\n\t}\r\n\r\n\tpublic static parseHumanTime( humanTime: string ): TimeDuration {\r\n\t\tconst match = humanTime.trim().match( /^(?:([0-9]+)d|)\\s*(?:([0-9]+)h|)\\s*(?:([0-9]+)m|)\\s*(?:([0-9]+)s|)$/ );\r\n\t\tif ( match ) {\r\n\t\t\tconst [ _, days, hours, minutes, seconds ] = match;\r\n\t\t\treturn new TimeDuration( TimeBase.unitsToMs( { days: Number( days ?? 0 ), hours: Number( hours ?? 0 ), minutes: Number( minutes ?? 0 ), seconds: Number( seconds ?? 0 ) } ), TimeUnit.MILLISECONDS );\r\n\t\t}\r\n\t\tthrow new Error( 'Failed to parse time: ' + humanTime );\r\n\t}\r\n\r\n\tpublic static compare( a: TimeDuration, b: TimeDuration ): TComparisonResult {\r\n\t\treturn a.compareTo( b );\r\n\t}\r\n\r\n\tpublic static ms = ( value: number ) => new TimeDuration( value, TimeUnit.MILLISECONDS );\r\n\tpublic static seconds = ( value: number ) => new TimeDuration( value, TimeUnit.SECONDS );\r\n\tpublic static minutes = ( value: number ) => new TimeDuration( value, TimeUnit.MINUTES );\r\n\tpublic static hours = ( value: number ) => new TimeDuration( value, TimeUnit.HOURS );\r\n\tpublic static days = ( value: number ) => new TimeDuration( value, TimeUnit.DAYS );\r\n\r\n\tpublic static shamefulUnref = ( ms: TAllowedTimeDuration ): number => {\r\n\t\tif ( ms instanceof TimeDuration ) {\r\n\t\t\treturn ms.ms;\r\n\t\t}\r\n\t\treturn ms;\r\n\t}\r\n\tpublic static shamefulRef = ( ms: TAllowedTimeDuration ): TimeDuration => {\r\n\t\tif ( ms instanceof TimeDuration ) {\r\n\t\t\treturn ms;\r\n\t\t}\r\n\t\tif ( ms < 0 ) {\r\n\t\t\tms = 0;\r\n\t\t}\r\n\t\treturn TimeDuration.ms( ms );\r\n\t}\r\n\r\n\tpublic static unref = ( ms: TValidTimeDuration ): TPredefinedTimeDuration => {\r\n\t\treturn TimeDuration.shamefulUnref( ms ) as TPredefinedTimeDuration;\r\n\t}\r\n\r\n\tpublic static ref = ( ms: TValidTimeDuration ): TimeDuration => {\r\n\t\treturn TimeDuration.shamefulRef( ms );\r\n\t}\r\n\r\n\tpublic static fromMs( ms: number ) {\r\n\t\treturn new TimeDuration( ms, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic static distanceFromNow( instant: TimeInstant ): TimeDuration {\r\n\t\treturn TimeDuration.distance( TimeInstant.now(), instant );\r\n\t}\r\n\r\n\tpublic static distance( instant1: TimeInstant, instant2: TimeInstant ): TimeDuration {\r\n\t\treturn instant1.distanceFrom( instant2 );\r\n\t}\r\n\r\n\tpublic static greatest( duration1: TimeDuration, duration2: TimeDuration ): TimeDuration {\r\n\t\treturn duration1.isGreaterThan( duration2 ) ? duration1 : duration2;\r\n\t}\r\n\r\n\tpublic static lowest( duration1: TimeDuration, duration2: TimeDuration ): TimeDuration {\r\n\t\treturn duration1.isLessThan( duration2 ) ? duration1 : duration2;\r\n\t}\r\n\r\n\tpublic static ZERO = new TimeDuration( 0, TimeUnit.MILLISECONDS );\r\n\r\n\tpublic static fromJSON( ms: number ) {\r\n\t\treturn TimeDuration.ms( ms );\r\n\t}\r\n\r\n\tpublic static fromUnits( parameters: Partial<TTimeInUnits> ): TimeDuration {\r\n\t\treturn TimeDuration.ms( TimeBase.unitsToMs( parameters ) );\r\n\t}\r\n\r\n}\r\n\r\nexport type TPredefinedTimeDuration = 0 | 50 | 100 | 150 | 200 | 250 | 300 | 500 | 1000 | 1500 | 2000 | 2500 | 5000;\r\nexport type TValidTimeDuration = TimeDuration | TPredefinedTimeDuration;\r\ntype TAllowedTimeDuration = TValidTimeDuration | number; // eslint-disable-line @typescript-eslint/no-redundant-type-constituents\r\n\r\nexport function isAllowedTimeDuration( t: unknown ): t is TAllowedTimeDuration {\r\n\treturn ( typeof t === \"number\" && t > 0 ) || t instanceof TimeDuration;\r\n}\r\n\r\nexport default TimeDuration;\r\n", "\r\nexport const monthNames = {\r\n\tjanuary: 1,\r\n\tfebruary: 2,\r\n\tmarch: 3,\r\n\tapril: 4,\r\n\tmay: 5,\r\n\tjune: 6,\r\n\tjuly: 7,\r\n\taugust: 8,\r\n\tseptember: 9,\r\n\toctober: 10,\r\n\tnovember: 11,\r\n\tdecember: 12,\r\n} as const satisfies Record<string, number>;\r\n", "\r\nimport { TFunction } from \"../utils/functions.js\";\r\nimport { ensureDefined } from \"../utils/nulls.js\";\r\nimport { monthNames } from \"./constants.js\";\r\nimport { TimeInstant, isTimeInstant } from \"./TimeInstant.js\";\r\nimport { TDayOfMonth, THourOfDay, TMillisecondOfSecond, TMinuteOfHour, TMonth, TSecondOfMinute, TUpToTwoDigits, type TMonthName } from \"./types.js\";\r\n\r\ntype TRelativeSignum = '+' | '-';\r\ntype TRelativeNumber = `${TRelativeSignum}${TUpToTwoDigits}`;\r\nconst isRelativeNumber = ( x: string ): x is TRelativeNumber => x !== undefined && x.length > 0 && ( x[ 0 ] === '+' || x[ 0 ] === '-' );\r\n\r\nexport type TTimeInstantCreationParameters = {\r\n\tyear: number | { absolute: number } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tmonth: TMonth | { absolute: TMonth } | TMonthName | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tdate: TDayOfMonth | { absolute: TDayOfMonth } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\thours: THourOfDay | { absolute: THourOfDay } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tminutes: TMinuteOfHour | { absolute: TMinuteOfHour } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tseconds: TSecondOfMinute | { absolute: TSecondOfMinute } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tmilliseconds: TMillisecondOfSecond | { absolute: TMillisecondOfSecond } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n}\r\n\r\nconst defaultTimeInstantCreationParameters: TTimeInstantCreationParameters = {\r\n\tyear: { relative: 0, relativeTo: 'now' },\r\n\tmonth: { relative: 0, relativeTo: 'now' },\r\n\tdate: { relative: 0, relativeTo: 'now' },\r\n\thours: { relative: 0, relativeTo: 'now' },\r\n\tminutes: { relative: 0, relativeTo: 'now' },\r\n\tseconds: { relative: 0, relativeTo: 'now' },\r\n\tmilliseconds: { relative: 0, relativeTo: 'now' },\r\n};\r\nconst timeInstantCreationRelativeAliases = {\r\n\tcurrent: 0,\r\n\tlast: -1,\r\n\tnext: +1,\r\n} as const satisfies Record<string, number>;\r\n\r\ntype TAllowedTimeInstantCreationAlias = keyof typeof timeInstantCreationRelativeAliases;\r\ntype TAllowedTimeInstantCreationParameter = { absolute: number } | { relative: number, relativeTo?: TimeInstant | 'now' } | TAllowedTimeInstantCreationAlias | TRelativeNumber | TMonthName | number | undefined;\r\nconst timeInstantResolveValue = ( getFromDate: TFunction<Date, number>, referenceDate: Date, x: TAllowedTimeInstantCreationParameter ): number => {\r\n\tif ( x === undefined ) {\r\n\t\treturn getFromDate( referenceDate );\r\n\t} else if ( typeof x === 'number' ) {\r\n\t\treturn x;\r\n\t} else if ( typeof x === 'string' ) {\r\n\t\tif ( isRelativeNumber( x ) ) {\r\n\t\t\treturn getFromDate( referenceDate ) + parseInt( x );\r\n\t\t} else if ( x in timeInstantCreationRelativeAliases ) {\r\n\t\t\treturn getFromDate( referenceDate ) + timeInstantCreationRelativeAliases[ x ];\r\n\t\t} else if ( x in monthNames ) {\r\n\t\t\treturn monthNames[x];\r\n\t\t} else {\r\n\t\t\tthrow new Error( 'Uparseable string detected: ' + x );\r\n\t\t}\r\n\t} else if ( \"relative\" in x ) {\r\n\t\tconst { relative, relativeTo } = x;\r\n\t\tif ( relativeTo === undefined || relativeTo === 'now' ) {\r\n\t\t\treturn getFromDate( referenceDate ) + relative;\r\n\t\t} else {\r\n\t\t\treturn getFromDate( relativeTo.toDate() ) + relative;\r\n\t\t}\r\n\t} else if ( \"absolute\" in x ) {\r\n\t\treturn x.absolute\r\n\t} else {\r\n\t\tthrow new Error( 'Uparseable value detected: ' + x );\r\n\t}\r\n};\r\nconst getFromDate = {\r\n\tyear: d => d.getFullYear(),\r\n\tmonth: d => d.getMonth(),\r\n\tdate: d => d.getDate(),\r\n\thours: d => d.getHours(),\r\n\tminutes: d => d.getMinutes(),\r\n\tseconds: d => d.getSeconds(),\r\n\tmilliseconds: d => d.getMilliseconds(),\r\n} as const satisfies Record<string, TFunction<Date, number>>;\r\nconst toReferenceDate = ( x: Date | TimeInstant ): Date => { \r\n\tensureDefined( x );\r\n\tif ( isTimeInstant( x ) ) return x.toDate();\r\n\treturn x;\r\n}\r\n\r\nexport function createTimeInstantFromParameters( aParameters: Partial<TTimeInstantCreationParameters>, aReferenceDate: TimeInstant | Date = TimeInstant.now() ): TimeInstant {\r\n\tconst { year, month, date, hours, minutes, seconds, milliseconds }: TTimeInstantCreationParameters = { ...defaultTimeInstantCreationParameters, ...aParameters };\r\n\tconst referenceDate = toReferenceDate( aReferenceDate );\r\n\tconst timestamp = Date.UTC(\r\n\t\ttimeInstantResolveValue( getFromDate.year, referenceDate, year ),\r\n\t\ttimeInstantResolveValue( getFromDate.month, referenceDate, month ),\r\n\t\ttimeInstantResolveValue( getFromDate.date, referenceDate, date ),\r\n\t\ttimeInstantResolveValue( getFromDate.hours, referenceDate, hours ),\r\n\t\ttimeInstantResolveValue( getFromDate.minutes, referenceDate, minutes ),\r\n\t\ttimeInstantResolveValue( getFromDate.seconds, referenceDate, seconds ),\r\n\t\ttimeInstantResolveValue( getFromDate.milliseconds, referenceDate, milliseconds )\r\n\t);\r\n\tif ( isNaN( timestamp ) )\r\n\t\tthrow new Error( `Unparseable date: ${JSON.stringify( aParameters )} }` );\r\n\treturn TimeInstant.fromUnixTimestamp( timestamp );\r\n}\r\nexport function timeInstantBuilder() {\r\n\tlet referenceDate = TimeInstant.now().toDate();\r\n\tconst value: TTimeInstantCreationParameters = { ...defaultTimeInstantCreationParameters };\r\n\tconst ret = {\r\n\t\tyear: ( x: TTimeInstantCreationParameters[ \"year\" ] ) => { value.year = x; return ret; },\r\n\t\tmonth: ( x: TTimeInstantCreationParameters[ \"month\" ] ) => { value.month = x; return ret; },\r\n\t\tdate: ( x: TTimeInstantCreationParameters[ \"date\" ] ) => { value.date = x; return ret; },\r\n\t\thours: ( x: TTimeInstantCreationParameters[ \"hours\" ] ) => { value.hours = x; return ret; },\r\n\t\tminutes: ( x: TTimeInstantCreationParameters[ \"minutes\" ] ) => { value.minutes = x; return ret; },\r\n\t\tseconds: ( x: TTimeInstantCreationParameters[ \"seconds\" ] ) => { value.seconds = x; return ret; },\r\n\t\tmilliseconds: ( x: TTimeInstantCreationParameters[ \"milliseconds\" ] ) => { value.milliseconds = x; return ret; },\r\n\t\tvalues: ( x: Partial<TTimeInstantCreationParameters> ) => { Object.keys( value ).forEach( key => value[key] = x[key] ?? value[key] ); return ret; },\r\n\t\trelativeTo: ( x: TimeInstant | Date ) => { referenceDate = toReferenceDate( x ); return ret; },\r\n\t\tbuild: () => createTimeInstantFromParameters( value, referenceDate ),\r\n\t};\r\n\treturn ret;\r\n}\r\nexport type TTimeInstantBuilder = ReturnType<typeof timeInstantBuilder>;\r\n", "import TimeInstant from \"./time/TimeInstant\";\r\nimport { noop, padRight } from \"./utils/_index.js\";\r\n\r\nconst LEVELS = [ \"trace\", \"log\", \"debug\", \"info\", \"warn\", \"error\" ] as const;\r\ntype TLogLevel = keyof Console & typeof LEVELS[ number ]\r\n\r\nconst timestamp = () => TimeInstant.now().format( 'HH:mm:ss' );\r\n\r\nexport type TLoggerOpts = {\r\n\tconsole: Console;\r\n\tenabled: boolean;\r\n\tminLevel: Uppercase<TLogLevel>;\r\n}\r\n\r\nexport class Logger {\r\n\r\n\tprivate enabled: boolean = true;\r\n\tprivate console: Console;\r\n\tprivate minLevel: number;\r\n\r\n\tpublic constructor(\r\n\t\tpublic readonly name: string,\r\n\t\targs?: Partial<TLoggerOpts>\r\n\t) {\r\n\t\tthis.console = args?.console ?? globalThis.console;\r\n\t\tthis.enabled = args?.enabled ?? true;\r\n\t\tthis.minLevel = LEVELS.indexOf( ( args?.minLevel ?? \"DEBUG\" ).toLowerCase() as TLogLevel );\r\n\t}\r\n\r\n\tpublic get trace() { return this.logWrap( 'trace' ); }\r\n\tpublic get log() { return this.logWrap( 'log' ); }\r\n\tpublic get debug() { return this.logWrap( 'debug' ); }\r\n\tpublic get info() { return this.logWrap( 'info' ); }\r\n\tpublic get warn() { return this.logWrap( 'warn' ); }\r\n\tpublic get error() { return this.logWrap( 'error' ); }\r\n\r\n\tprivate logWrap( methodName: TLogLevel ) {\r\n\t\tif ( !this.enabled || !this.console || LEVELS.indexOf( methodName ) < this.minLevel )\r\n\t\t\treturn noop;\r\n\t\treturn this.console[ methodName ].bind( this.console, timestamp(), padRight( methodName.toUpperCase(), 5, ' ' ), this.name );\r\n\t}\r\n\r\n}\r\n\r\nexport default Logger;\r\n", "import type TimeDuration from \"../time/TimeDuration.js\";\r\nimport type TimeInstant from \"../time/TimeInstant.js\";\r\nimport { TBiFunction, TConditionalParameterOptions, TFunction, TKeysOfType, TPositiveNumber, TReadableArray, isDefined, isNullOrUndefined } from \"../utils/_index.js\";\r\nimport { identity } from \"../utils/functions/constant.js\";\r\nimport { TComparisonDirection, TComparisonFunction, TComparisonResult, TStrictComparisonResult } from \"./types.js\";\r\n\r\ntype TCompareValuesOptions = {\r\n\tnullsFirst: boolean;\r\n};\r\ntype TCompareFunctionOptions = {\r\n\tnullsFirst: boolean;\r\n\tdirection: TComparisonDirection;\r\n};\r\n\r\nconst defaultCompareValuesOptions = {\r\n\tnullsFirst: false,\r\n} as const satisfies Partial<TCompareValuesOptions>;\r\nconst defaultCompareFunctionOptions: TCompareFunctionOptions = {\r\n\t...defaultCompareValuesOptions,\r\n\tdirection: 'ASC',\r\n} as const satisfies Partial<TCompareFunctionOptions>;\r\n\r\nconst naturalOrderComparison = <V>( a: V, b: V ) => a < b ? -1 : 1;\r\n\r\nfunction compareValues<V>( a: V, b: V, cmp: TBiFunction<V, V, TComparisonResult>, { nullsFirst }: TCompareValuesOptions ): TComparisonResult {\r\n\tif ( a === b )\r\n\t\treturn 0;\r\n\r\n\tconst nullA = isNullOrUndefined( a );\r\n\tconst nullB = isNullOrUndefined( b );\r\n\tif ( nullA && nullB )\r\n\t\treturn 0;\r\n\tif ( nullA !== nullB )\r\n\t\treturn ( nullA === nullsFirst ) ? -1 : 1;\r\n\r\n\t// A & B are defined and are different.\r\n\treturn cmp( a, b );\r\n}\r\n\r\nfunction compareFunction<T, V>( fn: TFunction<T, V>, cmp: TBiFunction<V, V, TStrictComparisonResult>, { nullsFirst, direction }: TCompareFunctionOptions ): TComparisonFunction<T> {\r\n\treturn ( a: T, b: T ) => applyDirection( compareValues<V>( fn( a ), fn( b ), cmp, { nullsFirst } ), direction );\r\n}\r\n\r\nfunction applyDirection( res: TComparisonResult, direction: TComparisonDirection ): TComparisonResult {\r\n\treturn res * ( direction === 'ASC' ? 1 : -1 ) as TComparisonResult\r\n}\r\n\r\nfunction combine<T, R, S>( f: TFunction<T, R>, g: TFunction<R, S> ): TFunction<T, S> {\r\n\treturn ( t: T ) => g( f( t ) );\r\n}\r\n\r\nfunction reverse<T>( fn: TComparisonFunction<T> ): TComparisonFunction<T> {\r\n\treturn ( a: T, b: T ) => fn( a, b ) * -1 as TComparisonResult;\r\n}\r\n\r\nconst chain = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, cmpFn: TComparisonFunction<T> ): TSorter<T> => {\r\n\treturn doCreateWithFunctions( [ ...fns, cmpFn ] );\r\n}\r\n\r\nconst transformAndChain = <T, R>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, cmpFn: TComparisonFunction<R> ): TSorter<T> => {\r\n\tconst fn: TComparisonFunction<T> = ( a: T, b: T ) => cmpFn( transform( a ), transform( b ) );\r\n\treturn chain( fns, fn );\r\n}\r\nconst compareStrings = <T, R extends string>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TStringComparisonOptions, typeof defaultStringComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction, ignoreCase } = { ...defaultStringComparisonOptions, ...options };\r\n\tif ( ignoreCase )\r\n\t\ttransform = combine<T, R, R>( transform, t => t.toLowerCase() as R );\r\n\treturn chain( fns, compareFunction( transform, naturalOrderComparison, { nullsFirst, direction } ) );\r\n};\r\nconst compareNumbers = <T, R extends number>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TNumberComparisonOptions, typeof defaultNumberComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction } = { ...defaultNumberComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, naturalOrderComparison, { nullsFirst, direction } ) );\r\n};\r\nconst compareDates = <T, R extends Date>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TDateComparisonOptions, typeof defaultDateComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction } = { ...defaultDateComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, naturalOrderComparison, { nullsFirst, direction } ) );\r\n};\r\nconst compareTimeInstants = <T, R extends TimeInstant>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TTimeInstantComparisonOptions, typeof defaultTimeInstantComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction } = { ...defaultTimeInstantComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, ( a, b ) => a.isBefore( b ) ? -1 : 1, { nullsFirst, direction } ) );\r\n};\r\nconst compareTimeDurations = <T, R extends TimeDuration>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TTimeDurationComparisonOptions, typeof defaultTimeDurationComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction } = { ...defaultTimeDurationComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, ( a, b ) => a.isLessThan( b ) ? -1 : 1, { nullsFirst, direction } ) );\r\n};\r\nconst compareBooleans = <T, R extends boolean>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TBooleanComparisonOptions, typeof defaultBooleanComparisonOptions> ) => {\r\n\tconst { nullsFirst, truesFirst } = { ...defaultBooleanComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, naturalOrderComparison, { nullsFirst, direction: truesFirst ? 'DESC' : 'ASC' } ) );\r\n};\r\nconst prioritizeSet = <T, R>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, set: ReadonlyArray<R>, reversed = false ) => {\r\n\treturn compareBooleans( fns, ( t: T ) => {\r\n\t\tconst r = transform( t );\r\n\t\treturn isDefined( r ) && set.includes( r );\r\n\t}, { truesFirst: !reversed, nullsFirst: false } );\r\n}\r\nconst prioritizeArray = <T, R>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, arr: ReadonlyArray<R>, reversed = false ) => {\r\n\treturn compareNumbers( fns, ( t: T ) => {\r\n\t\tconst r = transform( t );\r\n\t\tif ( !isDefined( r ) ) return Number.MAX_VALUE;\r\n\t\tconst indexOf = arr.indexOf( r );\r\n\t\treturn indexOf === -1 ? Number.MAX_VALUE : indexOf;\r\n\t}, { direction: reversed ? 'DESC' : 'ASC', nullsFirst: false } );\r\n}\r\n\r\nconst next = <T, R>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R> ): TSorterStepFull<R, TSorter<T>> => {\r\n\tconst using = <X>( transformToX: TFunction<R, X> ) => {\r\n\t\treturn next( fns, combine( transform, transformToX ) ) satisfies TSorterStepFull<X, TSorter<T>> as any;\r\n\t};\r\n\tconst retAsChainable = {\r\n\t\tchain( chain: TComparable<R> ) {\r\n\t\t\treturn transformAndChain( fns, transform, chain.compare );\r\n\t\t},\r\n\t\tchainFunction( fn: TComparisonFunction<R> ) {\r\n\t\t\treturn transformAndChain( fns, transform, fn );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForChainables<R, TSorter<T>>;\r\n\tconst retAsUsing = {\r\n\t\tusing,\r\n\t} as const satisfies TSorterStepForUsing<R, TSorter<T>>;\r\n\tconst retAsPrioritizable = {\r\n\t\tprioritizing( arr: Array<R>, _options: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> = {} ) {\r\n\t\t\treturn prioritizeArray( fns, transform, arr );\r\n\t\t},\r\n\t\tdeprioritizing( arr: Array<R>, _options: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> = {} ) {\r\n\t\t\treturn prioritizeArray( fns, transform, arr, true );\r\n\t\t},\r\n\t\tprioritizingWithEqualWeight( arr: Array<R>, _options: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> = {} ) {\r\n\t\t\treturn prioritizeSet( fns, transform, arr );\r\n\t\t},\r\n\t\tdeprioritizingWithEqualWeight( arr: Array<R>, _options: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> = {} ) {\r\n\t\t\treturn prioritizeSet( fns, transform, arr, true );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForPrioritizable<any, TSorter<T>>;\r\n\tconst retForRecords = {\r\n\t\t...retAsUsing,\r\n\t\tusingStrings: field => using( t => t[ field ] ),\r\n\t\tusingNumbers: field => using( t => t[ field ] ),\r\n\t\tusingBooleans: field => using( t => t[ field ] ),\r\n\t\tusingDates: field => using( t => t[ field ] ),\r\n\t\tusingTimeInstant: field => using( t => t[ field ] ),\r\n\t\tusingTimeDuration: field => using( t => t[ field ] ),\r\n\t} as const satisfies TSorterStepForRecords<R, TSorter<T>>;\r\n\tconst retForNumbers = {\r\n\t\t...retAsUsing,\r\n\t\tinAscendingOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareNumbers( fns, transform as TFunction<T, number>, { direction: 'ASC', ...opts } );\r\n\t\t},\r\n\t\tinDescendingOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareNumbers( fns, transform as TFunction<T, number>, { direction: 'DESC', ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForNumbers<R, TSorter<T>>;\r\n\tconst retForStringsV1 = {\r\n\t\t...retAsUsing,\r\n\t\tinLexographicalOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'ASC', ignoreCase: false, ...opts } );\r\n\t\t},\r\n\t\tinLexographicalOrderIgnoringCase( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'ASC', ignoreCase: true, ...opts } );\r\n\t\t},\r\n\t\tinReverseLexographicalOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'DESC', ignoreCase: false, ...opts } );\r\n\t\t},\r\n\t\tinReverseLexographicalOrderIgnoringCase( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'DESC', ignoreCase: true, ...opts } );\r\n\t\t},\r\n\t} as const;\r\n\tconst retForStrings = {\r\n\t\t...retAsUsing,\r\n\t\t...retForStringsV1,\r\n\t\tinLexicographicalOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'ASC', ignoreCase: false, ...opts } );\r\n\t\t},\r\n\t\tinLexicographicalOrderIgnoringCase( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'ASC', ignoreCase: true, ...opts } );\r\n\t\t},\r\n\t\tinReverseLexicographicalOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'DESC', ignoreCase: false, ...opts } );\r\n\t\t},\r\n\t\tinReverseLexicographicalOrderIgnoringCase( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'DESC', ignoreCase: true, ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForStrings<R, TSorter<T>>;\r\n\tconst retForBooleans = {\r\n\t\t...retAsUsing,\r\n\t\ttruesFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareBooleans( fns, transform as TFunction<T, boolean>, { truesFirst: true, ...opts } );\r\n\t\t},\r\n\t\tfalsesFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareBooleans( fns, transform as TFunction<T, boolean>, { truesFirst: false, ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForBooleans<R, TSorter<T>>;\r\n\tconst retForDates = {\r\n\t\t...retAsUsing,\r\n\t\toldestDateFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareDates( fns, transform as TFunction<T, Date>, { direction: 'ASC', ...opts } );\r\n\t\t},\r\n\t\tnewestDateFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareDates( fns, transform as TFunction<T, Date>, { direction: 'DESC', ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForDates<R, TSorter<T>>;\r\n\tconst retForInstants = {\r\n\t\t...retAsUsing,\r\n\t\toldestFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareTimeInstants( fns, transform as TFunction<T, TimeInstant>, { direction: 'ASC', ...opts } );\r\n\t\t},\r\n\t\tnewestFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareTimeInstants( fns, transform as TFunction<T, TimeInstant>, { direction: 'DESC', ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForTimeInstant<R, TSorter<T>>;\r\n\tconst retForDurations = {\r\n\t\t...retAsUsing,\r\n\t\tlongestFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareTimeDurations( fns, transform as TFunction<T, TimeDuration>, { direction: 'DESC', ...opts } );\r\n\t\t},\r\n\t\tshortestFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareTimeDurations( fns, transform as TFunction<T, TimeDuration>, { direction: 'ASC', ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForTimeDuration<R, TSorter<T>>;\r\n\treturn {\r\n\t\t...retAsPrioritizable,\r\n\t\t...retAsChainable,\r\n\t\t...retForRecords,\r\n\t\t...retForNumbers,\r\n\t\t...retForStrings,\r\n\t\t...retForBooleans,\r\n\t\t...retForDates,\r\n\t\t...retForInstants,\r\n\t\t...retForDurations,\r\n\t} as const satisfies TSorterStepFull<R, TSorter<T>>;\r\n};\r\n\r\nconst createComparisonFunction = <T>( fns: ReadonlyArray<TComparisonFunction<T>> ): TComparisonFunction<T> => {\r\n\treturn ( a: T, b: T ) => {\r\n\t\tlet cmp: TComparisonResult = 0, i: number = 0;\r\n\t\twhile ( i < fns.length && cmp === 0 ) {\r\n\t\t\tcmp = fns[ i++ ]( a, b );\r\n\t\t}\r\n\t\treturn cmp;\r\n\t}\r\n};\r\n\r\nconst compare = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, a: T, b: T ): TComparisonResult => {\r\n\treturn createComparisonFunction( fns )( a, b );\r\n};\r\n\r\nconst sort = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T> ): Array<T> => {\r\n\tconst comparisonFn = createComparisonFunction( fns );\r\n\treturn [ ...arr ].sort( comparisonFn );\r\n};\r\n\r\nconst top = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T>, n: TPositiveNumber ): Array<T> => {\r\n\treturn sort( fns, arr ).slice( 0, Math.max( 0, n ) );\r\n};\r\n\r\nconst bottom = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T>, n: TPositiveNumber ): Array<T> => {\r\n\treturn sort( fns, arr ).slice( -Math.max( 0, n ) ).reverse();\r\n};\r\n\r\nconst first = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T> ): T | null => {\r\n\treturn arr.length ? top( fns, arr, 1 )[ 0 ] : null;\r\n};\r\n\r\nconst last = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T> ): T | null => {\r\n\treturn arr.length ? bottom( fns, arr, 1 )[ 0 ] : null;\r\n};\r\n\r\nfunction doCreateEmpty<T>(): TSorterStarter<T> {\r\n\t// If we have no comparison functions, return an object that only has chain methods.\r\n\tconst base = next( [], x => x ) satisfies TSorterStepFull<T, TSorter<T>>;\r\n\tconst ret = {\r\n\t\t...base,\r\n\t\tusingFunction( fn: TComparisonFunction<T> ) {\r\n\t\t\treturn doCreateWithFunctions( [ fn ] );\r\n\t\t}\r\n\t};\r\n\treturn ret as unknown as TSorterStarter<T>;\r\n}\r\n\r\nfunction doCreateWithFunctions<T>( fns: ReadonlyArray<TComparisonFunction<T>> ): TSorter<T> {\r\n\t// If we have some comparison functions, return an object that has chain methods and ending methods.\r\n\treturn {\r\n\t\tget then() {\r\n\t\t\treturn next( fns, identity ) satisfies TSorterStepFull<T, TSorter<T>> as any;\r\n\t\t},\r\n\t\treversed() {\r\n\t\t\treturn doCreateWithFunctions( [ ...fns.map( reverse ) ] );\r\n\t\t},\r\n\t\tcompare: ( a: T, b: T ) => {\r\n\t\t\treturn compare( fns, a, b )\r\n\t\t},\r\n\t\tsort: ( arr: TReadableArray<T> ): Array<T> => {\r\n\t\t\treturn sort( fns, arr );\r\n\t\t},\r\n\t\ttop: ( arr: TReadableArray<T>, n: TPositiveNumber ): Array<T> => {\r\n\t\t\treturn top( fns, arr, n );\r\n\t\t},\r\n\t\tbottom: ( arr: TReadableArray<T>, n: TPositiveNumber ): Array<T> => {\r\n\t\t\treturn bottom( fns, arr, n );\r\n\t\t},\r\n\t\tfirst: ( arr: TReadableArray<T> ): T | null => {\r\n\t\t\treturn first( fns, arr );\r\n\t\t},\r\n\t\tlast: ( arr: TReadableArray<T> ): T | null => {\r\n\t\t\treturn last( fns, arr );\r\n\t\t},\r\n\t} as const satisfies TSorter<T>;\r\n}\r\n\r\ntype TComparable<T> = { compare: TComparisonFunction<T> };\r\n\r\nexport type TSorter<T> = {\r\n\tget then(): TSorterStep<T, TSorter<T>>;\r\n\treversed: () => TSorter<T>;\r\n\r\n\tcompare: TComparisonFunction<T>;\r\n\tsort: ( arr: TReadableArray<T> ) => Array<T>;\r\n\ttop: ( arr: TReadableArray<T>, n: TPositiveNumber ) => Array<T>;\r\n\tbottom: ( arr: TReadableArray<T>, n: TPositiveNumber ) => Array<T>;\r\n\tfirst: ( arr: TReadableArray<T> ) => T | null;\r\n\tlast: ( arr: TReadableArray<T> ) => T | null;\r\n}\r\n\r\ntype TSorterStepForRecords<T, Ret> = {\r\n\tusingStrings: ( field: TKeysOfType<T, string> ) => TSorterStepUsing<string, Ret>;\r\n\tusingNumbers: ( field: TKeysOfType<T, number> ) => TSorterStepUsing<number, Ret>;\r\n\tusingBooleans: ( field: TKeysOfType<T, boolean> ) => TSorterStepUsing<boolean, Ret>;\r\n\tusingDates: ( field: TKeysOfType<T, Date> ) => TSorterStepUsing<Date, Ret>;\r\n\tusingTimeInstant: ( field: TKeysOfType<T, TimeInstant> ) => TSorterStepUsing<TimeInstant, Ret>;\r\n\tusingTimeDuration: ( field: TKeysOfType<T, TimeDuration> ) => TSorterStepUsing<TimeDuration, Ret>;\r\n};\r\ntype TSorterStepForNumbers<_T, Ret> = {\r\n\tinAscendingOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinDescendingOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForStrings<_T, Ret> = {\r\n\t/** @deprecated: Use inLexographicalOrder instead */ inLexographicalOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\t/** @deprecated: Use inLexographicalOrderIgnoringCase instead */ inLexographicalOrderIgnoringCase( opts?: { nullsFirst?: boolean } ): Ret;\r\n\t/** @deprecated: Use inReverseLexographicalOrder instead */ inReverseLexographicalOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\t/** @deprecated: Use inReverseLexographicalOrderIgnoringCase instead */ inReverseLexographicalOrderIgnoringCase( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinLexicographicalOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinLexicographicalOrderIgnoringCase( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinReverseLexicographicalOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinReverseLexicographicalOrderIgnoringCase( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForBooleans<_T, Ret> = {\r\n\ttruesFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tfalsesFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForDates<_T, Ret> = {\r\n\toldestDateFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tnewestDateFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForTimeInstant<_T, Ret> = {\r\n\toldestFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tnewestFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForTimeDuration<_T, Ret> = {\r\n\tlongestFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tshortestFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForChainables<T, Ret> = {\r\n\tchain: ( chain: TComparable<T> ) => Ret;\r\n\tchainFunction: ( fn: TComparisonFunction<T> ) => Ret;\r\n};\r\ntype TSorterStepForUsing<T, Ret> = {\r\n\tusing: <X>( transform: TFunction<T, X> ) => TSorterStepUsing<X, Ret>;\r\n};\r\ntype TSorterStepForPrioritizable<T extends string | number, Ret> = {\r\n\tprioritizing( arr: T[], options?: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> ): Ret;\r\n\tdeprioritizing( arr: Array<T>, options?: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> ): Ret;\r\n\tprioritizingWithEqualWeight( arr: T[], options?: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> ): Ret;\r\n\tdeprioritizingWithEqualWeight( arr: Array<T>, options?: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> ): Ret;\r\n};\r\ntype TSorterStepUsing<T, Ret> = {}\r\n\t& ( T extends Record<string | number | symbol, unknown> ? TSorterStepForRecords<T, Ret> : {} )\r\n\t& ( T extends number ? TSorterStepForNumbers<T, Ret> : {} )\r\n\t& ( T extends string ? TSorterStepForStrings<T, Ret> : {} )\r\n\t& ( T extends boolean ? TSorterStepForBooleans<T, Ret> : {} )\r\n\t& ( T extends Date ? TSorterStepForDates<T, Ret> : {} )\r\n\t& ( T extends TimeInstant ? TSorterStepForTimeInstant<T, Ret> : {} )\r\n\t& ( T extends TimeDuration ? TSorterStepForTimeDuration<T, Ret> : {} )\r\n\t& ( T extends string ? TSorterStepForPrioritizable<string, Ret> : {} ) // Allowing all types of strings here is needed because literal types extending strings create compilation problems with method signatures (T[] where T = 'A' | 'B' becomes 'A'[] & 'B'[])\r\n\t& ( T extends number ? TSorterStepForPrioritizable<number, Ret> : {} ) // Allowing all types of numbers here is needed because literal types extending numbers create compilation problems with method signatures (T[] where T = 1 | 2 becomes 1[] & 2[])\r\n\t;\r\ntype TSorterStep<T, Ret> = TSorterStepUsing<T, Ret>\r\n\t& TSorterStepForChainables<T, Ret>\r\n\t& TSorterStepForUsing<T, Ret>\r\n\t;\r\ntype TSorterStepFull<T, Ret> = TSorterStepForRecords<T, Ret>\r\n\t& TSorterStepForNumbers<T, Ret>\r\n\t& TSorterStepForStrings<T, Ret>\r\n\t& TSorterStepForBooleans<T, Ret>\r\n\t& TSorterStepForDates<T, Ret>\r\n\t& TSorterStepForTimeInstant<T, Ret>\r\n\t& TSorterStepForTimeDuration<T, Ret>\r\n\t& TSorterStepForChainables<T, Ret>\r\n\t& TSorterStepForUsing<T, Ret>\r\n\t;\r\ntype TSorterStarter<T> = TSorterStepUsing<T, TSorter<T>> & TSorterStepForUsing<T, TSorter<T>> & { usingFunction: ( fn: TComparisonFunction<T> ) => TSorter<T> };\r\nexport type TSorterBuilder<T> = ( builder: TSorterStarter<T> ) => TSorter<T>;\r\n\r\ntype TStringComparisonOptions = TCompareFunctionOptions & { ignoreCase: boolean };\r\nconst defaultStringComparisonOptions = { ...defaultCompareFunctionOptions, ignoreCase: false } as const satisfies Partial<TStringComparisonOptions>;\r\n\r\ntype TNumberComparisonOptions = TCompareFunctionOptions;\r\nconst defaultNumberComparisonOptions = { ...defaultCompareFunctionOptions } as const satisfies Partial<TNumberComparisonOptions>;\r\n\r\ntype TDateComparisonOptions = TCompareFunctionOptions;\r\nconst defaultDateComparisonOptions = { ...defaultCompareFunctionOptions } as const satisfies Partial<TDateComparisonOptions>;\r\n\r\ntype TTimeInstantComparisonOptions = TCompareFunctionOptions;\r\nconst defaultTimeInstantComparisonOptions = { ...defaultCompareFunctionOptions } as const satisfies Partial<TTimeInstantComparisonOptions>;\r\n\r\ntype TTimeDurationComparisonOptions = TCompareFunctionOptions;\r\nconst defaultTimeDurationComparisonOptions = { ...defaultCompareFunctionOptions } as const satisfies Partial<TTimeDurationComparisonOptions>;\r\n\r\ntype TBooleanComparisonOptions = TCompareValuesOptions & { truesFirst: boolean };\r\nconst defaultBooleanComparisonOptions = { ...defaultCompareValuesOptions } as const satisfies Partial<TBooleanComparisonOptions>;\r\n\r\ntype TPrioritizeOptions = {};\r\nconst defaultPrioritizeOptions = {} as const satisfies Partial<TPrioritizeOptions>;\r\n\r\nexport const Sorter = {\r\n\tcreateFor: <T>( _template?: T ) => doCreateEmpty<T>(),\r\n\tsort: <T>( arr: TReadableArray<T>, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).sort( arr ),\r\n\ttop: <T>( arr: TReadableArray<T>, n: TPositiveNumber, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).top( arr, n ),\r\n\tbottom: <T>( arr: TReadableArray<T>, n: TPositiveNumber, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).bottom( arr, n ),\r\n\tfirst: <T>( arr: TReadableArray<T>, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).first( arr ),\r\n\tlast: <T>( arr: TReadableArray<T>, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).last( arr ),\r\n};\r\nexport default Sorter;\r\n", "import { randomNumberInInterval } from \"../utils/random.js\";\r\nimport TimeDuration from \"./TimeDuration.js\";\r\nimport { TimeUnit } from \"./TimeUnit.js\";\r\n\r\nfunction randomize( unit: TimeUnit ) {\r\n\treturn ( a: number, b: number ) => {\r\n\t\treturn TimeDuration.fromMs( randomNumberInInterval( unit.toMs( a ), unit.toMs( b ) ) );\r\n\t}\r\n}\r\n\r\nexport default class RandomTimeDuration {\r\n\r\n\tprivate constructor() {}\r\n\r\n\tpublic static ms = randomize( TimeUnit.MILLISECONDS );\r\n\tpublic static seconds = randomize( TimeUnit.SECONDS );\r\n\tpublic static minutes = randomize( TimeUnit.MINUTES );\r\n\tpublic static hours = randomize( TimeUnit.HOURS );\r\n\tpublic static days = randomize( TimeUnit.DAYS );\r\n\r\n}\r\n", "import { TPositiveNumber } from \"../utils/_index\";\r\nimport TimeDuration from \"./TimeDuration\";\r\n\r\nexport default class TimeFrequency {\r\n\r\n\tpublic constructor(\r\n\t\tpublic readonly times: TPositiveNumber,\r\n\t\tpublic readonly period: TimeDuration,\r\n\t) { \r\n\t\tif ( isNaN( times ) || times <= 0 )\r\n\t\t\tthrow new Error();\r\n\t\tif ( period.isEmpty() )\r\n\t\t\tthrow new Error();\r\n\t}\r\n\r\n\tpublic get frequency() {\r\n\t\treturn this.period.divideBy( this.times );\r\n\t}\r\n\r\n\tpublic static onceEvery( period: TimeDuration ) {\r\n\t\treturn new TimeFrequency( 1, period );\r\n\t}\r\n\r\n\tpublic static twiceEvery( period: TimeDuration ) {\r\n\t\treturn new TimeFrequency( 2, period );\r\n\t}\r\n\r\n}\r\n", "import { TimeDuration } from \"./_index.js\";\r\nimport TimeInstant from \"./TimeInstant.js\";\r\n\r\nexport class TimeRange {\r\n\r\n\tpublic readonly end: TimeInstant;\r\n\r\n\tprotected constructor(\r\n\t\tpublic readonly start: TimeInstant,\r\n\t\tpublic readonly duration: TimeDuration\r\n\t) {\r\n\t\tthis.end = start.addDuration( duration );\r\n\t}\r\n\r\n\tpublic static fromInstants( a: TimeInstant, b: TimeInstant ) {\r\n\t\tconst lowest = TimeInstant.lowest( a, b );\r\n\t\tconst highest = TimeInstant.highest( a, b );\r\n\t\treturn new TimeRange( lowest, lowest.distanceFrom( highest ) );\r\n\t}\r\n\r\n\tpublic static fromInstantWithDuration( a: TimeInstant, d: TimeDuration ) {\r\n\t\treturn new TimeRange( a, d );\r\n\t}\r\n\r\n\tpublic static fromNowWithDuration( d: TimeDuration ) {\r\n\t\treturn new TimeRange( TimeInstant.now(), d );\r\n\t}\r\n\r\n}\r\n", "\r\n\r\nexport class UnavailableUpgradeError<T> extends Error {\r\n\r\n\tconstructor(\r\n\t\tpublic readonly data: T,\r\n\t\tpublic readonly from: number,\r\n\t\tpublic readonly to: number\r\n\t) {\r\n\t\tsuper( `No transition found to upgrade data from version ${from} to version ${to}.` );\r\n\t}\r\n\r\n}\r\n\r\nexport class EmptyUpgradeError<T> extends Error {\r\n\r\n\tconstructor(\r\n\t\tpublic readonly data: T,\r\n\t\tpublic readonly from: number,\r\n\t\tpublic readonly to: number,\r\n\t) {\r\n\t\tsuper( `Transition from version ${ from } to version ${ to } resulted in empty data` );\r\n\t}\r\n\r\n}\r\n", "\r\nimport { TMaybe } from \"../utils/_index\";\r\nimport { TTransition, TTransitionMatrix, TUpgradable } from \"./types\";\r\n\r\nconst DEBUG_ENABLED = false;\r\n\r\nexport default function getTransitionsPath<\r\n\tXStar extends TUpgradable,\r\n\tXFromNumber extends XStar[ \"$version\" ],\r\n\tXToNumber extends XStar[ \"$version\" ]\r\n>(\r\n\tmatrix: TTransitionMatrix<XStar>,\r\n\tfrom: XFromNumber,\r\n\tto: XToNumber\r\n): TMaybe<TTransition<XStar, XFromNumber, XToNumber>[]> {\r\n\treturn internalGetTransitionsPath( matrix, from, to, 0, DEBUG_ENABLED );\r\n}\r\n\r\nfunction internalGetTransitionsPath<\r\n\tXStar extends TUpgradable,\r\n\tXFromNumber extends XStar[ \"$version\" ],\r\n\tXToNumber extends XStar[ \"$version\" ]\r\n>(\r\n\tmatrix: TTransitionMatrix<XStar>,\r\n\tfrom: XFromNumber,\r\n\tto: XToNumber,\r\n\tdepth: number,\r\n\tdebug: boolean,\r\n): TMaybe<TTransition<XStar, any, any>[]> {\r\n\r\n\tdebugLog( debug, depth, from, to, 'Search started.' );\r\n\r\n\tconst transitionsTo = matrix[ to ];\r\n\tif ( !transitionsTo ) {\r\n\t\tdebugLog( debug, depth, from, to, 'No transitions available to this version' );\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// Check if there is a transition that goes directly from from to to.\r\n\tconst exactTransition = transitionsTo[ from ];\r\n\tif ( exactTransition ) {\r\n\t\tdebugLog( debug, depth, from, to, 'Found exact transition.' );\r\n\t\treturn [ exactTransition ];\r\n\t}\r\n\r\n\t// Otherwise, recursively search for the min path.\r\n\tconst keys = Object.keys( transitionsTo );\r\n\treturn keys.reduce( ( curBestPath: TMaybe<TTransition<XStar, any, any>[]>, transitionKey: string ) => {\r\n\t\tconst transition = transitionsTo[ transitionKey as unknown as XStar[ \"$version\" ] ]!;\r\n\t\tconst path = internalGetTransitionsPath( matrix, from, transition.from, depth + 1, debug );\r\n\t\tif ( path === null ) {\r\n\t\t\tdebugLog( debug, depth + 1, from, transition.from, 'No path found.' );\r\n\t\t\treturn curBestPath;\r\n\t\t} else {\r\n\t\t\tif ( curBestPath === null || curBestPath.length > path.length + 1 ) {\r\n\t\t\t\tdebugLog( debug, depth + 1, from, transition.from, 'New best path found: ' + printTransitions( path ) );\r\n\t\t\t\treturn [ ...path, transition ];\r\n\t\t\t} else {\r\n\t\t\t\treturn curBestPath;\r\n\t\t\t}\r\n\t\t}\r\n\t}, null as TMaybe<TTransition<XStar, any, any>[]> );\r\n\r\n}\r\n\r\nfunction debugLog(\r\n\tenabled: boolean,\r\n\tdepth: number,\r\n\tfrom: number,\r\n\tto: number,\r\n\tmessage: string\r\n) {\r\n\tif ( !enabled )\r\n\t\treturn;\r\n\t// istanbul ignore next\r\n\t// eslint-disable-next-line no-restricted-globals\r\n\tconsole.info(\r\n\t\t'#'.repeat( depth + 1 ),\r\n\t\tfrom + ' -> ' + to,\r\n\t\tmessage\r\n\t);\r\n}\r\n\r\nfunction printTransitions( transitions: TTransition<any, any, any>[] ): string {\r\n\treturn transitions.reduce( ( ret, cur ) => {\r\n\t\treturn ret + \" -> \" + cur.to;\r\n\t}, \"\" + transitions[ 0 ].from );\r\n}\r\n\r\n", "\r\nimport { isDefined, isNumber, isPositiveNumber, jsonCloneDeep, TJsonSerializable } from \"../utils/_index.js\";\r\nimport { EmptyUpgradeError, UnavailableUpgradeError } from \"./errors\";\r\nimport getTransitionsPath from \"./getTransitionsPath\";\r\nimport { TPossibleFromVersion, TPossibleVersion, TTransitionMatrix, TUpgradable, TUpgradeFunction, TVersionMap } from \"./types\";\r\n\r\nconst VERSION_FIELD = \"$version\";\r\n\r\nexport interface IDataUpgrader<XStar extends TUpgradable, XLatest extends XStar> {\r\n\tupgrade( data: XStar ): Promise<XLatest>;\r\n}\r\n\r\nexport class DataUpgrader<X extends TUpgradable, XLatest extends X> implements IDataUpgrader<X, XLatest> {\r\n\r\n\tprivate transitions: TTransitionMatrix<X> = {};\r\n\r\n\tprivate constructor(\r\n\t\tprivate latestVersion: XLatest[ typeof VERSION_FIELD ]\r\n\t) { }\r\n\r\n\tpublic addTransition<\r\n\t\tXFrom extends TVersionMap<X>[ XFromNumber ],\r\n\t\tXTo extends TVersionMap<X>[ XToNumber ],\r\n\t\tXFromNumber extends TPossibleFromVersion<X, XLatest>,\r\n\t\tXToNumber extends Exclude<TPossibleVersion<X>, XFromNumber>,\r\n\t>(\r\n\t\tfrom: XFromNumber,\r\n\t\tto: XToNumber,\r\n\t\tapply: TUpgradeFunction<X, XFrom, XTo>\r\n\t): this {\r\n\t\tif ( from === undefined || from < 0 )\r\n\t\t\tthrow new Error( `Invalid argument from, non-negative number expected, got: ${from}` );\r\n\t\tif ( to === undefined || to <= 0 )\r\n\t\t\tthrow new Error( `Invalid argument to, positive number expected, got: ${to}` );\r\n\t\tif ( to <= from )\r\n\t\t\tthrow new Error( `Invalid argument to, expected number greater than ${from}, got: ${to}` );\r\n\t\tif ( to > this.latestVersion )\r\n\t\t\tthrow new Error( `Invalid argument to, expected number lower than ${this.latestVersion}, got: ${to}` );\r\n\t\tif ( this.transitions[ to ]?.[ from ] )\r\n\t\t\tthrow new Error( `Invalid transition arguments, duplicated transition found from ${from} to ${to}` );\r\n\t\tconst toMatrix: TTransitionMatrix<X>[ XTo[ typeof VERSION_FIELD ] ] = this.transitions[ to ] ?? {};\r\n\t\ttoMatrix[ from ] = { from, to, apply };\r\n\t\tthis.transitions[ to ] = toMatrix;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic async upgrade( data: X ): Promise<XLatest> {\r\n\t\tif ( !data || typeof data !== \"object\" )\r\n\t\t\tthrow new Error( `Invalid argument data, object expected, got: ${typeof data}.` );\r\n\t\tif ( data.$version === null || data.$version === undefined || typeof data.$version !== \"number\" )\r\n\t\t\tthrow new Error( `Invalid argument data, version metadata required, got: ${data.$version as unknown as string}` );\r\n\t\tif ( data.$version > this.latestVersion )\r\n\t\t\tthrow new Error( `Invalid argument data, version metadata is in the future: ${data.$version}, current: ${this.latestVersion}` );\r\n\t\tif ( this.isLatestVersion( data ) )\r\n\t\t\treturn data;\r\n\r\n\t\tconst from = data.$version;\r\n\t\tconst to = this.latestVersion;\r\n\t\tconst path = getTransitionsPath<X, typeof from, XLatest[ typeof VERSION_FIELD ]>( this.transitions, from, to );\r\n\t\tif ( path === null )\r\n\t\t\tthrow new UnavailableUpgradeError( data, from, to );\r\n\r\n\t\tlet current: X = jsonCloneDeep( data );\r\n\t\tfor ( const transition of path ) {\r\n\t\t\tconst next = await transition.apply( current as any );\r\n\t\t\tif ( next === null || next === undefined )\r\n\t\t\t\tthrow new EmptyUpgradeError( current, from, to );\r\n\t\t\tcurrent = next;\r\n\t\t}\r\n\r\n\t\treturn current as XLatest;\r\n\t}\r\n\r\n\tpublic isLatestVersion( data: X ): data is XLatest {\r\n\t\treturn data.$version === this.latestVersion;\r\n\t}\r\n\r\n\tpublic static create<\r\n\t\tX extends TUpgradable,\r\n\t\tXLatestVersion extends X,\r\n\t>(\r\n\t\tlatest: XLatestVersion[ typeof VERSION_FIELD ]\r\n\t) {\r\n\t\treturn new DataUpgrader<X, XLatestVersion>( latest );\r\n\t}\r\n\r\n\tpublic static Errors = {\r\n\t\tEmptyUpgrade: EmptyUpgradeError,\r\n\t\tUnavailableUpgrade: UnavailableUpgradeError\r\n\t} as const;\r\n\r\n}\r\n\r\nexport function isUpgradable( obj: TJsonSerializable ): obj is TUpgradable {\r\n\treturn isDefined( obj ) && typeof obj === \"object\" && VERSION_FIELD in obj && isNumber( obj.$version ) && isPositiveNumber( obj.$version );\r\n}\r\n\r\nexport default DataUpgrader;\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../src/index.ts", "../src/async/Deferred.ts", "../src/async/RateThrottler.ts", "../src/async/Semaphore.ts", "../src/utils/nulls.ts", "../src/Optional.ts", "../src/utils/arrays/groupBy.ts", "../src/utils/arrays/indexBy.ts", "../src/utils/arrays/statistics.ts", "../src/utils/functions/constant.ts", "../src/utils/functions/iff.ts", "../src/utils/functions/predicateBuilder.ts", "../src/utils/functions.ts", "../src/utils/arrays/uniqBy.ts", "../src/utils/arrays.ts", "../src/utils/booleans.ts", "../src/utils/css.ts", "../src/utils/errors/withTryCatch.ts", "../src/utils/errors.ts", "../src/utils/json.ts", "../src/utils/numbers/round.ts", "../src/utils/numbers.ts", "../src/utils/operations.ts", "../src/utils/promises.ts", "../src/utils/random.ts", "../src/utils/records/entries.ts", "../src/utils/records.ts", "../src/utils/strings/StringParts.ts", "../src/utils/strings.ts", "../src/lazy/Lazy.ts", "../src/lazy/LazyAsync.ts", "../src/lazy/LazyDictionary.ts", "../src/time/TimeUnit.ts", "../src/time/TimeBase.ts", "../src/time/TimeDuration.ts", "../src/time/constants.ts", "../src/time/TimeInstantBuilder.ts", "../src/time/TimeInstant.ts", "../src/Logger.ts", "../src/sorting/Sorter.ts", "../src/time/RandomTimeDuration.ts", "../src/time/TimeFrequency.ts", "../src/time/TimeRange.ts", "../src/upgrade/errors.ts", "../src/upgrade/getTransitionsPath.ts", "../src/upgrade/DataUpgrader.ts"],
|
|
4
|
+
"sourcesContent": ["\r\nexport * from './async/_index.js';\r\nexport * from './lazy/_index.js';\r\nexport * from './Logger.js';\r\nexport * from './Optional.js';\r\nexport * from './sorting/_index.js';\r\nexport * from './time/_index.js';\r\nexport * from './upgrade/_index.js';\r\nexport * from './utils/_index.js';\r\n\r\n", "import { TFunction } from \"../utils/functions.js\";\r\n\r\ntype DeferredInternals<T> = {\r\n\tpromise: Promise<T>;\r\n\tresolve: TFunction<T, void>;\r\n\treject: TFunction<Error, void>;\r\n}\r\n\r\nexport interface ICancelable {\r\n\tcancel(): void;\r\n}\r\nexport interface ICancelablePromise<T> extends Promise<T>, ICancelable { }\r\n\r\nexport class DeferredCanceledError extends Error {\r\n\tconstructor() {\r\n\t\tsuper( \"Execution canceled\" );\r\n\t}\r\n}\r\n\r\nexport class Deferred<T = void> implements ICancelablePromise<T> {\r\n\r\n\tprivate _pending: boolean;\r\n\tprivate readonly _internals: DeferredInternals<T>;\r\n\r\n\tpublic get pending(): boolean { return this._pending; }\r\n\r\n\tconstructor() {\r\n\t\tthis._pending = true;\r\n\t\tthis._internals = this.createInternals();\r\n\t}\r\n\r\n\tpublic resolve( val: T ): void {\r\n\t\tif ( !this._pending )\r\n\t\t\tthrow new Error( 'Illegal state exception' );\r\n\t\tthis.resolveIfPending( val );\r\n\t}\r\n\r\n\tpublic reject( reason: Error ): void {\r\n\t\tif ( !this._pending )\r\n\t\t\tthrow new Error( 'Illegal state exception' );\r\n\t\tthis.rejectIfPending( reason );\r\n\t}\r\n\r\n\tpublic cancel(): void {\r\n\t\tif ( !this._pending )\r\n\t\t\tthrow new Error( 'Illegal state exception' );\r\n\t\tthis.cancelIfPending();\r\n\t}\r\n\r\n\tpublic resolveIfPending( val: T ): void {\r\n\t\tif ( !this._pending )\r\n\t\t\treturn;\r\n\t\tthis._pending = false;\r\n\t\tthis._internals.resolve( val );\r\n\t}\r\n\r\n\tpublic rejectIfPending( reason: Error ): void {\r\n\t\tif ( !this._pending )\r\n\t\t\treturn;\r\n\t\tthis._pending = false;\r\n\t\tthis._internals.reject( reason );\r\n\t}\r\n\r\n\tpublic cancelIfPending(): void {\r\n\t\tif ( !this._pending )\r\n\t\t\treturn;\r\n\t\tthis.reject( new DeferredCanceledError() );\r\n\t}\r\n\r\n\r\n\tpublic then<R = T, S = T>( onFulfilled: ( ( value: T ) => R | PromiseLike<R> ) | null | undefined, onRejected?: ( ( reason: Error ) => S | PromiseLike<S> ) | null | undefined ): Promise<R | S> {\r\n\t\treturn this._internals.promise.then( onFulfilled, onRejected );\r\n\t}\r\n\r\n\tpublic catch<R = T>( onRejected: ( ( reason: Error ) => R | PromiseLike<R> ) | null | undefined ): Promise<T | R> {\r\n\t\treturn this._internals.promise.catch( onRejected );\r\n\t}\r\n\r\n\tpublic finally( onfinally: ( () => void ) | null | undefined ): Promise<T> {\r\n\t\treturn this._internals.promise.finally( onfinally );\r\n\t}\r\n\r\n\tpublic asPromise(): Promise<T> {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic asCancelablePromise(): ICancelablePromise<T> {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tprotected createInternals() {\r\n\t\tlet resolveSelf: ( value: T ) => void, rejectSelf: ( reason: Error ) => void;\r\n\t\tconst promise = new Promise<T>( ( resolve, reject ) => {\r\n\t\t\tresolveSelf = resolve;\r\n\t\t\trejectSelf = reject;\r\n\t\t} );\r\n\t\treturn {\r\n\t\t\tpromise,\r\n\t\t\tresolve: resolveSelf!,\r\n\t\t\treject: rejectSelf!,\r\n\t\t};\r\n\t}\r\n\r\n\tget [ Symbol.toStringTag ]() {\r\n\t\treturn '[object Deferred]';\r\n\t}\r\n\r\n}\r\n\r\nexport default Deferred;\r\n", "import { TFunction, TimeInstant, TPromisable } from \"..\";\r\nimport TimeFrequency from \"../time/TimeFrequency\";\r\nimport Deferred from \"./Deferred\";\r\n\r\ntype TPromiseFactory<T, R> = TFunction<T, Promise<R>>;\r\n\r\nexport class RateThrottler {\r\n\r\n\tprivate readonly _availableSlots: TimeInstant[];\r\n\tprivate readonly _waitingRequests: Deferred<void>[];\r\n\r\n\tconstructor(\r\n\t\tprivate readonly _frequency: TimeFrequency\r\n\t) {\r\n\t\tconst initialOffset = this.cooldown.divideBy( _frequency.times );\r\n\t\tthis._availableSlots = new Array( _frequency.times ).fill( 0 ).map( ( _, i ) => TimeInstant.now().addMs( i * initialOffset.ms ) );\r\n\t\tthis._waitingRequests = [];\r\n\t}\r\n\r\n\tpublic get cooldown() {\r\n\t\treturn this._frequency.period;\r\n\t}\r\n\r\n\tpublic async execute<T>( fn: TPromiseFactory<void, T> ) {\r\n\t\tconst wrappedFn = async () => {\r\n\t\t\tconst slot = this._availableSlots.shift()!;\r\n\t\t\ttry {\r\n\t\t\t\treturn slot.promise().then( () => fn() );\r\n\t\t\t} finally {\r\n\t\t\t\tthis._availableSlots.push( TimeInstant.now().addDuration( this.cooldown ) );\r\n\t\t\t\tif ( this._waitingRequests.length > 0 ) this._waitingRequests.shift()!.resolve();\r\n\t\t\t}\r\n\t\t};\r\n\t\tif ( this._availableSlots.length > 0 ) {\r\n\t\t\treturn wrappedFn();\r\n\t\t} else {\r\n\t\t\t// Semaphore implementation using promises.\r\n\t\t\tconst waitingRequest = new Deferred();\r\n\t\t\tthis._waitingRequests.push( waitingRequest );\r\n\t\t\treturn waitingRequest.then<T, T>( () => wrappedFn() );\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\nexport default RateThrottler;\r\n\r\nexport function throttle<TParams extends unknown[], R>( fn: (...params: TParams) => TPromisable<R>, frequence: TimeFrequency ): (...params: TParams) => Promise<R> {\r\n\tconst semaphore = new RateThrottler( frequence );\r\n\treturn (...t: TParams): Promise<R> => {\r\n\t\treturn semaphore.execute<R>( async () => fn( ...t ) );\r\n\t};\r\n}\r\n", "import { TAsyncProducer, TProducer, TimeDuration } from \"..\";\r\nimport Deferred from \"./Deferred\";\r\n\r\nexport class Semaphore {\r\n\r\n\tprivate readonly _queuedRequests: Deferred<void>[];\r\n\tprivate _inProgress = 0;\r\n\r\n\t/** Creates a new Semaphore with a single slot. */\r\n\tpublic constructor();\r\n\t/** Creates a new Semaphore with the specified amounts of slots. */\r\n\tpublic constructor( availableSlots: number );\r\n\tpublic constructor(\r\n\t\tprivate _availableSlots: number = 1\r\n\t) {\r\n\t\tthis._queuedRequests = [];\r\n\t}\r\n\r\n\tprivate async _awaitSlot(): Promise<void> {\r\n\t\tif ( this._availableSlots > 0 ) {\r\n\t\t\tthis._availableSlots -= 1;\r\n\t\t\tthis._inProgress += 1;\r\n\t\t\treturn void 0;\r\n\t\t} else {\r\n\t\t\t// Semaphore implementation using promises.\r\n\t\t\tconst deferred = new Deferred();\r\n\t\t\tthis._queuedRequests.push( deferred );\r\n\t\t\treturn deferred.asPromise();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _releaseSlot() {\r\n\t\tconst waitingSlotToResolve = this._queuedRequests.shift();\r\n\t\tif ( waitingSlotToResolve ) {\r\n\t\t\t// Let the next request start.\r\n\t\t\twaitingSlotToResolve.resolve();\r\n\t\t} else {\r\n\t\t\t// Free a slot.\r\n\t\t\tthis._availableSlots += 1;\r\n\t\t\tthis._inProgress -= 1;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic async execute<T>( fn: TAsyncProducer<T> | TProducer<T>, cooldown: TimeDuration = TimeDuration.ZERO ) {\r\n\t\treturn this._awaitSlot().then( fn ).finally( () => { void cooldown.delay( () => this._releaseSlot() ); } );\r\n\t}\r\n\r\n\tpublic get availableSlots() {\r\n\t\treturn this._availableSlots;\r\n\t}\r\n\r\n\tpublic get queueSize() {\r\n\t\treturn this._queuedRequests.length;\r\n\t}\r\n\r\n\tpublic get inProgressSize() {\r\n\t\treturn this._inProgress;\r\n\t}\r\n\r\n}\r\n\r\nexport default Semaphore;\r\n", "import { TConsumer, TFunction, TProducer, TVoidFunction } from \"./functions.js\";\r\n\r\nexport type TMaybe<T> = T | null;\r\n\r\nexport function ensureDefined<T>( v: T, name = 'value' ): T {\r\n\tif ( isDefined( v ) )\r\n\t\treturn v;\r\n\tthrow new Error( 'Expected ' + name + ' to be defined, got: ' + v );\r\n}\r\n\r\nexport function isDefined<T>( x: T | null | undefined ): x is T {\r\n\treturn x !== null && x !== undefined;\r\n}\r\n\r\nexport function isNullOrUndefined( x: unknown ): x is null | undefined {\r\n\treturn x === null || x === undefined;\r\n}\r\n\r\nexport function ifDefined<R>( source: TMaybe<R>, callback: TConsumer<R> ): void {\r\n\tif ( isDefined( source ) )\r\n\t\tcallback( source );\r\n}\r\n\r\nexport function mapDefined<R, S>( source: TMaybe<R>, mapper: TFunction<R, S> ): TMaybe<S> {\r\n\tif ( isDefined( source ) )\r\n\t\treturn mapper( source );\r\n\treturn null;\r\n}\r\n\r\nexport function ifNullOrUndefined( source: TMaybe<unknown>, callback: TVoidFunction ): void {\r\n\tif ( isNullOrUndefined( source ) )\r\n\t\tcallback();\r\n}\r\n\r\nexport function throwIfNullOrUndefined( source: TMaybe<unknown>, errorProducer: TProducer<Error> = () => new Error( `Unexpected ${source} value` ) ): void {\r\n\treturn ifNullOrUndefined( source, () => { throw errorProducer(); } );\r\n}\r\n", "import { TConsumer, TFunction, TPredicate, TProducer, TVoidFunction } from \"./utils/functions.js\";\r\nimport { isDefined, isNullOrUndefined } from \"./utils/nulls.js\";\r\n\r\nexport class Optional<T> implements TOptional<T> {\r\n\r\n\tprivate _present: boolean;\r\n\tprivate _value: T | undefined;\r\n\r\n\tprivate constructor( t: T | null | undefined ) {\r\n\t\tconst defined = isDefined( t );\r\n\t\tthis._value = defined ? t : undefined;\r\n\t\tthis._present = defined;\r\n\t}\r\n\r\n\tpublic getRawValue(): T | undefined {\r\n\t\treturn this._value;\r\n\t}\r\n\r\n\tpublic get(): T {\r\n\t\treturn this.getOrElseThrow( () => new ErrorGetEmptyOptional() );\r\n\t}\r\n\r\n\tpublic getOrElseThrow( errorProducer: TProducer<Error> ): T {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\tthrow errorProducer();\r\n\t\treturn this._value!;\r\n\t}\r\n\r\n\tpublic set( t: T ) {\r\n\t\tif ( isNullOrUndefined( t ) )\r\n\t\t\tthrow new ErrorSetEmptyOptional();\r\n\t\tthis._value = t;\r\n\t\tthis._present = true;\r\n\t}\r\n\r\n\tprotected setNullable( t: T | null | undefined ) {\r\n\t\tif ( isDefined( t ) ) {\r\n\t\t\treturn this.set( t );\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic clear() {\r\n\t\tthis._value = undefined;\r\n\t\tthis._present = false;\r\n\t}\r\n\r\n\tpublic isEmpty(): this is TEmptyOptional<T> {\r\n\t\treturn !this._present;\r\n\t}\r\n\tpublic isPresent(): this is TPresentOptional<T> {\r\n\t\treturn this._present;\r\n\t}\r\n\r\n\tpublic ifEmpty( callback: TVoidFunction ) {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\treturn callback();\r\n\t}\r\n\tpublic ifPresent( callback: TConsumer<T> ) {\r\n\t\tif ( this.isPresent() )\r\n\t\t\treturn callback( this.get() );\r\n\t}\r\n\tpublic ifPresentThenClear( callback: TConsumer<T> ) {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\tcallback( this.get() );\r\n\t\t\tthis.clear();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic apply( callbackIfPresent: TConsumer<T>, callbackIfEmpty: TVoidFunction ) {\r\n\t\tif ( this.isEmpty() ) {\r\n\t\t\treturn callbackIfEmpty();\r\n\t\t} else {\r\n\t\t\treturn callbackIfPresent( this.get() );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseReturn( newValue: T ): T {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this.get();\r\n\t\t} else {\r\n\t\t\treturn newValue;\r\n\t\t}\r\n\t}\r\n\tpublic orElse = this.orElseReturn.bind( this );\r\n\r\n\tpublic orElseProduce( newValueProducer: TProducer<T> ): T {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this.get();\r\n\t\t} else {\r\n\t\t\treturn newValueProducer();\r\n\t\t}\r\n\t}\r\n\tpublic orElseGet = this.orElseProduce.bind( this );\r\n\r\n\tpublic orElseReturnAndApply( newValue: T ): T {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this.get();\r\n\t\t} else {\r\n\t\t\tthis.set( newValue );\r\n\t\t\treturn newValue;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseProduceAndApply( newValueProducer: TProducer<T> ): T {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this.get();\r\n\t\t} else {\r\n\t\t\tconst newValue = newValueProducer();\r\n\t\t\tthis.set( newValue );\r\n\t\t\treturn newValue;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseReturnNullableAndApply( newValue: T | null | undefined ): TOptional<T> {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\tthis.setNullable( newValue );\r\n\t\t\treturn this;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseProduceNullableAndApply( newValueProducer: TProducer<T | null | undefined> ): TOptional<T> {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\tconst newValue = newValueProducer();\r\n\t\t\tthis.setNullable( newValue );\r\n\t\t\treturn this;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic orElseReturnNullable( newValue: T | null | undefined ) {\r\n\t\tif ( this.isEmpty() ) return Optional.ofNullable( newValue );\r\n\t\treturn this as TPresentOptional<T>;\r\n\t}\r\n\tpublic orElseNullable = this.orElseReturnNullable.bind( this );\r\n\r\n\r\n\tpublic orElseProduceNullable( newValueProducer: TProducer<T | null | undefined> ) {\r\n\t\tif ( this.isEmpty() ) {\r\n\t\t\tconst newValue = newValueProducer();\r\n\t\t\treturn Optional.ofNullable( newValue );\r\n\t\t}\r\n\t\treturn this as TPresentOptional<T>;\r\n\t}\r\n\tpublic orElseGetNullable = this.orElseProduceNullable.bind( this );\r\n\r\n\r\n\tpublic orElseThrow( errorProducer: TProducer<Error> ) {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\tthrow errorProducer();\r\n\t\treturn this as TPresentOptional<T>;\r\n\t}\r\n\r\n\tpublic throwIfPresent( errorProducer: TFunction<T, Error> ) {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\treturn this as TEmptyOptional<T>;\r\n\t\tthrow errorProducer( this.get() );\r\n\t}\r\n\r\n\tpublic mapTo<R>( mapper: TFunction<T, R | null | undefined> ) {\r\n\t\treturn this.flatMapTo( t => Optional.ofNullable( mapper( t ) ) );\r\n\t}\r\n\tpublic flatMapTo<R>( mapper: TFunction<T, TOptional<R>> ) {\r\n\t\treturn this.isPresent() ? mapper( this.get() ) : Optional.empty<R>();\r\n\t}\r\n\r\n\tpublic filter( predicate: TPredicate<T> ): this | TEmptyOptional<T> {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\treturn this;\r\n\t\tif ( predicate( this.get() ) )\r\n\t\t\treturn this;\r\n\t\treturn Optional.empty();\r\n\t}\r\n\r\n\tpublic static empty<T>(): TEmptyOptional<T> {\r\n\t\treturn new Optional( undefined ) as any;\r\n\t}\r\n\tpublic static of<T>( t: T ): TPresentOptional<T> {\r\n\t\tif ( isNullOrUndefined( t ) )\r\n\t\t\tthrow new ErrorCannotInstantiatePresentOptionalWithEmptyValue();\r\n\t\treturn new Optional( t ) as any;\r\n\t}\r\n\tpublic static ofNullable<T>( t: T | null | undefined ): TOptional<T> {\r\n\t\treturn new Optional( t ) as any;\r\n\t}\r\n\r\n}\r\nexport default Optional;\r\n\r\nexport type TOptional<T> = {\r\n\r\n\t/**\r\n\t * @returns the currently stored value, if any; throws {@link ErrorGetEmptyOptional} otherwise;\r\n\t */\r\n\tget(): T;\r\n\r\n\t/**\r\n\t * @returns the currently stored value, if any; returns undefined otherwise;\r\n\t */\r\n\tgetRawValue(): T | undefined;\r\n\r\n\t/**\r\n\t * @returns the currently stored value, if any; throws the error generated by errorProducer otherwise;\r\n\t */\r\n\tgetOrElseThrow: ( errorProducer: TProducer<Error> ) => T;\r\n\r\n\t/**\r\n\t * Places a new value inside this optional. Throws {@link ErrorSetEmptyOptional} if t is null or undefined.\r\n\t */\r\n\tset( t: T ): void;\r\n\r\n\t/**\r\n\t * Clears the current value from this optional, if any.\r\n\t */\r\n\tclear(): void;\r\n\tisEmpty(): boolean;\r\n\tisPresent(): boolean;\r\n\r\n\tifEmpty( callback: TVoidFunction ): void;\r\n\tifPresent( callback: TConsumer<T> ): void;\r\n\tapply<RP = void, RE = void>( callbackIfPresent: TFunction<T, RP>, callbackIfEmpty: TProducer<RE> ): RP | RE;\r\n\r\n\tthrowIfPresent: ( errorGenerator: TFunction<T, Error> ) => TEmptyOptional<T>;\r\n\r\n\t/** @deprecated[2025.07.25]: Replace with {@link orElseReturn} (drop-in replacement) */\r\n\torElse: ( newValue: T ) => T;\r\n\t/** @deprecated[2025.07.25]: Replace with {@link orElseProduce} (drop-in replacement) */\r\n\torElseGet: ( newValueProducer: TProducer<T> ) => T;\r\n\t/** @deprecated[2025.07.25]: Replace with {@link orElseReturnNullabe} (drop-in replacement) */\r\n\torElseNullable: ( newValue: T | null | undefined ) => TOptional<T>;\r\n\t/** @deprecated[2025.07.25]: Replace with {@link orElseProduceNullable} (drop-in replacement) */\r\n\torElseGetNullable: ( newValueProducer: TProducer<T | null | undefined> ) => TOptional<T>;\r\n\r\n\torElseReturn: ( newValue: T ) => T;\r\n\torElseProduce: ( newValueProducer: TProducer<T> ) => T;\r\n\torElseReturnNullable: ( newValue: T | null | undefined ) => TOptional<T>;\r\n\torElseProduceNullable: ( newValueProducer: TProducer<T | null | undefined> ) => TOptional<T>;\r\n\r\n\torElseReturnAndApply: ( newValue: T ) => T;\r\n\torElseProduceAndApply: ( newValueProducer: TProducer<T> ) => T;\r\n\torElseReturnNullableAndApply: ( newValue: T | null | undefined ) => TOptional<T>;\r\n\torElseProduceNullableAndApply: ( newValueProducer: TProducer<T | null | undefined> ) => TOptional<T>;\r\n\r\n\torElseThrow: ( errorProducer: TProducer<Error> ) => TPresentOptional<T>;\r\n\r\n\tmapTo<R>( mapper: TFunction<T, R> ): TOptional<R>;\r\n\tflatMapTo<R>( mapper: TFunction<T, TOptional<R>> ): TOptional<R>;\r\n\r\n\tfilter( predicate: TPredicate<T> ): TOptional<T>;\r\n}\r\nexport type TEmptyOptional<T> = TOptional<T> & {\r\n\tget(): never;\r\n\tisEmpty(): true;\r\n\tisPresent(): false;\r\n\tapply<RP = void, RE = void>( callbackIfPresent: TFunction<T, RP>, callbackIfEmpty: TProducer<RE> ): RE;\r\n}\r\nexport type TPresentOptional<T> = TOptional<T> & {\r\n\tget(): T;\r\n\tisEmpty(): false;\r\n\tisPresent(): true;\r\n\tapply<RP = void, RE = void>( callbackIfPresent: TFunction<T, RP>, callbackIfEmpty: TProducer<RE> ): RP;\r\n}\r\n\r\nexport class ErrorGetEmptyOptional extends Error {\r\n\tconstructor() {\r\n\t\tsuper( \"Cannot retrieve a value from an empty Optional.\" );\r\n\t}\r\n}\r\nexport class ErrorSetEmptyOptional extends Error {\r\n\tconstructor() {\r\n\t\tsuper( \"Cannot set a null or undefined value.\" );\r\n\t}\r\n}\r\nexport class ErrorCannotInstantiatePresentOptionalWithEmptyValue extends Error {\r\n\tconstructor() {\r\n\t\tsuper( \"Cannot initialize a PresentOptional with a null or undefined value.\" );\r\n\t}\r\n}\r\n", "\r\nimport { TFunction, TKeysOfType, TReadableArray } from \"../_index\";\r\n\r\nexport function groupByString<V, K extends TKeysOfType<V, string>>( arr: TReadableArray<V>, field: K ): Record<V[ K ] & string, V[]> {\r\n\treturn groupByStringWith( arr, t => t[ field ] as string );\r\n}\r\n\r\nexport function groupByNumber<V, K extends TKeysOfType<V, number>>( arr: TReadableArray<V>, field: K ): Record<V[ K ] & number, V[]> {\r\n\treturn groupByNumberWith( arr, t => t[ field ] as number );\r\n}\r\n\r\nexport function groupByBoolean<V, K extends TKeysOfType<V, boolean>>( arr: TReadableArray<V>, field: K ): Record<\"true\" | \"false\", V[]> {\r\n\treturn groupByBooleanWith( arr, t => t[ field ] as boolean );\r\n}\r\n\r\nexport function groupBySymbol<V, K extends TKeysOfType<V, symbol>>( arr: TReadableArray<V>, field: K ): Record<V[ K ] & symbol, V[]> {\r\n\treturn groupBySymbolWith( arr, t => t[ field ] as symbol );\r\n}\r\n\r\nexport function groupByStringWith<V, K extends string>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<K, V[]> {\r\n\treturn doGroupByWith<K, V>( arr, getter );\r\n}\r\n\r\nexport function groupByNumberWith<V, K extends number>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<K, V[]> {\r\n\treturn doGroupByWith<K, V>( arr, getter );\r\n}\r\n\r\nexport function groupByBooleanWith<V, K extends boolean>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<\"true\" | \"false\", V[]> {\r\n\treturn doGroupByWith<\"true\" | \"false\", V>( arr, item => getter( item ) ? \"true\" : \"false\" );\r\n}\r\n\r\nexport function groupBySymbolWith<V, K extends symbol>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<K, V[]> {\r\n\treturn doGroupByWith<K, V>( arr, getter );\r\n}\r\n\r\nfunction doGroupByWith<K extends string | number | symbol, V>( arr: TReadableArray<V>, getter: TFunction<V, K> ): Record<K, V[]> { // TODO[2025-01-03, Native]: Migrate to native @ https://devblogs.microsoft.com/typescript/announcing-typescript-5-4/#object.groupby-and-map.groupby\r\n\treturn [ ...arr ].reduce( ( dict, cur ) => {\r\n\t\tconst key = getter( cur );\r\n\t\tif ( key !== null && key !== undefined ) {\r\n\t\t\tconst arr = dict[ key ] ?? [];\r\n\t\t\tarr.push( cur );\r\n\t\t\tdict[ key ] = arr;\r\n\t\t}\r\n\t\treturn dict;\r\n\t}, {} as Record<K, V[]> );\r\n}\r\n\r\n", "\r\nimport { TFunction, TKeysOfType } from \"../_index\";\r\n\r\nexport function indexByString<V, K extends TKeysOfType<V, string>>( arr: V[], field: K ): Record<V[K] & string, V> {\r\n\treturn indexByStringWith( arr, t => t[ field ] as string );\r\n}\r\n\r\nexport function indexByNumber<V, K extends TKeysOfType<V, number>>( arr: V[], field: K ): Record<V[K] & number, V> {\r\n\treturn indexByNumberWith( arr, t => t[ field ] as number );\r\n}\r\n\r\nexport function indexBySymbol<V, K extends TKeysOfType<V, symbol>>( arr: V[], field: K ): Record<V[K] & symbol, V> {\r\n\treturn indexBySymbolWith( arr, t => t[ field ] as symbol );\r\n}\r\n\r\nexport function indexByStringWith<V>( arr: V[], getter: TFunction<V, string> ): Record<string, V> {\r\n\treturn doIndexByWith<string, V>( arr, getter );\r\n}\r\n\r\nexport function indexByNumberWith<V>( arr: V[], getter: TFunction<V, number> ): Record<number, V> {\r\n\treturn doIndexByWith<number, V>( arr, getter );\r\n}\r\n\r\nexport function indexBySymbolWith<V>( arr: V[], getter: TFunction<V, symbol> ): Record<symbol, V> {\r\n\treturn doIndexByWith<symbol, V>( arr, getter );\r\n}\r\n\r\nfunction doIndexByWith<K extends string | number | symbol, V>( arr: V[], getter: TFunction<V, K> ): Record<K, V> {\r\n\treturn arr.reduce( ( dict, cur ) => {\r\n\t\tconst key = getter( cur );\r\n\t\tif ( key !== null && key !== undefined ) {\r\n\t\t\tif ( dict[ key ] ) {\r\n\t\t\t\tthrow new Error( `Multiple values indexed by same key \"${ String( key ) }\".` );\r\n\t\t\t}\r\n\t\t\tdict[ key ] = cur;\r\n\t\t}\r\n\t\treturn dict;\r\n\t}, {} as Record<K, V> );\r\n}\r\n\r\n", "import type { TReadableArray } from \"../arrays.js\";\r\n\r\nexport function average( arr: TReadableArray<number> ): number {\r\n\tconst f = 1 / arr.length;\r\n\treturn arr.reduce( ( tot, cur ) => tot + ( cur * f ), 0 );\r\n}\r\n\r\nexport function sum( arr: TReadableArray<number> ): number {\r\n\treturn arr.reduce( ( tot, cur ) => tot + cur, 0 );\r\n}\r\n\r\nexport function sumBy<T>( arr: TReadableArray<T>, getter: ( t: T ) => number ): number {\r\n\treturn sum( arr.map( getter ) );\r\n}\r\n\r\nexport function min( arr: TReadableArray<number> ): number {\r\n\tif ( arr.length === 0 ) throw new Error( 'Cannot calculate value on empty array' );\r\n\treturn arr.reduce( ( min, cur ) => cur < min ? cur : min );\r\n}\r\n\r\nexport function minBy<T>( arr: TReadableArray<T>, getter: ( t: T ) => number ): number {\r\n\treturn min( arr.map( getter ) );\r\n}\r\n\r\nexport function max( arr: TReadableArray<number> ): number {\r\n\tif ( arr.length === 0 ) throw new Error( 'Cannot calculate value on empty array' );\r\n\treturn arr.reduce( ( max, cur ) => cur > max ? cur : max );\r\n}\r\n\r\nexport function maxBy<T>( arr: TReadableArray<T>, getter: ( t: T ) => number ): number {\r\n\treturn max( arr.map( getter ) );\r\n}\r\n", "export function constant<T>( v: T ): () => T { return () => v; }\r\nexport function identity<T>( t: T ) { return t; }\r\nexport default constant;\r\n\r\nexport const constantNull = constant( null );\r\nexport const constantTrue = constant( true );\r\nexport const constantFalse = constant( false );\r\nexport const constantUndefined = constant( void 0 );\r\nexport const alwaysTrue = constantTrue;\r\nexport const alwaysFalse = constantFalse;\r\nexport const constantZero = constant( 0 );\r\nexport const constantOne = constant( 1 );\r\n", "import { TPredicate } from \"../_index\";\r\n\r\ntype TBooleanOrPredicate = boolean | TPredicate<void>;\r\ntype TIff<T> = {\r\n\telseIf<R>( pred: TBooleanOrPredicate, valueIfTrue: R ): TIff<T | R>;\r\n\totherwise<R>( valueIfElse: R ): T | R;\r\n}\r\n\r\nexport function iff<T>( firstPredicate: TBooleanOrPredicate, valueIfTrue: T ): TIff<T> {\r\n\r\n\tif ( firstPredicate === true || ( firstPredicate instanceof Function && firstPredicate() === true ) ) {\r\n\t\tconst ret: TIff<T> = {\r\n\t\t\telseIf: () => ret,\r\n\t\t\totherwise: () => valueIfTrue\r\n\t\t};\r\n\t\treturn ret;\r\n\t} else {\r\n\t\tconst ret: TIff<T> = {\r\n\t\t\telseIf: <R>( elseIf: TBooleanOrPredicate, valueIfElseIfTrue: R ) => iff<R>( elseIf, valueIfElseIfTrue ),\r\n\t\t\totherwise: <R>( valueIfElse: R ) => valueIfElse\r\n\t\t};\r\n\t\treturn ret;\r\n\t}\r\n\r\n}\r\n\r\nexport default iff;\r\n\r\n", "\r\nimport { constantTrue, type TPredicate } from \"../functions.ts\";\r\n\r\nexport class PredicateBuilder<T> {\r\n\r\n\tprivate _currentPredicate: TPredicate<T> = constantTrue;\r\n\r\n\tpublic and( predicate: TPredicate<T> ) {\r\n\t\tconst curPredicate = this._currentPredicate.bind( undefined );\r\n\t\tconst newPredicate = ( t: T ) => curPredicate( t ) && predicate( t );\r\n\t\tthis._currentPredicate = newPredicate;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic or( predicate: TPredicate<T> ) {\r\n\t\tconst newPredicate = ( t: T ) => this._currentPredicate( t ) || predicate( t );\r\n\t\tthis._currentPredicate = newPredicate;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic toPredicate() {\r\n\t\treturn this._currentPredicate;\r\n\t}\r\n\r\n}\r\n", "import { constantTrue, identity } from './functions/constant.js';\r\nexport * from './functions/_index.js';\r\n\r\nexport type TFunction<A, R> = ( a: A ) => R;\r\nexport type TTransformer<A, R> = TFunction<A, R>;\r\nexport type TVoidFunction = TFunction<void, void>\r\nexport type TProducer<R> = TFunction<void, R>;\r\nexport type TConsumer<T> = TFunction<T, void>;\r\nexport type TPredicate<T> = TFunction<T, boolean>;\r\nexport type TTypePredicate<T, R extends T> = ( t: T ) => t is R;\r\nexport type TIdentityFunction<T> = TFunction<T, T>;\r\n\r\nexport type TBiFunction<A, B, R> = ( a: A, b: B ) => R;\r\nexport type TBiConsumer<A, B> = TBiFunction<A, B, void>;\r\nexport type TBiPredicate<T> = TBiFunction<T, T, boolean>;\r\nexport type TAccumulator<A, B> = TBiFunction<A, B, A>;\r\n\r\nexport type TAsyncFunction<A, R> = TFunction<A, Promise<R>>;\r\nexport type TAsyncVoidFunction = TAsyncFunction<void, void>\r\nexport type TAsyncProducer<R> = TAsyncFunction<void, R>;\r\nexport type TAsyncConsumer<T> = TAsyncFunction<T, void>;\r\nexport type TAsyncPredicate<T> = TAsyncFunction<T, boolean>;\r\nexport type TAsyncBiFunction<A, B, R> = TBiFunction<A, B, Promise<R>>;\r\nexport type TAsyncBiConsumer<A, B> = TAsyncBiFunction<A, B, void>;\r\nexport type TAsyncBiPredicate<T> = TAsyncBiFunction<T, T, boolean>;\r\n\r\nexport type TAnyFunction<R> = ( ...args: unknown[] ) => R;\r\nexport type TAsyncAnyFunction<R> = ( ...args: unknown[] ) => Promise<R>;\r\n\r\nexport function isFunction( t: unknown ): t is Function { // eslint-disable-line @typescript-eslint/no-unsafe-function-type\r\n\treturn typeof t === 'function';\r\n}\r\n\r\nexport function noop(): void { } // eslint-disable-line @typescript-eslint/no-empty-function\r\n\r\nexport function filterWithTypePredicate<T, R extends T>( filter: TPredicate<T> ): TTypePredicate<T, R> {\r\n\treturn ( t: T ): t is R => filter( t );\r\n}\r\n\r\nexport function not<T>( predicate: TPredicate<T> ): TPredicate<T> {\r\n\treturn ( t: T ) => !predicate( t );\r\n}\r\n\r\nexport function and<T>( a: TPredicate<T>, b: TPredicate<T> ): TPredicate<T>;\r\nexport function and<T>( ...predicates: Array<TPredicate<T>> ): TPredicate<T> {\r\n\tif ( predicates.length === 0 ) return constantTrue;\r\n\telse if ( predicates.length === 1 ) return predicates[ 0 ];\r\n\treturn ( t: T ) => predicates.reduce( ( prev, cur ) => prev ? cur( t ) : false, true );\r\n}\r\n\r\nexport function or<T>( a: TPredicate<T>, b: TPredicate<T> ): TPredicate<T>;\r\nexport function or<T>( ...predicates: Array<TPredicate<T>> ): TPredicate<T> {\r\n\tif ( predicates.length === 0 ) return constantTrue;\r\n\telse if ( predicates.length === 1 ) return predicates[ 0 ];\r\n\treturn ( t: T ) => predicates.reduce( ( prev, cur ) => prev ? true : cur( t ), false );\r\n}\r\n\r\nexport function xor<T>( a: TPredicate<T>, b: TPredicate<T> ): TPredicate<T> {\r\n\treturn ( t: T ) => a( t ) !== b( t );\r\n}\r\n\r\nexport function pipedInvoke<T, A>( op1: TFunction<T, A> ): TFunction<T, A>;\r\nexport function pipedInvoke<T, A, B>( op1: TFunction<T, A>, op2: TFunction<A, B> ): TFunction<T, B>;\r\nexport function pipedInvoke<T, A, B, C>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C> ): TFunction<T, C>;\r\nexport function pipedInvoke<T, A, B, C, D>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D> ): TFunction<T, D>;\r\nexport function pipedInvoke<T, A, B, C, D, E>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E> ): TFunction<T, E>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F> ): TFunction<T, F>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F, G>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F>, op7: TFunction<F, G> ): TFunction<T, G>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F, G, H>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F>, op7: TFunction<F, G>, op8: TFunction<G, H> ): TFunction<T, H>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F, G, H, I>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F>, op7: TFunction<F, G>, op8: TFunction<G, H>, op9: TFunction<H, I> ): TFunction<T, I>;\r\nexport function pipedInvoke<T, A, B, C, D, E, F, G, H, I>( op1: TFunction<T, A>, op2: TFunction<A, B>, op3: TFunction<B, C>, op4: TFunction<C, D>, op5: TFunction<D, E>, op6: TFunction<E, F>, op7: TFunction<F, G>, op8: TFunction<G, H>, op9: TFunction<H, I>, ...operations: TFunction<any, any>[] ): TFunction<T, unknown>;\r\nexport function pipedInvoke( ...fns: Array<TFunction<any, any>>): TFunction<any, any> { return pipedInvokeFromArray( fns ) }\r\n\r\nexport function pipedInvokeFromArray<T, R>( fns: Array<TFunction<any, any>>): TFunction<any, any> {\r\n\tif ( fns.length === 0 ) {\r\n\t\treturn identity as TFunction<any, any>;\r\n\t}\r\n\r\n\tif ( fns.length === 1 ) {\r\n\t\treturn fns[ 0 ];\r\n\t}\r\n\r\n\treturn function piped( input: T ): R {\r\n\t\treturn fns.reduce( ( prev: any, fn: TFunction<T, R> ) => fn( prev ), input as any );\r\n\t};\r\n}\r\n", "\r\nimport { TFunction, identity } from \"../functions.js\";\r\n\r\nexport function uniq<T>( arr: T[] ): T[] {\r\n\treturn uniqBy( arr, identity );\r\n}\r\n\r\nexport function uniqBy<T, K>( arr: T[], getter: TFunction<T, K> ): T[] {\r\n\treturn arr.reduce( ( dict, cur ) => {\r\n\t\tconst key = getter( cur );\r\n\t\tif ( dict.keys.includes( key ) ) {\r\n\t\t\treturn dict;\r\n\t\t} else {\r\n\t\t\treturn {\r\n\t\t\t\tkeys: [ ...dict.keys, key ],\r\n\t\t\t\tvalues: [ ...dict.values, cur ]\r\n\t\t\t};\r\n\t\t}\r\n\t}, { keys: [], values: [] } as { keys: K[], values: T[] } ).values;\r\n}\r\n\r\nexport function uniqByKey<T, K extends keyof T>( arr: T[], key: K ): T[] {\r\n\treturn uniqBy( arr, item => item[ key ] );\r\n}\r\n", "import Optional, { type TOptional } from \"../Optional.js\";\r\nimport type { TComparisonFunction } from \"../sorting/_index.js\";\r\nimport type { TAccumulator, TBiPredicate, TPredicate, TTransformer } from \"./functions.js\";\r\nimport { isNullOrUndefined, type TMaybe } from \"./nulls.js\";\r\n\r\nexport * from './arrays/groupBy.js';\r\nexport * from './arrays/indexBy.js';\r\nexport * from './arrays/statistics.js';\r\nexport * from './arrays/uniqBy.js';\r\n\r\nexport type TReadableArray<T> = Array<T> | ReadonlyArray<T>;\r\nexport type TArrayable<T> = T | T[];\r\nexport type TEmptyArray = [];\r\n\r\nexport function ensureArray<const T>( t: T | Array<T> | null | undefined ): Array<T> {\r\n\tif ( isNullOrUndefined( t ) ) return [];\r\n\treturn t instanceof Array ? t : [ t ];\r\n}\r\nexport function ensureReadableArray<const T>( t: T | Array<T> | ReadonlyArray<T> | null | undefined ): TReadableArray<T> {\r\n\tif ( isNullOrUndefined( t ) ) return [];\r\n\treturn t instanceof Array ? t : [ t ];\r\n}\r\n\r\nexport function isArray<const T>( t: unknown ): t is Array<T> {\r\n\treturn t instanceof Array;\r\n}\r\n\r\n/**\r\n * Generate a new copy of an array with:\r\n * - the first instance of an item matching the predicate being replaced with the given argument\r\n * - the given argument added as last item of the array if the predicate did not produce a match\r\n * @param arr - the original array of items\r\n * @param item - the item to insert or update\r\n * @param predicate - a function that returns true iff an item is equal to the given argument\r\n * @returns a new copy of the array with the item updated or added in last place\r\n */\r\nexport function upsert<T>( arr: ReadonlyArray<T>, item: T, isEqual: TBiPredicate<T> ): Array<T> {\r\n\tconst index = arr.findIndex( a => isEqual( a, item ) );\r\n\tif ( index === -1 ) {\r\n\t\treturn [ ...arr, item ];\r\n\t} else {\r\n\t\treturn [\r\n\t\t\t...arr.slice( 0, index ),\r\n\t\t\titem,\r\n\t\t\t...arr.slice( index + 1 )\r\n\t\t];\r\n\t}\r\n}\r\n\r\nexport function range( start: number, end: number ): Array<number> {\r\n\tif ( end < start ) throw new Error();\r\n\tlet length = ( end - start ) + 1;\r\n\treturn new Array( length ).fill( 1 ).map( ( _, i ) => start + i );\r\n}\r\n\r\nexport function fill<T>( length: number, value: T ): Array<T> {\r\n\treturn new Array<T>( length ).fill( value );\r\n}\r\n\r\nexport function extendArray<T extends Record<string | number | symbol, unknown>, X extends Record<string | number | symbol, unknown>>( arr: TReadableArray<T>, props: X ): Array<( T & X )> {\r\n\treturn arr.map( ( t: T ) => ( {\r\n\t\t...t,\r\n\t\t...props\r\n\t} ) );\r\n}\r\n\r\nexport function extendArrayWith<T extends Record<string | number | symbol, unknown>, X extends Record<string | number | symbol, unknown>>( arr: TReadableArray<T>, propsFn: ( t: T ) => X ): Array<( T & X )> {\r\n\treturn arr.map( ( t: T ) => ( {\r\n\t\t...t,\r\n\t\t...propsFn( t )\r\n\t} ) );\r\n}\r\n\r\nexport function reverse<T>( arr: TReadableArray<T> ): Array<T> {\r\n\treturn [ ...arr ].reverse();\r\n}\r\n\r\nexport function first<T>( arr: TReadableArray<T>, defaultValue: TMaybe<T> = null ): TMaybe<T> {\r\n\treturn ( arr.length ? arr[ 0 ] : defaultValue );\r\n}\r\nexport function last<T>( arr: TReadableArray<T>, defaultValue: TMaybe<T> = null ): TMaybe<T> {\r\n\treturn ( arr.length ? arr[ arr.length - 1 ] : defaultValue );\r\n}\r\n\r\nexport const head = first;\r\nexport function tail<T>( arr: TReadableArray<T> ): T[] {\r\n\treturn ( arr.length ? arr.slice( 1 ) : [] );\r\n}\r\n\r\nexport function sortedArray<T>( arr: Array<T>, sortFn?: TComparisonFunction<T> | undefined ): Array<T>;\r\nexport function sortedArray<T>( arr: ReadonlyArray<T>, sortFn?: TComparisonFunction<T> | undefined ): ReadonlyArray<T>;\r\nexport function sortedArray<T>( arr: TReadableArray<T>, sortFn?: TComparisonFunction<T> | undefined ) {\r\n\treturn [ ...arr ].sort( sortFn );\r\n}\r\n\r\n/**\r\n * Custom implementation of includes which allows checking for arbitrary items inside the array.\r\n */\r\nexport function includes<T>( arr: TReadableArray<T>, item: unknown, fromIndex?: number ) {\r\n\treturn arr.includes( item as any, fromIndex );\r\n}\r\n\r\nexport function mapTruthys<T, R>( arr: Array<T>, mapper: ( value: T, index: number, array: T[] ) => R | undefined ): Array<R> {\r\n\treturn arr.map( mapper ).filter( value => value !== undefined ) as Array<R>;\r\n}\r\nexport function flatMapTruthys<T, R>( arr: Array<T>, mapper: ( value: T, index: number, array: T[] ) => R | undefined ): Array<R> {\r\n\treturn arr.flatMap( mapper ).filter( value => value !== undefined ) as Array<R>;\r\n}\r\n\r\nexport function filterMap<T, R>( array: T[], filterFn: TPredicate<T>, mapFn: TTransformer<T, R> ): R[] {\r\n\treturn array.filter( filterFn ).map( mapFn );\r\n}\r\n\r\nexport function filterMapReduce<T, U, R>( array: T[], filterFn: TPredicate<T>, mapFn: TTransformer<T, U>, reduceFn: TAccumulator<R, U>, initialValue: R ): R {\r\n\treturn array.filter( filterFn ).map( mapFn ).reduce( reduceFn, initialValue );\r\n}\r\n\r\n/**\r\n * Partitions the given array in two groups, in the first one there will be any and only values of the array that match the given predicate, in the second one there will be any and only values that don't.\r\n * @param arr the array of items\r\n * @param predicate the predicate to use to partition the array\r\n * @returns a tuple, where the first array contains items matching the predicate, and the second array contains items not matching the predicate.\r\n */\r\nexport function partition<T>( arr: T[], predicate: TPredicate<T> ): [ T[], T[] ] {\r\n\treturn arr.reduce( ( partition, item ) => {\r\n\t\tpartition[ ( predicate( item ) ? 0 : 1 ) ].push( item );\r\n\t\treturn partition;\r\n\t}, [ [], [] ] as [ T[], T[] ] );\r\n}\r\n\r\n/**\r\n * Maps the first truthy value in the array using the provided mapping function.\r\n * @param arr - The array of items.\r\n * @param mapFn - The mapping function.\r\n * @returns The first truthy value returned by the mapping function, or null if no truthy value is found.\r\n */\r\nexport function mapFirstTruthy<T, R>( arr: T[], mapFn: TTransformer<T, R> ): R | null {\r\n\tfor ( let i = 0; i < arr.length; i++ ) {\r\n\t\tconst result = mapFn( arr[ i ] );\r\n\t\tif ( result ) return result;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nexport function listToDict<T, K extends string, V>( arr: T[], mapFn: TTransformer<T, [ K, V ]> ): Record<K, V> {\r\n\treturn arr.reduce( ( dict: Partial<Record<K, V>>, cur: T ) => {\r\n\t\tconst [ key, value ] = mapFn( cur );\r\n\t\treturn { ...dict, [ key ]: value };\r\n\t}, {} satisfies Partial<Record<K, V>> );\r\n}\r\n\r\nexport function shallowArrayEquals( a: unknown[], b: unknown[] ): boolean {\r\n\tif ( a === b ) return true;\r\n\tif ( a.length !== b.length ) return false;\r\n\tfor ( let i = 0; i < a.length; i++ ) {\r\n\t\tif ( a[ i ] !== b[ i ] ) return false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\nexport function findInArray<T>( arr: T[], predicate: TPredicate<T> ): TOptional<T> {\r\n\treturn Optional.ofNullable( arr.find( predicate ) );\r\n}\r\n\r\nexport function findIndexInArray<T>( arr: T[], predicate: TPredicate<T> ): TOptional<number> {\r\n\tconst idx = arr.findIndex( predicate );\r\n\treturn idx === -1 ? Optional.empty() : Optional.of( idx );\r\n}\r\n\r\nexport function zip<T, R>( ts: T[], rs: R[] ): [ T, R ][] {\r\n\tif ( ts.length !== rs.length )\r\n\t\tthrow new Error( `Arrays must have the same length. Got ${ts.length} and ${rs.length}` );\r\n\treturn ts.map( ( t, i ) => [ t, rs[ i ]! ] as [ T, R ] );\r\n}\r\n\r\nexport function unzip<T, R>( arr: [ T, R ][] ): [ T[], R[] ] {\r\n\treturn arr.reduce( ( [ ts, rs ], [ t, r ] ) => {\r\n\t\treturn [ [ ...ts, t ], [ ...rs, r ] ];\r\n\t}, [ [], [] ] as [ T[], R[] ] );\r\n}\r\n\r\n/**\r\n * Gets the element at the specified index in the array, wrapped in an Optional.\r\n * Returns an empty Optional if the index is out of bounds (negative or >= array length).\r\n * @param arr - The array to get the element from\r\n * @param index - The index of the element to retrieve\r\n * @returns An Optional containing the element at the index, or empty if index is out of bounds\r\n */\r\nexport function arrayGet<T>( arr: TReadableArray<T>, index: number ) {\r\n\tif ( index < 0 || index >= arr.length )\r\n\t\treturn Optional.empty<T>();\r\n\treturn Optional.of<T>( arr[ index ] );\r\n}\r\n", "\r\nexport function isTrue( x: unknown ): x is true {\r\n\treturn x === true;\r\n}\r\n\r\nexport function isFalse( x: unknown ): x is false {\r\n\treturn x === false;\r\n}\r\n", "import { isDefined, isFunction, repeat, type TProducer } from \"./_index.ts\";\r\nimport { type TKeysOfType } from \"./records.ts\";\r\n\r\nexport type TCssRuleDeclarationKey = TKeysOfType<CSSStyleDeclaration, string> & string;\r\nexport type TCssVariableDeclarationKey = `--${string}`;\r\nexport type TCssGenericDeclarationKey = TCssRuleDeclarationKey | TCssVariableDeclarationKey;\r\nexport type TCssDeclarationRulesDictionary = Partial<Record<TCssGenericDeclarationKey, string>>;\r\nexport type TCssSelectorDeclarationRulesDictionary = {\r\n\t[ selector: string ]: TCssDeclarationRulesDictionary | TCssSelectorDeclarationRulesDictionary;\r\n}\r\n\r\nconst newLine = '\\n', tabulation = '\\t', colon = ':', semiColon = ';', space = ' ', openBracket = '{', closeBracket = '}';\r\n\r\nexport function cssDeclarationRulesDictionaryToCss( syleDeclarationRulesForSelectorsProduceable: TProduceable<TCssSelectorDeclarationRulesDictionary>, indent = 0 ) {\r\n\tconst syleDeclarationRulesForSelectors = produceableToValue( syleDeclarationRulesForSelectorsProduceable );\r\n\treturn Object.entries( syleDeclarationRulesForSelectors ).map( ( [ selector, styleDeclarationRules ] ) => {\r\n\t\tconst cssRules = cssSelectorDeclarationRulesDictionaryToCss( styleDeclarationRules, indent + 1 );\r\n\t\tif ( !cssRules.length ) return null;\r\n\t\treturn repeat( tabulation, indent ) + selector + space + openBracket + newLine + cssRules.join( newLine ) + newLine + closeBracket;\r\n\t} ).filter( Boolean ).join( newLine + newLine );\r\n}\r\n\r\n/* exported for test purposes only */\r\nexport function cssSelectorDeclarationRulesDictionaryToCss( styleDeclarationRules: TCssDeclarationRulesDictionary | TCssSelectorDeclarationRulesDictionary, indent = 0 ): string[] {\r\n\treturn Object.entries( styleDeclarationRules ).map( ( [ key, value ]: [ string, string | TCssSelectorDeclarationRulesDictionary ] ) => {\r\n\t\tif ( typeof value === 'string' ) {\r\n\t\t\tif ( key.startsWith( '--' ) ) {\r\n\t\t\t\treturn repeat( tabulation, indent ) + key + colon + space + value + semiColon;\r\n\t\t\t} else {\r\n\t\t\t\treturn repeat( tabulation, indent ) + pascalCaseToKebabCase( key ) + colon + space + value + semiColon;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\treturn repeat( tabulation, indent ) + key + space + openBracket + newLine + cssSelectorDeclarationRulesDictionaryToCss( value, indent + 1 ).join( newLine ) + newLine + repeat( tabulation, indent ) + closeBracket;\r\n\t\t}\r\n\t} );\r\n}\r\n\r\nexport function transformCssDictionary(\r\n\tdict: TCssSelectorDeclarationRulesDictionary,\r\n\ttransformer: ( key: TCssGenericDeclarationKey, value: string ) => string,\r\n): TCssSelectorDeclarationRulesDictionary {\r\n\tconst recurse = ( dict: TCssSelectorDeclarationRulesDictionary | Partial<Record<TCssGenericDeclarationKey, string>> ) => {\r\n\t\tconst newDict: TCssSelectorDeclarationRulesDictionary | Partial<Record<TCssGenericDeclarationKey, string>> = {};\r\n\t\tfor ( const [ key, value ] of Object.entries( dict ) ) {\r\n\t\t\tif ( typeof value === 'string' ) {\r\n\t\t\t\tconst newValue = transformer( key as TCssGenericDeclarationKey, value );\r\n\t\t\t\tif ( isDefined( newValue ) ) {\r\n\t\t\t\t\tnewDict[ key ] = newValue;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnewDict[ key ] = transformCssDictionary( value, transformer );\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn newDict;\r\n\t};\r\n\r\n\treturn recurse( dict ) as TCssSelectorDeclarationRulesDictionary;\r\n}\r\n\r\nfunction pascalCaseToKebabCase( s: string ) {\r\n\treturn s.split( /([A-Z][a-z]*)/ ).filter( Boolean ).map( n => n.toLowerCase() ).join( '-' );\r\n}\r\n\r\ntype TProduceable<T> = T | TProducer<T>;\r\nfunction produceableToValue<T>( t: TProduceable<T> ): T {\r\n\treturn isFunction( t ) ? t() : t;\r\n}\r\n", "import { asError } from \"../errors.js\";\r\nimport { identity, type TFunction, type TTransformer } from \"../functions.js\";\r\nimport type { TAsyncOperationTuple, TOperationTuple } from \"../operations.js\";\r\n\r\nexport function withTryCatch<R>( fn: TFunction<void, R>, errMapFn: TTransformer<Error, Error> = identity ): TOperationTuple<R, Error> {\r\n\ttry {\r\n\t\treturn [ fn(), void 0 ] as const;\r\n\t} catch ( e: unknown ) {\r\n\t\treturn [ void 0, errMapFn( asError( e ) ) ] as const;\r\n\t}\r\n}\r\n\r\nexport async function withTryCatchAsync<R>( fn: TFunction<void, Promise<R>>, errMapFn: TTransformer<Error, Error> = identity ): TAsyncOperationTuple<R, Error> {\r\n\ttry {\r\n\t\treturn [ await fn(), void 0 ] as const;\r\n\t} catch ( e: unknown ) {\r\n\t\treturn [ void 0, errMapFn( asError( e ) ) ] as const;\r\n\t}\r\n}\r\n", "import { isNullOrUndefined } from './nulls.js';\r\n\r\nexport * from './errors/withTryCatch.js';\r\n\r\nexport function asError( e: unknown ): Error {\r\n\tif ( e === undefined || e === null )\r\n\t\treturn new Error( 'Void message' );\r\n\tif ( isError( e ) )\r\n\t\treturn e;\r\n\tif ( typeof e === 'string' )\r\n\t\treturn new Error( e );\r\n\tif ( e instanceof String )\r\n\t\treturn new Error( e.toString() );\r\n\treturn new Error( JSON.stringify( e ) );\r\n}\r\n\r\nexport function isError( e: unknown ): e is Error {\r\n\treturn e instanceof Error;\r\n}\r\n\r\nexport function getMessageFromError( error: Error ): string {\r\n\treturn `${error.name}: ${error.message}${getCauseMessageFromError( error )}`;\r\n}\r\n\r\nexport function getStackFromError( error: Error ): string {\r\n\tconst stack = error.stack && error.stack.includes( error.message ) ? error.stack : error.message + ' ' + ( error.stack ?? '' );\r\n\treturn `${error.name}: ${stack}${getCauseStackFromError( error )}`;\r\n}\r\n\r\nexport function getCauseMessageFromError( error: Error ) {\r\n\tif ( isNullOrUndefined( error.cause ) )\r\n\t\treturn '';\r\n\treturn `\\ncaused by: ${getMessageFromError( asError( error.cause ) )}`\r\n}\r\n\r\nexport function getCauseStackFromError( error: Error ) {\r\n\tif ( isNullOrUndefined( error.cause ) )\r\n\t\treturn '';\r\n\treturn `\\ncaused by: ${getStackFromError( asError( error.cause ) )}`\r\n}\r\n\r\n/**\r\n * Throws an error if a switch discriminated union type does not cover all the expected cases. \r\n * Expected usage: `\r\n * switch ( x.type ) { \r\n * case \"x\": return doX();\r\n * case \"y\": return doY();\r\n * ...\r\n * default: throw new NonExhaustiveSwitchError( x satisfies never );\r\n * }`\r\n */\r\nexport class NonExhaustiveSwitchError extends Error {\r\n\r\n\tconstructor( value: unknown ) {\r\n\t\tsuper( \"Expected switch to be exhaustive, got: \" + value );\r\n\t}\r\n\r\n}\r\n", "import { withTryCatch } from \"./errors.js\";\r\n\r\nexport type TJsonPrimitive = string | number | boolean | null | undefined;\r\nexport type TJsonArray = Array<TJsonSerializable> | ReadonlyArray<TJsonSerializable>;\r\nexport type TJsonObject = { [ key: string ]: TJsonSerializable }\r\nexport type TJsonSerializable = TJsonPrimitive | TJsonArray | TJsonObject;\r\n\r\nexport function tryToParseJson<T extends TJsonSerializable>( jsonContent: string ): [ T, undefined ] | [ undefined, Error ] {\r\n\treturn withTryCatch( () => parseJson<T>( jsonContent ) );\r\n}\r\n\r\nexport function parseJson<T extends TJsonSerializable>( jsonContent: string ): T {\r\n\treturn JSON.parse( jsonContent ) as T;\r\n}\r\n\r\nexport function stringifyJson( jsonSerializable: TJsonSerializable, minify = false ): string {\r\n\treturn JSON.stringify( jsonSerializable, undefined, minify ? undefined : 2 );\r\n}\r\n\r\nexport function jsonCloneDeep<A extends TJsonSerializable>( a: A ): A {\r\n\r\n\t// Handle the 3 simple types, and null or undefined\r\n\tif ( null === a || \"object\" !== typeof a ) return a;\r\n\r\n\tif ( a instanceof Date ) {\r\n\t\t// Handle Date\r\n\t\treturn new Date( a.getTime() ) as unknown as A;\r\n\t} else if ( a instanceof Array ) {\r\n\t\t// Handle Array\r\n\t\tconst copy = [] as unknown[];\r\n\t\tfor ( let i = 0, len = a.length; i < len; i++ ) {\r\n\t\t\tcopy[ i ] = jsonCloneDeep( a[ i ] );\r\n\t\t}\r\n\t\treturn copy as A;\r\n\t} else if ( a instanceof Object ) {\r\n\t\t// Handle Object\r\n\t\tconst copy = {} as Record<string | number | symbol, unknown>;\r\n\t\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\r\n\t\tfor ( let attr in ( a as TJsonObject ) ) {\r\n\t\t\tif ( a.hasOwnProperty( attr ) )\r\n\t\t\t\tcopy[ attr ] = jsonCloneDeep( a[ attr ] );\r\n\t\t}\r\n\t\treturn copy as A;\r\n\t}\r\n\r\n\tthrow new Error( \"Unable to copy obj! Its type isn't supported.\" );\r\n\r\n}\r\n\r\nexport function omitFromJsonObject<T extends TJsonObject, K extends keyof T>( o: T, ...keys: K[] ): Omit<T, K> {\r\n\treturn keys.reduce( ( obj, key ) => {\r\n\t\tdelete obj[ key ];\r\n\t\treturn obj;\r\n\t}, { ...o } );\r\n}\r\n", "\r\ntype TRoundMode = 'toNearest' | 'toLower' | 'toUpper' | 'towardsZero' | 'awayFromZero';\r\ntype TIntegerNumber = number;\r\n\r\nconst roundModes: Record<TRoundMode, ( n: number ) => TIntegerNumber> = {\r\n\t'toNearest': Math.round,\r\n\t'toLower': Math.floor,\r\n\t'toUpper': Math.ceil,\r\n\t'towardsZero': n => n > 0 ? Math.floor( n ) : Math.ceil( n ),\r\n\t'awayFromZero': n => n > 0 ? Math.ceil( n ) : Math.floor( n ),\r\n};\r\n\r\nexport function round( n: number, precision: number = 0, mode: TRoundMode = 'toNearest' ) {\r\n\tconst base = 10;\r\n\tconst power = Math.pow( base, precision );\r\n\treturn roundModes[ mode ]( n * power ) / power;\r\n}\r\n\r\nexport default round;\r\nexport const roundToNearest = ( n: number, precision: number = 0 ) => round( n, precision, 'toNearest' );\r\nexport const roundToLower = ( n: number, precision: number = 0 ) => round( n, precision, 'toLower' );\r\nexport const roundToUpper = ( n: number, precision: number = 0 ) => round( n, precision, 'toUpper' );\r\nexport const roundTowardsZero = ( n: number, precision: number = 0 ) => round( n, precision, 'towardsZero' );\r\nexport const roundAwayFromZero = ( n: number, precision: number = 0 ) => round( n, precision, 'awayFromZero' );\r\n\r\n", "\r\nimport { withTryCatch } from \"./errors.js\";\r\nimport type { TFunction } from \"./functions.js\";\r\nimport { ensureDefined } from \"./nulls.js\";\r\n\r\nexport * from './numbers/round.js';\r\n\r\nexport type TNumericString = `${number}`;\r\nexport type TNumericFloatingPointString = `${number}.${number}`;\r\nexport type TPositiveNumber = number; // Only used for semantics. Cannot do better typechecking at the moment.\r\nexport type TNegativeNumber = number; // Only used for semantics. Cannot do better typechecking at the moment.\r\n\r\nexport type TZero = 0;\r\nexport type TDigit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\r\nexport type TDigit1_9 = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\r\nexport type TNumber0_100 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100;\r\nexport type TNumber0_1000 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |\r\n\t100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 |\r\n\t200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 |\r\n\t300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 |\r\n\t400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 |\r\n\t500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 |\r\n\t600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 |\r\n\t700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 |\r\n\t800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 |\r\n\t900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999\r\nexport type TNumber0_5 = 0 | 1 | 2 | 3 | 4 | 5;\r\nexport type TNumber0_10 = TNumber0_5 | 6 | 7 | 8 | 9 | 10;\r\nexport type TNumber0_15 = TNumber0_10 | 11 | 12 | 13 | 14 | 15;\r\nexport type TNumber0_20 = TNumber0_15 | 16 | 17 | 18 | 19 | 20;\r\nexport type TNumber1_10 = Exclude<TNumber0_10, 0>;\r\n\r\nexport type TParseInt<T> = T extends `${infer N extends number}` ? N : never;\r\nexport type TParseableInt<T> = T extends `${number}` ? T : never;\r\n\r\nexport function ensurePositiveNumber( v: number, name = 'value' ): number {\r\n\tif ( v !== undefined && v !== null && v > 0 )\r\n\t\treturn v;\r\n\tthrow new Error( `Expected ${name} to be positive, got: ${v}` );\r\n}\r\nexport function ensureNonNegativeNumber( v: number, name = 'value' ): number {\r\n\tif ( v !== undefined && v !== null && v >= 0 )\r\n\t\treturn v;\r\n\tthrow new Error( `Expected ${name} to be non-negative, got: ${v}` );\r\n}\r\nexport function ensureNonPositiveNumber( v: number, name = 'value' ): number {\r\n\tif ( v !== undefined && v !== null && v <= 0 )\r\n\t\treturn v;\r\n\tthrow new Error( `Expected ${name} to be non-positive, got: ${v}` );\r\n}\r\nexport function ensureNegativeNumber( v: number, name = 'value' ): number {\r\n\tif ( v !== undefined && v !== null && v < 0 )\r\n\t\treturn v;\r\n\tthrow new Error( `Expected ${name} to be negative, got: ${v}` );\r\n}\r\n\r\nexport function incrementBy( n: number ): TFunction<number, number> {\r\n\treturn ( v ) => v + n;\r\n}\r\nexport function multiplyBy( n: number ): TFunction<number, number> {\r\n\treturn ( v ) => v * n;\r\n}\r\nexport function divideBy( n: number ): TFunction<number, number> {\r\n\treturn ( v ) => v / n;\r\n}\r\nexport const increment = incrementBy( 1 );\r\nexport const decrement = incrementBy( -1 );\r\nexport const decrementBy = ( n: number ) => incrementBy( -n );\r\n\r\nexport function isNumber( v: unknown ): v is number {\r\n\treturn typeof v === \"number\";\r\n}\r\n\r\nexport function isPositiveNumber( v: number ): v is TPositiveNumber {\r\n\treturn v > 0;\r\n}\r\n\r\nexport function isNegativeNumber( v: number ): v is TNegativeNumber {\r\n\treturn v < 0;\r\n}\r\n\r\nexport function isZero( v: number ): v is TZero {\r\n\treturn v === 0;\r\n}\r\n\r\nexport function clamp( n: number, min: number, max: number ): number {\r\n\tif ( min === null || max === null || n === null || isNaN( min ) || isNaN( max ) || isNaN( n ) || min > max )\r\n\t\tthrow new Error();\r\n\tif ( n > max ) {\r\n\t\treturn max;\r\n\t} else if ( n < min ) {\r\n\t\treturn min;\r\n\t} else {\r\n\t\treturn n;\r\n\t}\r\n}\r\nexport function clampInt0_100( n: number ) {\r\n\treturn clamp( Math.round( n ), 0, 100 ) as TNumber0_100;\r\n}\r\n\r\nexport function tryToParseNumber( numberStr: string ) {\r\n\treturn withTryCatch( () => {\r\n\t\tconst type = typeof ensureDefined( numberStr );\r\n\t\tif ( type !== \"string\" ) throw new Error( 'Invalid number given: ' + numberStr );\r\n\t\tif ( numberStr.trim().length === 0 ) throw new Error( 'Invalid number given: ' + numberStr );\r\n\t\tconst num = Number( numberStr );\r\n\t\tif ( isNaN( num ) ) throw new Error( 'Invalid number given: ' + numberStr );\r\n\t\treturn num;\r\n\t} );\r\n}\r\n", "\r\nexport type TOperation<T, E = Error> = {\r\n\tsuccess: false;\r\n\terror: E;\r\n} | {\r\n\tsuccess: true;\r\n\tdata: T;\r\n};\r\n\r\nexport type TAsyncOperation<T, E = Error> = Promise<TOperation<T, E>>;\r\n\r\nexport type TOperationTuple<T, E = Error> = [ T, undefined ] | [ undefined, E ];\r\n\r\nexport type TAsyncOperationTuple<T, E = Error> = Promise<TOperationTuple<T, E>>;\r\n\r\nexport type TValidation<T, E = Error> = {\r\n\tsuccess: false;\r\n\terrors: E[];\r\n} | {\r\n\tsuccess: true;\r\n\tdata: T;\r\n};\r\n\r\nexport type TAsyncValidation<T, E = Error> = Promise<TValidation<T, E>>;\r\n\r\nexport const Operation = {\r\n\tok: <const T>( data: T ) => {\r\n\t\treturn { success: true, data } as const satisfies TOperation<T, unknown>;\r\n\t},\r\n\tko: <const E>( error: E ) => {\r\n\t\treturn { success: false, error } as const satisfies TOperation<unknown, E>;\r\n\t},\r\n}\r\n", "import TimeDuration from \"../time/TimeDuration.js\";\r\nimport { TAsyncFunction, TFunction } from \"./functions.js\";\r\n\r\nexport type TPromisable<T> = T | Promise<T>;\r\n\r\nexport function asPromise<T>( promisable: TPromisable<T> ): Promise<T> {\r\n\treturn Promise.resolve( promisable );\r\n}\r\n\r\nexport function promiseSequence<R>( ...fns: TFunction<void, Promise<R>>[] ): TFunction<void, Promise<R[]>> {\r\n\tconst fn = async function (): Promise<R[]> {\r\n\t\tconst results: R[] = [];\r\n\t\tfor ( let i = 0; i < fns.length; i++ ) {\r\n\t\t\tresults[ i ] = await fns[ i ]();\r\n\t\t}\r\n\t\treturn results;\r\n\t};\r\n\treturn fn;\r\n}\r\n\r\nexport function delayPromise<T>( duration: TimeDuration ): TAsyncFunction<T, T> {\r\n\treturn ( result: T ) => duration.promise().then( () => result );\r\n}\r\n\r\ntype TAwaitAtMostOutput<T> = { status: 'ok', value: T } | { status: 'timeout', value?: never };\r\nexport class TimeoutError extends Error {}\r\n\r\nexport async function awaitAtMost<T>( promise: Promise<T>, duration: TimeDuration ): Promise<T> {\r\n\treturn Promise.race<TAwaitAtMostOutput<T>>( [\r\n\t\tpromise.then( value => ( { status: 'ok', value } ) ),\r\n\t\tduration.promise().then( () => ( { status: 'timeout' } ) )\r\n\t] ).then( ( { status, value } ) => {\r\n\t\tif ( status === 'ok' )\r\n\t\t\treturn value;\r\n\t\tthrow new TimeoutError( \"Time out reached while waiting for a promise to resolve.\" );\r\n\t} );\r\n}\r\n\r\nexport const NEVER = new Promise( _resolve => { /* never end */ } );\r\n", "import { TPositiveNumber } from \"./numbers.ts\";\r\n\r\nexport function randomNumberInInterval( min: number, max: number ): number {\r\n\treturn Math.floor( Math.random() * ( max - min + 1 ) + min );\r\n}\r\n\r\nexport const randomId = ( length: TPositiveNumber ): string => {\r\n\treturn Math.random().toString(36).substring(2, length + 2);\r\n}\r\n", "import { TFunction } from \"../_index\";\r\n\r\nexport function dictToEntries<V, K extends string = string>( obj: Record<K, V> ): [ K, V ][] {\r\n\treturn Object.entries( obj ) as [ K, V ][];\r\n}\r\n\r\nexport function entriesToDict<V, K extends string = string>( entries: [ K, V ][] ): Record<K, V> {\r\n\treturn Object.fromEntries( entries ) as Record<K, V>;\r\n}\r\n\r\nexport function entriesToEntries<K1 extends string, V1, K2 extends string, V2>( dict: Record<K1, V1>, mapper: TFunction<[ K1, V1 ], [ K2, V2 ]> ): Record<K2, V2> {\r\n\treturn entriesToDict( dictToEntries( dict ).map( ( entry ) => mapper( entry ) ) );\r\n}\r\n\r\n/** @deprecated[2025.08.01]: Compatibility layer. */\r\nexport const mapEntries = entriesToEntries;\r\n\r\nexport function entriesToList<K1 extends string, V1, R>( dict: Record<K1, V1>, mapper: TFunction<[ K1, V1 ], R> ): Array<R> {\r\n\treturn dictToEntries( dict ).map( ( entry ) => mapper( entry ) );\r\n}\r\n", "\r\nexport * from './records/entries.js';\r\n\r\nexport type TEmpty = Record<string, never>;\r\nexport type TKeysOfType<T, V> = { [ K in keyof T ]-?: T[ K ] extends V ? K : never }[ keyof T ];\r\n\r\nexport function dictToList<T>( obj: Record<string | number, T> ): T[] {\r\n\treturn Object.keys( obj ).map( key => obj[ key ] );\r\n}\r\n\r\nexport function pick<T extends object, K extends keyof T>( o: T, keys: K[] ): Pick<T, K> {\r\n\treturn keys.reduce( ( obj, key ) => {\r\n\t\tobj[ key ] = o[ key ];\r\n\t\treturn obj;\r\n\t}, {} as Pick<T, K> );\r\n}\r\n\r\nexport type TOptionsWithoutDefaults<T, R> = Partial<T> & Required<Omit<T, keyof R>>;\r\nexport type TOptionalKeysForType<T> = { [ K in keyof T ]-?: {} extends Pick<T, K> ? K : never }[ keyof T ];\r\nexport type TRequiredKeysForType<T> = Exclude<keyof T, TOptionalKeysForType<T>>;\r\nexport type TAllKeysOptional<T> = TRequiredKeysForType<T> extends never ? true : false;\r\nexport type TConditionalParameter<T> = TAllKeysOptional<T> extends true ? T | undefined : T;\r\nexport type TConditionalParameterOptions<T, R> = TConditionalParameter<TOptionsWithoutDefaults<T, R>>;\r\n\r\n/**\r\n * Given a type T, replaces all fields of type From to fields of type To.\r\n */\r\nexport type TReplaceType<T, From, To> = { [ K in keyof T ]: T[ K ] extends From ? To : T[ K ]; };\r\n\r\n/**\r\n * Given a type T, make field K required instead of optional.\r\n */\r\nexport type TWithRequiredProperty<T, K extends keyof T> = T & {\r\n\t[ Property in K ]-?: T[ Property ];\r\n};\r\n\r\n/**\r\n * Given a type T, make all fields required instead of optional.\r\n */\r\nexport type TWithRequiredProperties<T> = Required<T>;\r\n\r\n/**\r\n * Type that forces a record to contain a few properties, but allows for extraneous properties.\r\n */\r\nexport type TWithExtras<R extends Record<any, any>, T extends Record<any, any> = Record<string, unknown>> = R & T;\r\n\r\n/**\r\n * Types that improves the human readability of a Typescript type.\r\n */\r\nexport type TPrettify<T> = { [ K in keyof T ]: T[ K ]; } & {};\r\n\r\nexport function shallowRecordEquals( a: Record<string, unknown>, b: Record<string, unknown> ): boolean {\r\n\tif ( a === b ) return true;\r\n\tconst aKeys = Object.keys( a ), bKeys = Object.keys( b );\r\n\tif ( aKeys.length !== bKeys.length ) return false;\r\n\tfor ( const key of aKeys ) {\r\n\t\tif ( a[ key ] !== b[ key ] ) return false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\n/**\r\n * A utility type that checks if any property in a record type `T` has the `never` type.\r\n * This type evaluates to `true` if at least one property in `T` is of type `never`, and `false` otherwise.\r\n * It's commonly used to create compile-time assertions that prevent unintended changes where properties might accidentally become `never` due to type mismatches.\r\n *\r\n * @example Advanced usage for type guards\r\n * ```typescript\r\n * type TMap = { a: string; b: number; c: boolean };\r\n * type TJsonSerializable = string | number | boolean;\r\n *\r\n * type TFiltered = {\r\n * [K in keyof TMap]: TMap[K] extends TJsonSerializable ? TMap[K] : never;\r\n * };\r\n *\r\n * // If TMap changes and some property becomes not serializable, TFiltered will have 'never' values\r\n * const _guard: THasNever<TFiltered> = false; // Compile error if any property became 'never'\r\n * ```\r\n */\r\nexport type THasNever<T> = { [ K in keyof T ]: [ T[ K ] ] extends [ never ] ? true : false }[ keyof T ] extends false ? false : true;\r\n", "import { TReadableArray } from \"../arrays.js\";\r\nimport { TMaybe } from \"../nulls.js\";\r\nimport { capitalizeWord } from \"../strings.js\";\r\n\r\nexport class StringParts {\r\n\r\n\tprivate readonly _parts: string[];\r\n\r\n\tprivate constructor( ...parts: string[] ) {\r\n\t\tthis._parts = parts;\r\n\t}\r\n\r\n\tpublic toUpperCase() {\r\n\t\treturn new StringParts( ...this.parts.map( part => part.toUpperCase() ) );\r\n\t}\r\n\r\n\tpublic toLowerCase() {\r\n\t\treturn new StringParts( ...this.parts.map( part => part.toLowerCase() ) );\r\n\t}\r\n\r\n\tpublic capitalizeFirst() {\r\n\t\tif ( !this.length ) return this;\r\n\t\treturn new StringParts( capitalizeWord( this.first! ), ...this.tail.map( part => part.toLowerCase() ) );\r\n\t}\r\n\r\n\tpublic capitalizeEach() {\r\n\t\treturn new StringParts( ...this.parts.map( part => capitalizeWord( part ) ) );\r\n\t}\r\n\r\n\tpublic get parts() {\r\n\t\treturn this._parts;\r\n\t}\r\n\r\n\tpublic get tail() {\r\n\t\tconst [ _first, ...tail ] = this.parts;\r\n\t\treturn tail;\r\n\t}\r\n\r\n\tpublic get first(): TMaybe<string> {\r\n\t\treturn this._parts[ 0 ] ?? null;\r\n\t}\r\n\r\n\tpublic get last(): TMaybe<string> {\r\n\t\treturn this._parts[ this.length - 1 ] ?? null;\r\n\t}\r\n\r\n\tpublic get length() {\r\n\t\treturn this._parts.length;\r\n\t}\r\n\r\n\tpublic trim() {\r\n\t\treturn new StringParts( ...this.parts.map( part => part.trim() ) );\r\n\t}\r\n\r\n\tpublic toSnakeCase() {\r\n\t\treturn this.toLowerCase().join( '_' );\r\n\t}\r\n\r\n\tpublic toCamelCase() {\r\n\t\tif ( !this.length ) return '';\r\n\t\treturn [ this.first!.toLowerCase(), ...this.tail.map( capitalizeWord ) ].join( '' );\r\n\t}\r\n\r\n\tpublic toKebabCase() {\r\n\t\treturn this.toLowerCase().join( '-' );\r\n\t}\r\n\r\n\tpublic toPascalCase() {\r\n\t\treturn this.capitalizeEach().join( '' );\r\n\t}\r\n\r\n\tpublic toHumanCase() {\r\n\t\treturn this.capitalizeFirst().join( ' ' );\r\n\t}\r\n\r\n\tpublic join( separator: string ) {\r\n\t\treturn this.parts.join( separator );\r\n\t}\r\n\r\n\tpublic mergeWith( { parts: otherParts }: { parts: TReadableArray<string>; } ) {\r\n\t\treturn new StringParts( ...this.parts, ...otherParts );\r\n\t}\r\n\r\n\tpublic slice( start: number, end?: number ) {\r\n\t\treturn new StringParts( ...this.parts.slice( start, end ) );\r\n\t}\r\n\r\n\tpublic splice( start: number, deleteCount: number, ...items: string[] ) {\r\n\t\treturn new StringParts( ...this.parts.splice( start, deleteCount, ...items ) );\r\n\t}\r\n\r\n\tpublic push( part: string ) {\r\n\t\treturn new StringParts( ...this.parts, part );\r\n\t}\r\n\r\n\tpublic shift( part: string ) {\r\n\t\treturn new StringParts( part, ...this.parts );\r\n\t}\r\n\r\n\tpublic reverse() {\r\n\t\treturn new StringParts( ...this.parts.reverse() );\r\n\t}\r\n\r\n\tpublic static fromString = ( s: string, separator: string | RegExp = /\\s+/g ) => {\r\n\t\tif ( s === null || separator === null )\r\n\t\t\tthrow new Error( 'Invalid arguments' );\r\n\t\treturn new StringParts( ...s.split( separator ) );\r\n\t};\r\n\r\n\tpublic static fromParts = ( ...parts: string[] ) => {\r\n\t\treturn new StringParts( ...parts );\r\n\t};\r\n\r\n\t/**\r\n\t * Tries to convert a word in PascalCase to an array of words. Will not work if there are spaces or special characters. Does not cope well on uppercase abbreviations (eg, \"CSS\").\r\n\t * @param s a string in PascalCase. \r\n\t * @returns a StringParts where each sub-word in PascalCase is now a part.\r\n\t */\r\n\tpublic static tryToParsePascalCaseWord( s: string ): StringParts {\r\n\t\treturn new StringParts( ...s.split( /([A-Z][a-z]*)/ ).filter( Boolean ).map( n => n.toLowerCase() ) );\r\n\t}\r\n\r\n}\r\n\r\n\r\n", "import { range } from \"./arrays.js\";\r\nimport { ensureDefined, isDefined, isNullOrUndefined, TMaybe } from \"./nulls.js\";\r\n\r\nexport * from './strings/StringParts.js';\r\n\r\n// Semantic-only\r\nexport type THtmlString = string;\r\nexport type TUrl = string;\r\nexport type TRelativeUrl = string;\r\n\r\nexport function hashCode( str: string ): number {\r\n\tlet hash = 0\r\n\tfor ( let i = 0; i < str.length; ++i )\r\n\t\thash = Math.imul( 31, hash ) + str.charCodeAt( i )\r\n\treturn hash | 0\r\n}\r\n\r\nexport function repeat( char: string, times: number ): string {\r\n\treturn times > 0 ? range( 0, times - 1 ).map( _ => char ).join( '' ) : '';\r\n}\r\n\r\nexport function capitalizeWord( word: string ): string {\r\n\treturn word[ 0 ].toUpperCase() + word.substring( 1 ).toLowerCase();\r\n}\r\n\r\nexport function splitWords( text: string, regEx: RegExp = /\\s+/ ): string[] {\r\n\treturn text.split( regEx ).filter( t => t.length > 0 );\r\n}\r\n\r\nexport function stringToNumber( s: string | null | undefined ): number | null {\r\n\tif ( isNullOrUndefined( s ) )\r\n\t\treturn null;\r\n\treturn Number( s );\r\n}\r\n\r\nexport function pad( str: string, n: number, char: string, where: 'left' | 'right' = 'left' ): string {\r\n\tconst length = ensureDefined( str ).length;\r\n\tif ( length >= ensureDefined( n ) ) return str;\r\n\r\n\tif ( ensureDefined( char ).length !== 1 )\r\n\t\tthrow new Error( 'Illegal pad character' );\r\n\tconst padding = repeat( char, n - length );\r\n\treturn ( where === 'left' ? padding : '' ) + str + ( where === 'right' ? padding : '' );\r\n}\r\n\r\nexport function padLeft( str: string, n: number, char: string ): string {\r\n\treturn pad( str, n, char, 'left' );\r\n}\r\n\r\nexport function padRight( str: string, n: number, char: string ): string {\r\n\treturn pad( str, n, char, 'right' );\r\n}\r\n\r\nexport function ellipsis( str: string, maxLength: number ): string {\r\n\tif ( maxLength < 4 ) \r\n\t\tthrow new Error( 'Invalid argument maxLength' );\r\n\tif ( str.length <= maxLength ) {\r\n\t\treturn str;\r\n\t} else {\r\n\t\treturn str.substring( 0, maxLength - 3 ) + '...';\r\n\t}\r\n}\r\n\r\nexport function pluralize( n: number, singular: string, plural?: string ): string {\r\n\r\n\tif ( !singular || !singular.length )\r\n\t\tthrow new Error();\r\n\tif ( n === 1 )\r\n\t\treturn singular;\r\n\r\n\tplural = plural ?? singular + 's';\r\n\r\n\tconst firstUppercase = singular.charAt( 0 ) === singular.charAt( 0 ).toUpperCase();\r\n\tif ( firstUppercase ) {\r\n\t\tconst PLURAL = plural.toUpperCase();\r\n\t\tconst isAllUppercase = plural === PLURAL;\r\n\t\tplural = isAllUppercase ? PLURAL : plural.charAt( 0 ).toUpperCase() + plural.slice( 1 ).toLowerCase();\r\n\t}\r\n\r\n\treturn plural;\r\n\r\n}\r\n\r\nexport function isString( source: unknown ): source is string {\r\n\treturn isDefined( source ) && typeof source === \"string\";\r\n}\r\n\r\nexport function isEmpty( source: string ): boolean {\r\n\treturn source.trim().length === 0;\r\n}\r\n\r\nexport function isNullOrUndefinedOrEmpty( source: TMaybe<string> ): boolean {\r\n\treturn isNullOrUndefined( source ) || isEmpty( source );\r\n}\r\n\r\n\r\nexport function wrapWithString( str: string, delimiter: string ): string;\r\nexport function wrapWithString( str: string, start: string, end: string ): string;\r\nexport function wrapWithString( str: string, start: string, end = start ): string {\r\n\tif ( isNullOrUndefinedOrEmpty( str ) )\r\n\t\tthrow new Error( `Expected string to be non-empty, got: \"${str}\"` );\r\n\tif ( isNullOrUndefinedOrEmpty( start ) )\r\n\t\tthrow new Error( `Expected start delimiter to be non-empty, got: \"${start}\"` );\r\n\tif ( isNullOrUndefinedOrEmpty( end ) )\r\n\t\tthrow new Error( `Expected end delimiter to be non-empty, got: \"${end}\"` );\r\n\treturn start + str + end;\r\n}\r\n", "\nimport { ensureDefined } from \"../utils/_index\";\n\n/**\n * Class that stores a value that is computationally/memory intensive to initialize.\n * The initialization of the value is done once and only if required (lazy initialization).\n * @author gtomberli\n */\nexport class Lazy<T> {\n\n\tprivate _value: T | undefined = undefined;\n\tprivate _initialized: boolean = false;\n\tprivate _generator: () => T;\n\n\tprivate constructor( generator: () => T ) {\n\t\tthis._generator = ensureDefined( generator );\n\t}\n\n\tpublic get value(): T | undefined {\n\t\treturn this._value;\n\t}\n\n\tpublic getOrCreate(): T {\n\t\tif ( !this._initialized ) {\n\t\t\tthis._value = this._generator();\n\t\t\tthis._initialized = true;\n\t\t}\n\t\treturn this._value!;\n\t}\n\n\tpublic getOrThrow( errorMessage?: \"Value not initialized\" ): T {\n\t\tif ( !this._initialized )\n\t\t\tthrow new Error( errorMessage );\n\t\treturn this._value!;\n\t}\n\n\tpublic or( t: T ): T {\n\t\tif ( !this._initialized ) {\n\t\t\treturn t;\n\t\t} else {\n\t\t\treturn this._value!;\n\t\t}\n\t}\n\n\tpublic isPresent() {\n\t\treturn this._initialized;\n\t}\n\n\tpublic isEmpty() {\n\t\treturn !this._initialized;\n\t}\n\n\tpublic ifPresent( fn: (t: T) => void ): void {\n\t\tif ( this.isPresent() ) {\n\t\t\tfn( this._value! );\n\t\t}\n\t}\n\n\tpublic ifEmpty( fn: () => void ): void {\n\t\tif ( this.isEmpty() ) {\n\t\t\tfn();\n\t\t}\n\t}\n\n\tpublic apply( fnPresent: (t: T) => void, fnEmpty: () => void ): void {\n\t\tif ( this.isPresent() ) {\n\t\t\tfnPresent( this._value! );\n\t\t} else {\n\t\t\tfnEmpty( );\n\t\t}\n\t}\n\n\tpublic static of<T>( generator: () => T ): Lazy<T> {\n\t\treturn new Lazy( generator );\n\t}\n\n}\n\nexport default Lazy;\n", "import { ensureDefined } from \"../utils/nulls.js\";\r\n\r\nexport class LazyAsync<T> {\r\n\r\n\tprivate _promise: Promise<T> | undefined = undefined;\r\n\tprivate _pending: boolean = false;\r\n\tprivate _resolvedValue: T | undefined = undefined;\r\n\tprivate _error: Error | undefined = undefined;\r\n\tprivate _generator: () => Promise<T>;\r\n\r\n\tprivate constructor( generator: () => Promise<T> ) {\r\n\t\tthis._generator = ensureDefined( generator );\r\n\t}\r\n\r\n\tpublic getOrCreate(): Promise<T> {\r\n\t\tif ( this.isEmpty() ) {\r\n\t\t\tthis._pending = true;\r\n\t\t\tthis._promise = this._generator();\r\n\t\t\tthis._promise.then( value => {\r\n\t\t\t\tthis._pending = false;\r\n\t\t\t\tthis._resolvedValue = value;\r\n\t\t\t}, err => {\r\n\t\t\t\tthis._pending = false;\r\n\t\t\t\tthis._error = err;\r\n\t\t\t} );\r\n\t\t}\r\n\t\treturn this._promise as Promise<T>;\r\n\t}\r\n\r\n\tpublic isPresent() {\r\n\t\treturn this._promise !== undefined;\r\n\t}\r\n\r\n\tpublic isEmpty() {\r\n\t\treturn this._promise === undefined;\r\n\t}\r\n\r\n\tpublic isPending() {\r\n\t\treturn this.isPresent() && this._pending === true;\r\n\t}\r\n\r\n\tpublic isReady() {\r\n\t\treturn this.isPresent() && this._pending === false;\r\n\t}\r\n\r\n\tpublic isResolved() {\r\n\t\treturn this.isReady() && this._error === undefined;\r\n\t}\r\n\t\r\n\tpublic isError() {\r\n\t\treturn this.isReady() && this._error !== undefined;\r\n\t}\r\n\r\n\tpublic ifPresent( fn: ( t: Promise<T> ) => void ): void {\r\n\t\tif ( this.isPresent() ) {\r\n\t\t\tfn( this._promise! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifEmpty( fn: () => void ): void {\r\n\t\tif ( this.isEmpty() ) {\r\n\t\t\tfn();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifPending( fn: ( t: Promise<T> ) => void ): void {\r\n\t\tif ( this.isPending() ) {\r\n\t\t\tfn( this._promise! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifReady( fn: ( t: Promise<T> ) => void ): void {\r\n\t\tif ( this.isReady() ) {\r\n\t\t\tfn( this._promise! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifResolved( fn: ( t: T ) => void ): void {\r\n\t\tif ( this.isResolved() ) {\r\n\t\t\tfn( this._resolvedValue! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic ifError( fn: ( err: Error ) => void ): void {\r\n\t\tif ( this.isError() ) {\r\n\t\t\tfn( this._error! );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getOrThrow( errorMessage?: \"Value not initialized\" ): Promise<T> | never {\r\n\t\tif ( !this._promise )\r\n\t\t\tthrow new Error( errorMessage );\r\n\t\treturn this._promise;\r\n\t}\r\n\r\n\tpublic static of<T>( generator: () => Promise<T> ): LazyAsync<T> {\r\n\t\treturn new LazyAsync( generator );\r\n\t}\r\n\r\n}\r\n\r\nexport default LazyAsync;\r\n", "import type { TFunction } from \"../utils/_index.ts\";\r\n\r\nexport class LazyDictionary<K extends string | number | symbol, T> {\r\n\r\n\tprivate readonly _dictionary: Partial<Record<K, T>> = {};\r\n\r\n\tprivate constructor(\r\n\t\tprivate readonly _generator: TFunction<K, T>\r\n\t) { }\r\n\r\n\tpublic static of<K extends string | number | symbol, T>( generator: TFunction<K, T> ) {\r\n\t\treturn new LazyDictionary<K, T>( generator );\r\n\t}\r\n\r\n\tpublic getOrCreate( key: K ): T {\r\n\t\tif ( key in this._dictionary ) {\r\n\t\t\treturn this._dictionary[ key ] as T;\r\n\t\t}\r\n\r\n\t\tconst value = this._generator( key );\r\n\t\tthis._dictionary[ key ] = value;\r\n\r\n\t\treturn value;\r\n\t}\r\n\r\n\tpublic getOrThrow( key: K , errorMessage?: \"Value not initialized\" ): T {\r\n\t\tif ( key in this._dictionary ) {\r\n\t\t\treturn this._dictionary[ key ] as T;\r\n\t\t}\r\n\t\tthrow new Error( errorMessage );\r\n\t}\r\n\r\n}\r\n", "\r\nexport class TimeUnit {\r\n\r\n\tprivate constructor(\r\n\t\tpublic readonly multiplier: number\r\n\t) { }\r\n\r\n\tpublic toUnit( value: number, unit: TimeUnit ): number {\r\n\t\treturn value * ( this.multiplier / unit.multiplier );\r\n\t}\r\n\r\n\tpublic toMs( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic toSeconds( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.SECONDS );\r\n\t}\r\n\r\n\tpublic toMinutes( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.MINUTES );\r\n\t}\r\n\r\n\tpublic toHours( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.HOURS );\r\n\t}\r\n\r\n\tpublic toDays( value: number ): number {\r\n\t\treturn this.toUnit( value, TimeUnit.DAYS );\r\n\t}\r\n\r\n\tpublic static readonly MILLISECONDS = new TimeUnit( 1 );\r\n\tpublic static readonly SECONDS = new TimeUnit( 1000 * TimeUnit.MILLISECONDS.multiplier );\r\n\tpublic static readonly MINUTES = new TimeUnit( 60 * TimeUnit.SECONDS.multiplier );\r\n\tpublic static readonly HOURS = new TimeUnit( 60 * TimeUnit.MINUTES.multiplier );\r\n\tpublic static readonly DAYS = new TimeUnit( 24 * TimeUnit.HOURS.multiplier );\r\n\r\n}\r\n", "import { TimeUnit } from \"./TimeUnit\";\r\n\r\nexport type TTimeInUnits = {\r\n\tmilliseconds: number;\r\n\tseconds: number;\r\n\tminutes: number;\r\n\thours: number;\r\n\tdays: number;\r\n}\r\n\r\nexport default abstract class TimeBase<T> {\r\n\r\n\tprivate readonly _ms: number;\r\n\r\n\tprotected constructor(\r\n\t\tvalue: number,\r\n\t\tunit: TimeUnit\r\n\t) {\r\n\t\tthis._ms = unit.toMs( value );\r\n\t}\r\n\r\n\tprotected abstract create( value: number, unit: TimeUnit ): T;\r\n\r\n\t/**\r\n\t * Total number of milliseconds, rounded down.\r\n\t */\r\n\tpublic get ms(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.MILLISECONDS.multiplier );\r\n\t}\r\n\r\n\t/**\r\n\t * Total number of seconds, rounded down.\r\n\t */\r\n\tpublic get seconds(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.SECONDS.multiplier );\r\n\t}\r\n\r\n\t/**\r\n\t * Total number of minutes, rounded down.\r\n\t */\r\n\tpublic get minutes(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.MINUTES.multiplier );\r\n\t}\r\n\r\n\t/**\r\n\t * Total number of hours, rounded down.\r\n\t */\r\n\tpublic get hours(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.HOURS.multiplier );\r\n\t}\r\n\r\n\t/**\r\n\t * Total number of days, rounded down.\r\n\t */\r\n\tpublic get days(): number {\r\n\t\treturn Math.floor( this._ms / TimeUnit.DAYS.multiplier );\r\n\t}\r\n\r\n\tpublic addMs( milliseconds: number ): T {\r\n\t\treturn this.addUnits( milliseconds, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic addSeconds( seconds: number ): T {\r\n\t\treturn this.addUnits( seconds, TimeUnit.SECONDS );\r\n\t}\r\n\r\n\tpublic addMinutes( minutes: number ): T {\r\n\t\treturn this.addUnits( minutes, TimeUnit.MINUTES );\r\n\t}\r\n\r\n\tpublic addHours( hours: number ): T {\r\n\t\treturn this.addUnits( hours, TimeUnit.HOURS );\r\n\t}\r\n\r\n\tpublic addDays( days: number ): T {\r\n\t\treturn this.addUnits( days, TimeUnit.DAYS );\r\n\t}\r\n\r\n\tpublic removeDays( days: number ): T {\r\n\t\treturn this.removeUnits( days, TimeUnit.DAYS );\r\n\t}\r\n\r\n\tpublic addUnits( n: number, unit: TimeUnit ): T {\r\n\t\treturn this.create( this._ms + unit.toMs( n ), TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic removeMs( milliseconds: number ): T {\r\n\t\treturn this.addUnits( -milliseconds, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic removeSeconds( seconds: number ): T {\r\n\t\treturn this.addUnits( -seconds, TimeUnit.SECONDS );\r\n\t}\r\n\r\n\tpublic removeMinutes( minutes: number ): T {\r\n\t\treturn this.addUnits( -minutes, TimeUnit.MINUTES );\r\n\t}\r\n\r\n\tpublic removeHours( hours: number ): T {\r\n\t\treturn this.addUnits( -hours, TimeUnit.HOURS );\r\n\t}\r\n\r\n\tpublic removeUnits( n: number, unit: TimeUnit ): T {\r\n\t\treturn this.addUnits( -n, unit );\r\n\t}\r\n\r\n\tpublic getUnit( unit: TimeUnit ): number {\r\n\t\treturn this._ms / unit.multiplier;\r\n\t}\r\n\r\n\tprotected toUnits(): TTimeInUnits {\r\n\t\treturn {\r\n\t\t\tmilliseconds: this.ms % TimeUnit.SECONDS.multiplier,\r\n\t\t\tseconds: Math.floor( this.seconds % 60 ),\r\n\t\t\tminutes: Math.floor( this.minutes % 60 ),\r\n\t\t\thours: Math.floor( this.hours % 24 ),\r\n\t\t\tdays: Math.floor( this.days ),\r\n\t\t};\r\n\t}\r\n\r\n\tprotected static unitsToMs( units: Partial<TTimeInUnits> ): number {\r\n\t\tif ( !units )\r\n\t\t\tthrow new Error( 'Invalid units given' );\r\n\t\tlet ms = 0\r\n\t\tms += ( units.milliseconds ?? 0 ) * TimeUnit.MILLISECONDS.multiplier;\r\n\t\tms += ( units.seconds ?? 0 ) * TimeUnit.SECONDS.multiplier;\r\n\t\tms += ( units.minutes ?? 0 ) * TimeUnit.MINUTES.multiplier;\r\n\t\tms += ( units.hours ?? 0 ) * TimeUnit.HOURS.multiplier;\r\n\t\tms += ( units.days ?? 0 ) * TimeUnit.DAYS.multiplier;\r\n\t\treturn ms;\r\n\t}\r\n\r\n\tpublic toJSON() {\r\n\t\treturn this._ms;\r\n\t}\r\n\r\n}\r\n", "import Deferred, { DeferredCanceledError, ICancelable, ICancelablePromise } from \"../async/Deferred.js\";\r\nimport { TComparisonResult } from \"../sorting/_index.js\";\r\nimport { TIntervalHandle, TMaybe, TTimeoutHandle, ensureNonNegativeNumber, ensurePositiveNumber, pad } from \"../utils/_index.js\";\r\nimport TimeBase, { type TTimeInUnits } from \"./TimeBase\";\r\nimport TimeInstant from \"./TimeInstant\";\r\nimport { TimeUnit } from \"./TimeUnit\";\r\n\r\nexport class TimeDuration extends TimeBase<TimeDuration> {\r\n\r\n\tprotected constructor( value: number, unit: TimeUnit ) {\r\n\t\tsuper( value, unit );\r\n\t\tif ( value < 0 )\r\n\t\t\tthrow new Error( 'Duration cannot be less than 0' );\r\n\t}\r\n\r\n\tprotected create( value: number, unit: TimeUnit ) {\r\n\t\treturn new TimeDuration( value, unit );\r\n\t}\r\n\r\n\tpublic addDuration( duration: TimeDuration ): TimeDuration {\r\n\t\treturn this.addUnits( duration.ms, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic removeDuration( duration: TimeDuration ): TimeDuration {\r\n\t\treturn this.removeUnits( duration.ms, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic override removeUnits( n: number, unit: TimeUnit ): TimeDuration {\r\n\t\tconst nn = Math.min( n, this.getUnit( unit ) ); // Avoid going negative.\r\n\t\treturn super.removeUnits( nn, unit );\r\n\t}\r\n\r\n\tpublic multiplyBy( times: number ): TimeDuration {\r\n\t\tensureNonNegativeNumber( times, \"times\" );\r\n\t\treturn TimeDuration.ms( this.ms * times );\r\n\t}\r\n\r\n\tpublic divideBy( times: number ): TimeDuration {\r\n\t\tensurePositiveNumber( times, \"times\" );\r\n\t\treturn TimeDuration.ms( this.ms / times );\r\n\t}\r\n\r\n\t/**\r\n\t\t* Returns the current duration in a human readable format, prioritizing the most significant unit of time and excluding the rest.\r\n\t\t* @todo[2023-06] Should allow more customization options\r\n\t\t* @todo[2023-06] By default should show the secondary unit only when actually needed (eg, 1h 20m & 3h, instead of 1h 20m & 3h 28m)\r\n\t\t* @todo[2023-06] Should not allow negative durations, as this is a duration and not an instant.\r\n\t\t* @returns the duration, with only the most significant units displayed as a human readable string, eg: 1d 20h, 10m 30s.\r\n\t*/\r\n\tpublic get formatted(): string {\r\n\t\tconst format = ( x: number, u1: string, y: number, u2: string ): string => `${x}${u1} ${pad( y.toString(), 2, '0' )}${u2}`;\r\n\t\tconst units = this.toUnits();\r\n\r\n\t\tif ( units.days >= 1 ) return format( units.days, 'd', units.hours, 'h' );\r\n\t\telse if ( units.hours >= 1 )\r\n\t\t\treturn format( units.hours, 'h', units.minutes, 'm' );\r\n\t\telse if ( units.minutes >= 1 )\r\n\t\t\treturn format( units.minutes, 'm', units.seconds, 's' );\r\n\t\telse if ( units.seconds >= 0 )\r\n\t\t\treturn units.seconds.toString() + 's';\r\n\t\telse if ( units.seconds > -60 )\r\n\t\t\treturn 'A few moments ago';\r\n\t\telse\r\n\t\t\treturn 'Some time ago';\r\n\t}\r\n\r\n\tpublic interval( cb: () => unknown ): TIntervalHandle {\r\n\t\treturn setInterval( cb, this.ms );\r\n\t}\r\n\r\n\tpublic timeout( cb: () => unknown ): TTimeoutHandle {\r\n\t\treturn setTimeout( cb, this.ms );\r\n\t}\r\n\r\n\tpublic cancelablePromise(): ICancelablePromise<void> {\r\n\t\tconst deferred = new Deferred<void>;\r\n\t\tif ( this.ms > 0 ) {\r\n\t\t\tthis.timeout( () => deferred.resolve() );\r\n\t\t} else {\r\n\t\t\tdeferred.resolve();\r\n\t\t}\r\n\t\treturn deferred.asCancelablePromise();\r\n\t}\r\n\r\n\tpublic promise(): Promise<void> {\r\n\t\tif ( this.isEmpty() )\r\n\t\t\treturn Promise.resolve();\r\n\r\n\t\tconst deferred = new Deferred<void>;\r\n\t\tthis.timeout( () => deferred.resolve() );\r\n\t\treturn deferred.asPromise();\r\n\t}\r\n\r\n\tpublic delay( cb: () => unknown ): void {\r\n\t\tvoid this.promise().then( () => cb() );\r\n\t}\r\n\r\n\tpublic cancelableDelay( cb: () => unknown ): ICancelable {\r\n\t\tconst deferred = this.cancelablePromise();\r\n\t\tvoid deferred.then( () => {\r\n\t\t\tcb();\r\n\t\t}, err => {\r\n\t\t\tif ( err instanceof DeferredCanceledError )\r\n\t\t\t\treturn; // Do nothing on cancelation\r\n\t\t\tthrow err;\r\n\t\t} );\r\n\t\treturn { cancel: () => deferred.cancel() };\r\n\t}\r\n\r\n\tpublic debounce<T>( fn: ( t: T ) => void ) {\r\n\t\tlet handle: TMaybe<TTimeoutHandle> = null;\r\n\t\treturn ( t: T ) => {\r\n\t\t\tif ( handle )\r\n\t\t\t\tclearTimeout( handle );\r\n\t\t\thandle = this.timeout( () => {\r\n\t\t\t\thandle = null;\r\n\t\t\t\tfn( t );\r\n\t\t\t} );\r\n\t\t}\r\n\t}\r\n\r\n\tpublic toDigitalClock(): string {\r\n\t\tconst units = this.toUnits();\r\n\t\t// data.hours += data.days * 24; // roll over days as hours.\r\n\t\treturn pad( units.hours.toString(), 2, '0' ) + ':' + pad( units.minutes.toString(), 2, '0' ) + ':' + pad( units.seconds.toString(), 2, '0' );\r\n\t}\r\n\r\n\tpublic get asSeconds(): string {\r\n\t\tif ( this.ms < 0 )\r\n\t\t\treturn \"0\";\r\n\t\tif ( this.ms < 1000 )\r\n\t\t\treturn ( this.ms / 1000 ).toFixed( 1 );\r\n\t\treturn Math.floor( this.seconds ).toString();\r\n\t}\r\n\r\n\tpublic fromNow(): TimeInstant {\r\n\t\treturn TimeInstant.now().addDuration( this );\r\n\t}\r\n\r\n\tpublic differenceFrom( other: TimeDuration ): TimeDuration {\r\n\t\treturn new TimeDuration( Math.abs( this.ms - other.ms ), TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic isGreaterThan( other: TimeDuration ): boolean {\r\n\t\treturn this.ms > other.ms;\r\n\t}\r\n\r\n\tpublic isLessThan( other: TimeDuration ): boolean {\r\n\t\treturn this.ms < other.ms;\r\n\t}\r\n\r\n\tpublic compareTo( other: TimeDuration ): TComparisonResult {\r\n\t\tif ( this.ms === other.ms ) {\r\n\t\t\treturn 0;\r\n\t\t} else if ( this.isLessThan( other ) ) {\r\n\t\t\treturn -1;\r\n\t\t} else {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic atLeast( other: TimeDuration ): TimeDuration {\r\n\t\tif ( !this.isLessThan( other ) ) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\treturn other;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic atMost( other: TimeDuration ): TimeDuration {\r\n\t\tif ( !this.isGreaterThan( other ) ) {\r\n\t\t\treturn this;\r\n\t\t} else {\r\n\t\t\treturn other;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic isEmpty(): boolean {\r\n\t\treturn this.ms <= 0;\r\n\t}\r\n\r\n\tpublic isNotEmpty(): boolean {\r\n\t\treturn this.ms > 0;\r\n\t}\r\n\r\n\tpublic override toUnits() {\r\n\t\treturn super.toUnits();\r\n\t}\r\n\r\n\t/**\r\n\t\t* This method is used to provide a better DX when inspecting a TimeInstant object in DevTools.\r\n\t\t*/\r\n\tprotected get _duration() {\r\n\t\treturn this.formatted;\r\n\t}\r\n\r\n\tpublic override toString() {\r\n\t\treturn `${this.constructor.name}[${this.formatted}]`;\r\n\t}\r\n\r\n\tpublic static parseHumanTime( humanTime: string ): TimeDuration {\r\n\t\tconst match = humanTime.trim().match( /^(?:([0-9]+)d|)\\s*(?:([0-9]+)h|)\\s*(?:([0-9]+)m|)\\s*(?:([0-9]+)s|)$/ );\r\n\t\tif ( match ) {\r\n\t\t\tconst [ _, days, hours, minutes, seconds ] = match;\r\n\t\t\treturn new TimeDuration( TimeBase.unitsToMs( { days: Number( days ?? 0 ), hours: Number( hours ?? 0 ), minutes: Number( minutes ?? 0 ), seconds: Number( seconds ?? 0 ) } ), TimeUnit.MILLISECONDS );\r\n\t\t}\r\n\t\tthrow new Error( 'Failed to parse time: ' + humanTime );\r\n\t}\r\n\r\n\tpublic static compare( a: TimeDuration, b: TimeDuration ): TComparisonResult {\r\n\t\treturn a.compareTo( b );\r\n\t}\r\n\r\n\tpublic static ms = ( value: number ) => new TimeDuration( value, TimeUnit.MILLISECONDS );\r\n\tpublic static seconds = ( value: number ) => new TimeDuration( value, TimeUnit.SECONDS );\r\n\tpublic static minutes = ( value: number ) => new TimeDuration( value, TimeUnit.MINUTES );\r\n\tpublic static hours = ( value: number ) => new TimeDuration( value, TimeUnit.HOURS );\r\n\tpublic static days = ( value: number ) => new TimeDuration( value, TimeUnit.DAYS );\r\n\r\n\tpublic static shamefulUnref = ( ms: TAllowedTimeDuration ): number => {\r\n\t\tif ( ms instanceof TimeDuration ) {\r\n\t\t\treturn ms.ms;\r\n\t\t}\r\n\t\treturn ms;\r\n\t}\r\n\tpublic static shamefulRef = ( ms: TAllowedTimeDuration ): TimeDuration => {\r\n\t\tif ( ms instanceof TimeDuration ) {\r\n\t\t\treturn ms;\r\n\t\t}\r\n\t\tif ( ms < 0 ) {\r\n\t\t\tms = 0;\r\n\t\t}\r\n\t\treturn TimeDuration.ms( ms );\r\n\t}\r\n\r\n\tpublic static unref = ( ms: TValidTimeDuration ): TPredefinedTimeDuration => {\r\n\t\treturn TimeDuration.shamefulUnref( ms ) as TPredefinedTimeDuration;\r\n\t}\r\n\r\n\tpublic static ref = ( ms: TValidTimeDuration ): TimeDuration => {\r\n\t\treturn TimeDuration.shamefulRef( ms );\r\n\t}\r\n\r\n\tpublic static fromMs( ms: number ) {\r\n\t\treturn new TimeDuration( ms, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic static distanceFromNow( instant: TimeInstant ): TimeDuration {\r\n\t\treturn TimeDuration.distance( TimeInstant.now(), instant );\r\n\t}\r\n\r\n\tpublic static distance( instant1: TimeInstant, instant2: TimeInstant ): TimeDuration {\r\n\t\treturn instant1.distanceFrom( instant2 );\r\n\t}\r\n\r\n\tpublic static greatest( duration1: TimeDuration, duration2: TimeDuration ): TimeDuration {\r\n\t\treturn duration1.isGreaterThan( duration2 ) ? duration1 : duration2;\r\n\t}\r\n\r\n\tpublic static lowest( duration1: TimeDuration, duration2: TimeDuration ): TimeDuration {\r\n\t\treturn duration1.isLessThan( duration2 ) ? duration1 : duration2;\r\n\t}\r\n\r\n\tpublic static ZERO = new TimeDuration( 0, TimeUnit.MILLISECONDS );\r\n\r\n\tpublic static fromJSON( ms: number ) {\r\n\t\treturn TimeDuration.ms( ms );\r\n\t}\r\n\r\n\tpublic static fromUnits( parameters: Partial<TTimeInUnits> ): TimeDuration {\r\n\t\treturn TimeDuration.ms( TimeBase.unitsToMs( parameters ) );\r\n\t}\r\n\r\n}\r\n\r\nexport type TPredefinedTimeDuration = 0 | 50 | 100 | 150 | 200 | 250 | 300 | 500 | 1000 | 1500 | 2000 | 2500 | 5000;\r\nexport type TValidTimeDuration = TimeDuration | TPredefinedTimeDuration;\r\ntype TAllowedTimeDuration = TValidTimeDuration | number; // eslint-disable-line @typescript-eslint/no-redundant-type-constituents\r\n\r\nexport function isAllowedTimeDuration( t: unknown ): t is TAllowedTimeDuration {\r\n\treturn ( typeof t === \"number\" && t > 0 ) || t instanceof TimeDuration;\r\n}\r\n\r\nexport default TimeDuration;\r\n", "\r\nexport const monthNames = {\r\n\tjanuary: 1,\r\n\tfebruary: 2,\r\n\tmarch: 3,\r\n\tapril: 4,\r\n\tmay: 5,\r\n\tjune: 6,\r\n\tjuly: 7,\r\n\taugust: 8,\r\n\tseptember: 9,\r\n\toctober: 10,\r\n\tnovember: 11,\r\n\tdecember: 12,\r\n} as const satisfies Record<string, number>;\r\n", "\r\nimport { TFunction } from \"../utils/functions.js\";\r\nimport { ensureDefined } from \"../utils/nulls.js\";\r\nimport { monthNames } from \"./constants.js\";\r\nimport { TimeInstant, isTimeInstant } from \"./TimeInstant.js\";\r\nimport { TDayOfMonth, THourOfDay, TMillisecondOfSecond, TMinuteOfHour, TMonth, TSecondOfMinute, TUpToTwoDigits, type TMonthName } from \"./types.js\";\r\n\r\ntype TRelativeSignum = '+' | '-';\r\ntype TRelativeNumber = `${TRelativeSignum}${TUpToTwoDigits}`;\r\nconst isRelativeNumber = ( x: string ): x is TRelativeNumber => x !== undefined && x.length > 0 && ( x[ 0 ] === '+' || x[ 0 ] === '-' );\r\n\r\nexport type TTimeInstantCreationParameters = {\r\n\tyear: number | { absolute: number } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tmonth: TMonth | { absolute: TMonth } | TMonthName | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tdate: TDayOfMonth | { absolute: TDayOfMonth } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\thours: THourOfDay | { absolute: THourOfDay } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tminutes: TMinuteOfHour | { absolute: TMinuteOfHour } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tseconds: TSecondOfMinute | { absolute: TSecondOfMinute } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n\tmilliseconds: TMillisecondOfSecond | { absolute: TMillisecondOfSecond } | TRelativeNumber | { relative: number, relativeTo: 'now' | TimeInstant } | 'next' | 'last' | 'current' | undefined;\r\n}\r\n\r\nconst defaultTimeInstantCreationParameters: TTimeInstantCreationParameters = {\r\n\tyear: { relative: 0, relativeTo: 'now' },\r\n\tmonth: { relative: 0, relativeTo: 'now' },\r\n\tdate: { relative: 0, relativeTo: 'now' },\r\n\thours: { relative: 0, relativeTo: 'now' },\r\n\tminutes: { relative: 0, relativeTo: 'now' },\r\n\tseconds: { relative: 0, relativeTo: 'now' },\r\n\tmilliseconds: { relative: 0, relativeTo: 'now' },\r\n};\r\nconst timeInstantCreationRelativeAliases = {\r\n\tcurrent: 0,\r\n\tlast: -1,\r\n\tnext: +1,\r\n} as const satisfies Record<string, number>;\r\n\r\ntype TAllowedTimeInstantCreationAlias = keyof typeof timeInstantCreationRelativeAliases;\r\ntype TAllowedTimeInstantCreationParameter = { absolute: number } | { relative: number, relativeTo?: TimeInstant | 'now' } | TAllowedTimeInstantCreationAlias | TRelativeNumber | TMonthName | number | undefined;\r\nconst timeInstantResolveValue = ( getFromDate: TFunction<Date, number>, referenceDate: Date, x: TAllowedTimeInstantCreationParameter ): number => {\r\n\tif ( x === undefined ) {\r\n\t\treturn getFromDate( referenceDate );\r\n\t} else if ( typeof x === 'number' ) {\r\n\t\treturn x;\r\n\t} else if ( typeof x === 'string' ) {\r\n\t\tif ( isRelativeNumber( x ) ) {\r\n\t\t\treturn getFromDate( referenceDate ) + parseInt( x );\r\n\t\t} else if ( x in timeInstantCreationRelativeAliases ) {\r\n\t\t\treturn getFromDate( referenceDate ) + timeInstantCreationRelativeAliases[ x ];\r\n\t\t} else if ( x in monthNames ) {\r\n\t\t\treturn monthNames[x];\r\n\t\t} else {\r\n\t\t\tthrow new Error( 'Uparseable string detected: ' + x );\r\n\t\t}\r\n\t} else if ( \"relative\" in x ) {\r\n\t\tconst { relative, relativeTo } = x;\r\n\t\tif ( relativeTo === undefined || relativeTo === 'now' ) {\r\n\t\t\treturn getFromDate( referenceDate ) + relative;\r\n\t\t} else {\r\n\t\t\treturn getFromDate( relativeTo.toDate() ) + relative;\r\n\t\t}\r\n\t} else if ( \"absolute\" in x ) {\r\n\t\treturn x.absolute\r\n\t} else {\r\n\t\tthrow new Error( 'Uparseable value detected: ' + x );\r\n\t}\r\n};\r\nconst getFromDate = {\r\n\tyear: d => d.getFullYear(),\r\n\tmonth: d => d.getMonth() + 1,\r\n\tdate: d => d.getDate(),\r\n\thours: d => d.getHours(),\r\n\tminutes: d => d.getMinutes(),\r\n\tseconds: d => d.getSeconds(),\r\n\tmilliseconds: d => d.getMilliseconds(),\r\n} as const satisfies Record<string, TFunction<Date, number>>;\r\nconst toReferenceDate = ( x: Date | TimeInstant ): Date => { \r\n\tensureDefined( x );\r\n\tif ( isTimeInstant( x ) ) return x.toDate();\r\n\treturn x;\r\n}\r\n\r\nexport function createTimeInstantFromParameters( aParameters: Partial<TTimeInstantCreationParameters>, aReferenceDate: TimeInstant | Date = TimeInstant.now() ): TimeInstant {\r\n\tconst { year, month, date, hours, minutes, seconds, milliseconds }: TTimeInstantCreationParameters = { ...defaultTimeInstantCreationParameters, ...aParameters };\r\n\tconst referenceDate = toReferenceDate( aReferenceDate );\r\n\tconst timestamp = Date.UTC(\r\n\t\ttimeInstantResolveValue( getFromDate.year, referenceDate, year ),\r\n\t\ttimeInstantResolveValue( getFromDate.month, referenceDate, month ) - 1, // Convert from 1-based to 0-based for Date.UTC()\r\n\t\ttimeInstantResolveValue( getFromDate.date, referenceDate, date ),\r\n\t\ttimeInstantResolveValue( getFromDate.hours, referenceDate, hours ),\r\n\t\ttimeInstantResolveValue( getFromDate.minutes, referenceDate, minutes ),\r\n\t\ttimeInstantResolveValue( getFromDate.seconds, referenceDate, seconds ),\r\n\t\ttimeInstantResolveValue( getFromDate.milliseconds, referenceDate, milliseconds )\r\n\t);\r\n\tif ( isNaN( timestamp ) )\r\n\t\tthrow new Error( `Unparseable date: ${JSON.stringify( aParameters )} }` );\r\n\treturn TimeInstant.fromUnixTimestamp( timestamp );\r\n}\r\nexport function timeInstantBuilder() {\r\n\tlet referenceDate = TimeInstant.now().toDate();\r\n\tconst value: TTimeInstantCreationParameters = { ...defaultTimeInstantCreationParameters };\r\n\tconst ret = {\r\n\t\tyear: ( x: TTimeInstantCreationParameters[ \"year\" ] ) => { value.year = x; return ret; },\r\n\t\tmonth: ( x: TTimeInstantCreationParameters[ \"month\" ] ) => { value.month = x; return ret; },\r\n\t\tdate: ( x: TTimeInstantCreationParameters[ \"date\" ] ) => { value.date = x; return ret; },\r\n\t\thours: ( x: TTimeInstantCreationParameters[ \"hours\" ] ) => { value.hours = x; return ret; },\r\n\t\tminutes: ( x: TTimeInstantCreationParameters[ \"minutes\" ] ) => { value.minutes = x; return ret; },\r\n\t\tseconds: ( x: TTimeInstantCreationParameters[ \"seconds\" ] ) => { value.seconds = x; return ret; },\r\n\t\tmilliseconds: ( x: TTimeInstantCreationParameters[ \"milliseconds\" ] ) => { value.milliseconds = x; return ret; },\r\n\t\tvalues: ( x: Partial<TTimeInstantCreationParameters> ) => { Object.keys( value ).forEach( key => value[key] = x[key] ?? value[key] ); return ret; },\r\n\t\trelativeTo: ( x: TimeInstant | Date ) => { referenceDate = toReferenceDate( x ); return ret; },\r\n\t\tbuild: () => createTimeInstantFromParameters( value, referenceDate ),\r\n\t};\r\n\treturn ret;\r\n}\r\nexport type TTimeInstantBuilder = ReturnType<typeof timeInstantBuilder>;\r\n", "import { ICancelable, ICancelablePromise } from \"../async/Deferred.js\";\r\nimport { TComparisonResult } from \"../sorting/_index.js\";\r\nimport TimeBase from \"./TimeBase\";\r\nimport TimeDuration from \"./TimeDuration\";\r\nimport { TTimeInstantBuilder, TTimeInstantCreationParameters, createTimeInstantFromParameters, timeInstantBuilder } from \"./TimeInstantBuilder.js\";\r\nimport { TimeUnit } from \"./TimeUnit\";\r\nimport { TDayOfMonth, TDayOfWeek, THourOfDay, TIso8601DateString, TIso8601DateUtcString, TMillisecondOfSecond, TMinuteOfHour, TMonth, TSecondOfMinute, TWeekNumber } from \"./types\";\r\n\r\nexport class TimeInstant extends TimeBase<TimeInstant> {\r\n\r\n\tprotected constructor( number: number, unit: TimeUnit ) {\r\n\t\tsuper( number, unit );\r\n\t}\r\n\r\n\tprotected create( value: number, unit: TimeUnit ) {\r\n\t\treturn new TimeInstant( value, unit );\r\n\t}\r\n\r\n\tpublic addDuration( duration: TimeDuration ): TimeInstant {\r\n\t\treturn TimeInstant.fromUnixTimestamp( this.ms + duration.ms );\r\n\t}\r\n\r\n\tpublic removeDuration( duration: TimeDuration ): TimeInstant {\r\n\t\treturn TimeInstant.fromUnixTimestamp( this.ms - duration.ms );\r\n\t}\r\n\r\n\tpublic distanceFrom( instant: TimeInstant ): TimeDuration {\r\n\t\treturn TimeDuration.fromMs( Math.abs( this.ms - instant.ms ) );\r\n\t}\r\n\r\n\tpublic distanceFromNow(): TimeDuration {\r\n\t\treturn TimeDuration.fromMs( Math.abs( this.ms - Date.now() ) );\r\n\t}\r\n\r\n\tpublic distanceFromUnixTimestamp( timestamp: number ): TimeDuration {\r\n\t\treturn TimeDuration.ms( this.ms - timestamp );\r\n\t}\r\n\r\n\tpublic timeLeftFrom( instant: TimeInstant ): TimeDuration {\r\n\t\tconst distance = this.ms - instant.ms;\r\n\t\treturn TimeDuration.fromMs( Math.max( distance, 0 ) );\r\n\t}\r\n\r\n\tpublic timeLeftFromNow(): TimeDuration {\r\n\t\tconst distance = this.ms - Date.now();\r\n\t\treturn TimeDuration.fromMs( Math.max( distance, 0 ) );\r\n\t}\r\n\r\n\tpublic distanceFromStartOfDay(): TimeDuration {\r\n\t\treturn this.distanceFrom( this.atStartOfDay() );\r\n\t}\r\n\r\n\tpublic atStartOfDay(): TimeInstant {\r\n\t\treturn this.atTime( { hours: 0, minutes: 0, seconds: 0, milliseconds: 0 } );\r\n\t}\r\n\r\n\tpublic distanceFromEndOfDay(): TimeDuration {\r\n\t\treturn this.distanceFrom( this.atEndOfDay() );\r\n\t}\r\n\r\n\tpublic atEndOfDay(): TimeInstant {\r\n\t\treturn this.atTime( { hours: 23, minutes: 59, seconds: 59, milliseconds: 999 } );\r\n\t}\r\n\r\n\tpublic promise(): Promise<void> {\r\n\t\treturn this.timeLeftFromNow().promise();\r\n\t}\r\n\r\n\tpublic cancelablePromise(): ICancelablePromise<void> {\r\n\t\treturn this.timeLeftFromNow().cancelablePromise();\r\n\t}\r\n\r\n\tpublic delay( cb: () => unknown ): void {\r\n\t\treturn this.timeLeftFromNow().delay( cb );\r\n\t}\r\n\r\n\tpublic cancelableDelay( cb: () => unknown ): ICancelable {\r\n\t\treturn this.timeLeftFromNow().cancelableDelay( cb );\r\n\t}\r\n\r\n\tpublic ensureInTheFuture() {\r\n\t\tif ( !this.isInTheFuture() )\r\n\t\t\tthrow new Error( 'Instant is not in the future' );\r\n\t}\r\n\r\n\tpublic ensureInThePast() {\r\n\t\tif ( !this.isInThePast() )\r\n\t\t\tthrow new Error( 'Instant is not in the past' );\r\n\t}\r\n\r\n\tpublic isToday(): boolean {\r\n\t\treturn Math.floor( this.days ) === Math.floor( TimeInstant.now().days );\r\n\t}\r\n\r\n\t/**\r\n\t * Formats this instant using the given pattern. The pattern can contain the following tokens:\r\n\t * \r\n\t * Note: Implementation inspired by the small-date library (https://github.com/robinweser/small-date).\r\n\t * \r\n\t * | Token | Description | Example |\r\n\t * |:------|:--------------------------------|:------------------------------|\r\n\t * | D | Weekday, 1 letter | W |\r\n\t * | DD | Weekday, 3 letters | Wed |\r\n\t * | DDD | Weekday, long | Wednesday |\r\n\t * | d | Day of the month, no padding | 3 |\r\n\t * | dd | Day of the month, padded to 2 | 03 |\r\n\t * | M | Month, numeric | 3 |\r\n\t * | MM | Month, 2 digits | 03 |\r\n\t * | MMM | Month, 3 letters | Mar |\r\n\t * | MMMM | Month, long | March |\r\n\t * | y | Year, numeric | 2021 |\r\n\t * | yy | Year, 2 digits | 21 |\r\n\t * | yyyy | Year, numeric | 2021 |\r\n\t * | h | Hours, no padding | 6 |\r\n\t * | hh | Hours, padded to 2 | 06 |\r\n\t * | H | Hours in 24-format, no padding | 18 |\r\n\t * | HH | Hours in 24-format, padded to 2 | 18 |\r\n\t * | m | Minutes, no padding | 7 |\r\n\t * | m | Minutes, padded to 2 | 07 |\r\n\t * | s | Seconds, no padding | 8 |\r\n\t * | ss | Seconds, padded to 2 | 08 |\r\n\t * | S | Milliseconds, no padding | 9 |\r\n\t * | SS | Milliseconds, padded to 2 | 09 |\r\n\t * | SSS | Milliseconds, padded to 3 | 009 |\r\n\t * | G | Era, narrow | A |\r\n\t * | GG | Era, short | AD |\r\n\t * | GGG | Era, long | Anno Domino |\r\n\t * | Z | Time zone, short | GMT+1 |\r\n\t * | ZZ | Time short, long\tC | entral European Standard Time |\r\n\t * | P | Period of the day, narrow | in the morning |\r\n\t * | PP | Period of the day, short | in the morning |\r\n\t * | PPP | Period of the day, long | in the morning |\r\n\t * | a | Meridiem | pm |\r\n\t * @param pattern The pattern to use. Refer to the token table above for details.\r\n\t * @param config An optional locale and timeZone definition to use during the format.\r\n\t * @returns a string, formatted using the given pattern, at the given timeZone with the given locale.\r\n\t */\r\n\tpublic format( pattern: string, config: { locale?: string, timeZone?: string } = {} ) {\r\n\t\treturn formatTimeInstant( this, pattern, config );\r\n\t}\r\n\r\n\t/**\r\n\t * Parses a date string using the given pattern and creates a TimeInstant.\r\n\t * This method is the inverse of format() - parsing a formatted string should recreate the original instant.\r\n\t * \r\n\t * For partial patterns (e.g., time-only or date-only), the missing components are taken from the base instant.\r\n\t * For example, parsing \"14:30\" with base set to yesterday at midnight will result in yesterday at 14:30.\r\n\t * \r\n\t * Note: Currently performs basic validation (e.g., month 1-12, day 1-31) but does not validate\r\n\t * calendar-specific constraints (e.g., February 30th, April 31st). Invalid dates may be\r\n\t * normalized by the underlying Date constructor.\r\n\t * \r\n\t * @param dateString The date string to parse\r\n\t * @param pattern The pattern used to parse the string (same tokens as format())\r\n\t * @param base The base TimeInstant to use for partial patterns (defaults to now)\r\n\t * @param config An optional locale and timeZone definition to use during parsing\r\n\t * @returns A TimeInstant parsed from the string\r\n\t * @throws Error if the string doesn't match the pattern or contains invalid basic values\r\n\t * @todo Add calendar-aware validation to reject dates like February 30th, April 31st\r\n\t */\r\n\tpublic static parse( dateString: string, pattern: string, base: TimeInstant = TimeInstant.now(), config: { locale?: string, timeZone?: string } = {} ): TimeInstant {\r\n\t\treturn parseTimeInstant( dateString, pattern, base, config );\r\n\t}\r\n\r\n\t/**\r\n * @returns this instant, in ISO 8601 format (eg, 2024-11-01T15:49:22.024Z). The format is meant to always be realiable.\r\n */\r\n\tpublic asIso8601(): TIso8601DateUtcString {\r\n\t\treturn this.format( 'yyyy-MM-dd\"T\"HH:mm:ss.SSS\"Z\"', { timeZone: 'UTC' } ) as TIso8601DateUtcString;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns this instant, in a human readable format, containing both the date and the time. The format COULD change in the future, do NOT use this method for consistent outputs.\r\n\t */\r\n\tpublic asHumanTimestamp(): string {\r\n\t\treturn this.format( 'yyyy-MM-dd HH:mm:ss' )\r\n\t}\r\n\r\n\tpublic toUnixTimestamp(): number {\r\n\t\t// Syntatic sugar for this.ms;\r\n\t\treturn this.ms;\r\n\t}\r\n\r\n\tpublic toDate(): Date {\r\n\t\treturn new Date( this.ms );\r\n\t}\r\n\r\n\tpublic toDateUTC(): Date {\r\n\t\treturn new Date( this.ms + new Date().getTimezoneOffset() * 60 * 1000 );\r\n\t}\r\n\r\n\t/**\r\n\t * @returns true if the instant is in the past, false otherwise\r\n\t */\r\n\tpublic isInThePast(): boolean {\r\n\t\treturn this.ms < Date.now();\r\n\t}\r\n\r\n\t/**\r\n\t * @returns true if the instant is in the future, false otherwise\r\n\t */\r\n\tpublic isInTheFuture(): boolean {\r\n\t\treturn this.ms > Date.now();\r\n\t}\r\n\r\n\tpublic isAfter( other: TimeInstant ): boolean {\r\n\t\treturn this.ms > other.ms;\r\n\t}\r\n\r\n\tpublic isBefore( other: TimeInstant ): boolean {\r\n\t\treturn this.ms < other.ms;\r\n\t}\r\n\r\n\tpublic compareTo( other: TimeInstant ): TComparisonResult {\r\n\t\tif ( this.ms === other.ms ) {\r\n\t\t\treturn 0;\r\n\t\t} else if ( this.isBefore( other ) ) {\r\n\t\t\treturn -1;\r\n\t\t} else {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic atTime( parameters: Partial<TTimeInstantCreationParameters & { year: never; month: never; date: never; }> ) {\r\n\t\treturn TimeInstant.fromParameters( parameters, this );\r\n\t}\r\n\r\n\tpublic atDate( parameters: Partial<TTimeInstantCreationParameters & { hours: never; minutes: never; seconds: never; milliseconds: never; }> ) {\r\n\t\treturn TimeInstant.fromParameters( parameters, this );\r\n\t}\r\n\r\n\tpublic at( parameters: Partial<TTimeInstantCreationParameters> ) {\r\n\t\treturn TimeInstant.fromParameters( parameters, this );\r\n\t}\r\n\r\n\tpublic isBetween( start: TimeInstant, end: TimeInstant ) {\r\n\t\treturn this.ms >= start.ms && this.ms <= end.ms;\r\n\t}\r\n\r\n\tpublic static fromDate( date: Date ): TimeInstant {\r\n\t\treturn this.fromUnixTimestamp( date.getTime() );\r\n\t}\r\n\r\n\tpublic static fromUnixTimestamp( unixTimestamp: number ): TimeInstant {\r\n\t\treturn new TimeInstant( unixTimestamp, TimeUnit.MILLISECONDS );\r\n\t}\r\n\r\n\tpublic static fromUnixSeconds( unixSeconds: number ): TimeInstant {\r\n\t\treturn new TimeInstant( unixSeconds, TimeUnit.SECONDS );\r\n\t}\r\n\r\n\tpublic static fromParameters( parameters: Partial<TTimeInstantCreationParameters>, referenceDate?: Date | TimeInstant ): TimeInstant {\r\n\t\treturn createTimeInstantFromParameters( parameters, referenceDate );\r\n\t}\r\n\r\n\tpublic static highest( instant1: TimeInstant, instant2: TimeInstant ): TimeInstant {\r\n\t\treturn instant1.isAfter( instant2 ) ? instant1 : instant2;\r\n\t}\r\n\r\n\tpublic static lowest( instant1: TimeInstant, instant2: TimeInstant ): TimeInstant {\r\n\t\treturn instant1.isBefore( instant2 ) ? instant1 : instant2;\r\n\t}\r\n\r\n\tpublic static builder(): TTimeInstantBuilder {\r\n\t\treturn timeInstantBuilder();\r\n\t}\r\n\r\n\tpublic static fromIso8601( str: string ) {\r\n\t\t// Regex to capture: YYYY-MM-DDTHH:mm:ss.sssZ or YYYY-MM-DDTHH:mm:ss.sss\u00B1HH:mm\r\n\t\tconst iso8601Regex = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})(Z|[+-]\\d{2}:\\d{2})?$/;\r\n\t\tconst match = str.match( iso8601Regex );\r\n\r\n\t\tif ( !match ) {\r\n\t\t\tthrow new Error( 'Invalid ISO 8601 date format: ' + str );\r\n\t\t}\r\n\r\n\t\tconst [ , yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr, millisecondStr ] = match;\r\n\r\n\t\t// Parse strings to numbers\r\n\t\tconst year = parseInt( yearStr, 10 );\r\n\t\tconst month = parseInt( monthStr, 10 );\r\n\t\tconst date = parseInt( dayStr, 10 );\r\n\t\tconst hours = parseInt( hourStr, 10 );\r\n\t\tconst minutes = parseInt( minuteStr, 10 );\r\n\t\tconst seconds = parseInt( secondStr, 10 );\r\n\t\tconst milliseconds = parseInt( millisecondStr, 10 );\r\n\r\n\t\t// Validate each component using standalone validation functions\r\n\t\tif ( !isValidYear( year ) )\r\n\t\t\tthrow new Error( 'Invalid year in: ' + str );\r\n\t\tif ( !isValidMonth( month ) )\r\n\t\t\tthrow new Error( 'Invalid month in: ' + str );\r\n\t\tif ( !isValidDayOfMonth( date ) )\r\n\t\t\tthrow new Error( 'Invalid day in: ' + str );\r\n\t\tif ( !isValidHour( hours ) )\r\n\t\t\tthrow new Error( 'Invalid hour in: ' + str );\r\n\t\tif ( !isValidMinute( minutes ) )\r\n\t\t\tthrow new Error( 'Invalid minute in: ' + str );\r\n\t\tif ( !isValidSecond( seconds ) )\r\n\t\t\tthrow new Error( 'Invalid second in: ' + str );\r\n\t\tif ( !isValidMillisecond( milliseconds ) )\r\n\t\t\tthrow new Error( 'Invalid millisecond in: ' + str );\r\n\r\n\t\treturn TimeInstant.fromParameters( {\r\n\t\t\tyear,\r\n\t\t\tmonth,\r\n\t\t\tdate,\r\n\t\t\thours,\r\n\t\t\tminutes,\r\n\t\t\tseconds,\r\n\t\t\tmilliseconds,\r\n\t\t} );\r\n\t}\r\n\r\n\t/**\r\n\t * @deprecated [2025.10.19]: Use fromIso8601 instead.\r\n\t */\r\n\tpublic static tryFromIso8601 = this.fromIso8601;\r\n\r\n\tpublic static now(): TimeInstant {\r\n\t\treturn TimeInstant.fromUnixTimestamp( Date.now() );\r\n\t}\r\n\r\n\tpublic static compare( a: TimeInstant, b: TimeInstant ): TComparisonResult {\r\n\t\treturn a.compareTo( b );\r\n\t}\r\n\r\n\tpublic roundedToStartOf( unit: TimeUnit ) {\r\n\t\treturn TimeInstant.fromUnixTimestamp( this.ms - ( this.ms % unit.multiplier ) );\r\n\t}\r\n\r\n\tpublic roundedToEndOf( unit: TimeUnit ) {\r\n\t\treturn TimeInstant.fromUnixTimestamp( this.ms - ( this.ms % unit.multiplier ) + unit.toMs( 1 ) - 1 );\r\n\t}\r\n\r\n\tpublic roundedToNext( unit: TimeUnit, factor = 1 ) {\r\n\t\tconst unitMs = unit.toMs( factor );\r\n\t\tconst timestamp = Math.ceil( this.ms / unitMs ) * unitMs;\r\n\t\treturn TimeInstant.fromUnixTimestamp( timestamp );\r\n\t}\r\n\r\n\tpublic roundedToPrevious( unit: TimeUnit, factor = 1 ) {\r\n\t\tconst unitMs = unit.toMs( factor );\r\n\t\tconst timestamp = Math.floor( this.ms / unitMs ) * unitMs;\r\n\t\treturn TimeInstant.fromUnixTimestamp( timestamp );\r\n\t}\r\n\r\n\tpublic roundedTo( unit: TimeUnit, factor = 1 ) {\r\n\t\tconst unitMs = unit.toMs( factor );\r\n\t\tconst timestamp = Math.round( this.ms / unitMs ) * unitMs;\r\n\t\treturn TimeInstant.fromUnixTimestamp( timestamp );\r\n\t}\r\n\r\n\tpublic get dayOfMonth(): TDayOfMonth {\r\n\t\treturn this.toDate().getUTCDate() as TDayOfMonth;\r\n\t}\r\n\r\n\tpublic get dayOfWeek(): TDayOfWeek {\r\n\t\treturn this.toDate().getUTCDay() + 1 as TDayOfWeek;\r\n\t}\r\n\r\n\tpublic get month(): TMonth {\r\n\t\treturn this.toDate().getUTCMonth() + 1 as TMonth;\r\n\t}\r\n\r\n\tpublic get year(): number {\r\n\t\treturn this.toDate().getUTCFullYear();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the week number represented by this instant, according to the ISO 8601 standard.\r\n\t\t* Please note that the instant and the week number could be of two different years, eg the friday 1st january is actually part of week 52 of the previous year.\r\n\t */\r\n\tpublic get weekNumber(): { weekNumber: TWeekNumber, year: number } {\r\n\t\t/**\r\n\t\t\t* According to the ISO 8601 Standard, week number 1 is defined as the week containing the 4th of january (or, equivalently, the week that contains the first Thursday of the year).\r\n\t\t\t* As such, we basically have to count how many Thursdays there has been in this year.\r\n\t\t\t* Please note that the thursdayOfThisWeek could be in the previous year.\r\n\t\t */\r\n\t\tconst date = this.toDate();\r\n\t\tconst oneDay = 1000 * 60 * 60 * 24;\r\n\t\tconst thursdayOfThisWeek = new Date( date.getFullYear(), date.getMonth(), date.getDate() + 4 - ( date.getDay() || 7 ), 14, 0, 0 );\r\n\t\tconst firstOfJanuary = new Date( thursdayOfThisWeek.getFullYear(), 0, 1, 14, 0, 0 );\r\n\t\tconst dayOfTheYear = Math.round( ( thursdayOfThisWeek.getTime() - firstOfJanuary.getTime() ) / oneDay );\r\n\t\tconst weekNumber = Math.floor( dayOfTheYear / 7 ) + 1;\r\n\t\treturn { weekNumber: weekNumber as TWeekNumber, year: thursdayOfThisWeek.getFullYear() };\r\n\t}\r\n\r\n\t/**\r\n\t * This method is used to provide a better DX when inspecting a TimeInstant object in DevTools.\r\n\t */\r\n\tprotected get _time() {\r\n\t\treturn this.asHumanTimestamp();\r\n\t}\r\n\r\n\tpublic override toString() {\r\n\t\treturn `${this.constructor.name}[${this.asHumanTimestamp()}]`;\r\n\t}\r\n\r\n\tpublic static ZERO: TimeInstant = TimeInstant.fromUnixTimestamp( 0 );\r\n\r\n\tpublic static fromJSON( ms: number ) {\r\n\t\treturn TimeInstant.fromUnixTimestamp( ms );\r\n\t}\r\n\r\n}\r\n\r\nexport function isTimeInstant( x: unknown ): x is TimeInstant {\r\n\treturn x !== null && x !== undefined && x instanceof TimeInstant;\r\n}\r\n\r\nexport default TimeInstant;\r\n\r\n\r\n// Utility functions for date formatting and parsing\r\n\r\n// Standalone validation functions\r\n// TODO: Add calendar-aware validation to check month-specific day limits\r\n// (e.g., reject February 30th, April 31st, February 29th in non-leap years)\r\nfunction isValidYear( num: number ): boolean {\r\n\treturn num >= 0 && num <= 9999;\r\n}\r\n\r\nfunction isValidMonth( num: number ): num is TMonth {\r\n\treturn num >= 1 && num <= 12;\r\n}\r\n\r\nfunction isValidDayOfMonth( num: number ): num is TDayOfMonth {\r\n\treturn num >= 1 && num <= 31;\r\n}\r\n\r\nfunction isValidHour( num: number ): num is THourOfDay {\r\n\treturn num >= 0 && num <= 23;\r\n}\r\n\r\nfunction isValidMinute( num: number ): num is TMinuteOfHour {\r\n\treturn num >= 0 && num <= 59;\r\n}\r\n\r\nfunction isValidSecond( num: number ): num is TSecondOfMinute {\r\n\treturn num >= 0 && num <= 59;\r\n}\r\n\r\nfunction isValidMillisecond( num: number ): num is TMillisecondOfSecond {\r\n\treturn num >= 0 && num <= 999;\r\n}\r\n\r\nconst PATTERN_REGEX = /(M|y|d|D|h|H|m|s|S|G|Z|P|a)+/g;\r\nconst ESCAPE_REGEX = /\\\\\"|\"((?:\\\\\"|[^\"])*)\"/g;\r\n\r\nconst optionNames = {\r\n\ty: 'year',\r\n\tM: 'month',\r\n\td: 'day',\r\n\tD: 'weekday',\r\n\tS: 'fractionalSecondDigits',\r\n\tG: 'era',\r\n\tZ: 'timeZoneName',\r\n\tP: 'dayPeriod',\r\n\ta: 'hour12',\r\n\th: 'hour',\r\n\tH: 'hour',\r\n\tm: 'minute',\r\n\ts: 'second',\r\n} as const;\r\n\r\nconst values = {\r\n\ty: [ 'numeric', '2-digit', undefined, 'numeric' ],\r\n\tM: [ 'narrow', '2-digit', 'short', 'long' ],\r\n\td: [ 'numeric', '2-digit' ],\r\n\tD: [ 'narrow', 'short', 'long' ],\r\n\tS: [ 1, 2, 3 ],\r\n\tG: [ 'narrow', 'short', 'long' ],\r\n\tZ: [ 'short', 'long' ],\r\n\tP: [ 'narrow', 'short', 'long' ],\r\n\ta: [ true ],\r\n\th: [ \"numeric\", \"2-digit\" ],\r\n\tH: [ \"numeric\", \"2-digit\" ],\r\n\tm: [ \"numeric\", \"2-digit\" ],\r\n\ts: [ \"numeric\", \"2-digit\" ],\r\n} as const;\r\n\r\nfunction padIf( condition: boolean, value: string | number, length: number ): string {\r\n\treturn condition && length === 2 && Number( value ) / 10 < 1 ? '0' + value : String( value );\r\n}\r\n\r\nfunction formatType( instant: TimeInstant, type: string, length: number, { locale, timeZone }: { locale?: string, timeZone?: string } = {} ): string | undefined {\r\n\t// For timezone-sensitive formatting, we still need to use Intl.DateTimeFormat with a Date\r\n\t// But for basic numeric formatting, we can use the TimeInstant's properties directly\r\n\r\n\t// Handle basic numeric formatting directly from TimeInstant properties (UTC-based)\r\n\tif ( type === 'y' ) {\r\n\t\tconst year = instant.year;\r\n\t\tif ( length === 2 ) {\r\n\t\t\treturn String( year ).slice( -2 );\r\n\t\t}\r\n\t\treturn String( year );\r\n\t}\r\n\r\n\tif ( type === 'M' && ( length === 1 || length === 2 ) ) {\r\n\t\tconst month = instant.month;\r\n\t\treturn length === 2 && month < 10 ? '0' + month : String( month );\r\n\t}\r\n\r\n\tif ( type === 'd' && ( length === 1 || length === 2 ) ) {\r\n\t\tconst day = instant.dayOfMonth;\r\n\t\treturn length === 2 && day < 10 ? '0' + day : String( day );\r\n\t}\r\n\r\n\t// Handle time components directly from UTC Date to avoid timezone conversion\r\n\tif ( type === 'H' && ( length === 1 || length === 2 ) ) {\r\n\t\tconst hours = instant.toDate().getUTCHours();\r\n\t\treturn length === 2 && hours < 10 ? '0' + hours : String( hours );\r\n\t}\r\n\r\n\tif ( type === 'h' && ( length === 1 || length === 2 ) ) {\r\n\t\tlet hours = instant.toDate().getUTCHours();\r\n\t\thours = hours === 0 ? 12 : hours > 12 ? hours - 12 : hours;\r\n\t\treturn length === 2 && hours < 10 ? '0' + hours : String( hours );\r\n\t}\r\n\r\n\tif ( type === 'm' && ( length === 1 || length === 2 ) ) {\r\n\t\tconst minutes = instant.toDate().getUTCMinutes();\r\n\t\treturn length === 2 && minutes < 10 ? '0' + minutes : String( minutes );\r\n\t}\r\n\r\n\tif ( type === 's' && ( length === 1 || length === 2 ) ) {\r\n\t\tconst seconds = instant.toDate().getUTCSeconds();\r\n\t\treturn length === 2 && seconds < 10 ? '0' + seconds : String( seconds );\r\n\t}\r\n\r\n\tif ( type === 'S' ) {\r\n\t\tconst ms = instant.toDate().getUTCMilliseconds();\r\n\t\tif ( length === 1 ) return String( Math.floor( ms / 100 ) );\r\n\t\tif ( length === 2 ) return String( Math.floor( ms / 10 ) ).padStart( 2, '0' );\r\n\t\tif ( length === 3 ) return String( ms ).padStart( 3, '0' );\r\n\t\treturn String( ms );\r\n\t}\r\n\r\n\t// For timezone-sensitive and locale-sensitive formatting, use Date with Intl\r\n\tconst date = instant.toDate();\r\n\tconst option = optionNames[ type as keyof typeof optionNames ];\r\n\tconst value = values[ type as keyof typeof values ][ length - 1 ];\r\n\r\n\tif ( !value ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst options = {\r\n\t\t[ option ]: value,\r\n\t\ttimeZone,\r\n\t} as Intl.DateTimeFormatOptions;\r\n\r\n\tif ( type === 'a' ) {\r\n\t\treturn Intl.DateTimeFormat( locale, {\r\n\t\t\t...options,\r\n\t\t\thour: 'numeric',\r\n\t\t} )\r\n\t\t\t.formatToParts( date )\r\n\t\t\t.pop()?.value;\r\n\t}\r\n\r\n\tif ( type === 'G' || type === 'Z' ) {\r\n\t\treturn Intl.DateTimeFormat( locale, options ).formatToParts( date ).pop()?.value;\r\n\t}\r\n\r\n\t// For other complex formatting, fall back to Intl\r\n\treturn Intl.DateTimeFormat( locale, options ).format( date );\r\n}\r\n\r\nfunction formatTimeInstant( instant: TimeInstant, pattern: string, config: { locale?: string, timeZone?: string } = {} ): string {\r\n\treturn pattern\r\n\t\t.split( ESCAPE_REGEX )\r\n\t\t.filter( ( sub ) => sub !== undefined )\r\n\t\t.map( ( sub, index ) => {\r\n\t\t\t// keep escaped strings as is\r\n\t\t\tif ( index % 2 !== 0 ) {\r\n\t\t\t\treturn sub;\r\n\t\t\t}\r\n\r\n\t\t\treturn sub.replace( PATTERN_REGEX, ( match ) => {\r\n\t\t\t\tconst type = match.charAt( 0 );\r\n\t\t\t\treturn formatType( instant, type, match.length, config ) || match;\r\n\t\t\t} );\r\n\t\t} )\r\n\t\t.join( '' );\r\n}\r\n\r\nfunction parseTimeInstant( dateString: string, pattern: string, base: TimeInstant, config: { locale?: string, timeZone?: string } = {} ): TimeInstant {\r\n\t// Create a regex pattern from the format pattern\r\n\tlet regexPattern = pattern;\r\n\tconst tokens: { type: string; length: number; position: number }[] = [];\r\n\tlet position = 0;\r\n\r\n\t// Split by escape regex first, like the original implementation\r\n\tconst parts = pattern.split( ESCAPE_REGEX ).filter( ( sub ) => sub !== undefined );\r\n\r\n\t// Rebuild pattern and track tokens\r\n\tregexPattern = parts.map( ( sub, index ) => {\r\n\t\t// Skip escaped strings (odd indices after split)\r\n\t\tif ( index % 2 !== 0 ) {\r\n\t\t\treturn sub.replace( /[.*+?^${}()|[\\]\\\\]/g, '\\\\$&' ); // Escape special regex chars\r\n\t\t}\r\n\r\n\t\treturn sub.replace( PATTERN_REGEX, ( match ) => {\r\n\t\t\tconst type = match.charAt( 0 );\r\n\t\t\ttokens.push( { type, length: match.length, position: position++ } );\r\n\r\n\t\t\t// Create appropriate regex for each token type\r\n\t\t\tswitch ( type ) {\r\n\t\t\tcase 'y':\r\n\t\t\t\treturn match.length === 2 ? '(\\\\d{2})' : '(\\\\d{4})';\r\n\t\t\tcase 'M':\r\n\t\t\t\tif ( match.length === 1 ) return '(\\\\d{1,2})';\r\n\t\t\t\tif ( match.length === 2 ) return '(\\\\d{2})';\r\n\t\t\t\tif ( match.length === 3 ) return '([A-Za-z]{3})';\r\n\t\t\t\treturn '([A-Za-z]+)';\r\n\t\t\tcase 'd':\r\n\t\t\t\treturn match.length === 1 ? '(\\\\d{1,2})' : '(\\\\d{2})';\r\n\t\t\tcase 'H':\r\n\t\t\tcase 'h':\r\n\t\t\t\treturn match.length === 1 ? '(\\\\d{1,2})' : '(\\\\d{2})';\r\n\t\t\tcase 'm':\r\n\t\t\tcase 's':\r\n\t\t\t\treturn match.length === 1 ? '(\\\\d{1,2})' : '(\\\\d{2})';\r\n\t\t\tcase 'S':\r\n\t\t\t\treturn `(\\\\d{${match.length}})`;\r\n\t\t\tcase 'a':\r\n\t\t\t\treturn '([aApP][mM])';\r\n\t\t\tcase 'D':\r\n\t\t\t\tif ( match.length === 1 ) return '([A-Za-z])';\r\n\t\t\t\tif ( match.length === 2 ) return '([A-Za-z]{3})';\r\n\t\t\t\treturn '([A-Za-z]+)';\r\n\t\t\tcase 'G':\r\n\t\t\t\tif ( match.length === 1 ) return '([A-Za-z])';\r\n\t\t\t\tif ( match.length === 2 ) return '([A-Za-z]{2})';\r\n\t\t\t\treturn '([A-Za-z\\\\s]+)';\r\n\t\t\tcase 'Z':\r\n\t\t\t\treturn match.length === 1 ? '([A-Za-z0-9+\\\\-:]+)' : '([A-Za-z\\\\s]+)';\r\n\t\t\tcase 'P':\r\n\t\t\t\treturn '([A-Za-z\\\\s]+)';\r\n\t\t\tdefault:\r\n\t\t\t\treturn match;\r\n\t\t\t}\r\n\t\t} );\r\n\t} ).join( '' );\r\n\r\n\tconst regex = new RegExp( '^' + regexPattern + '$' );\r\n\tconst matches = dateString.match( regex );\r\n\r\n\tif ( !matches ) {\r\n\t\tthrow new Error( `Date string \"${dateString}\" does not match pattern \"${pattern}\"` );\r\n\t}\r\n\r\n\t// Extract values from matches using base instant as default\r\n\tlet year = base.year;\r\n\tlet month = base.month;\r\n\tlet day = base.dayOfMonth;\r\n\tlet hour = base.toDate().getUTCHours();\r\n\tlet minute = base.toDate().getUTCMinutes();\r\n\tlet second = base.toDate().getUTCSeconds();\r\n\tlet millisecond = base.toDate().getUTCMilliseconds();\r\n\tlet isPM = false;\r\n\tlet is12Hour = false;\r\n\r\n\ttokens.forEach( ( token, index ) => {\r\n\t\tconst value = matches[ index + 1 ];\r\n\r\n\t\tswitch ( token.type ) {\r\n\t\tcase 'y':\r\n\t\t\tif ( token.length === 2 ) {\r\n\t\t\t\tconst shortYear = parseInt( value, 10 );\r\n\t\t\t\tyear = shortYear < 50 ? 2000 + shortYear : 1900 + shortYear;\r\n\t\t\t} else {\r\n\t\t\t\tyear = parseInt( value, 10 );\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'M':\r\n\t\t\tif ( token.length <= 2 ) {\r\n\t\t\t\tmonth = parseInt( value, 10 ) as TMonth;\r\n\t\t\t} else {\r\n\t\t\t\t// Handle month names - simplified approach\r\n\t\t\t\tconst monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\r\n\t\t\t\t\t'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];\r\n\t\t\t\tconst longMonthNames = [ 'January', 'February', 'March', 'April', 'May', 'June',\r\n\t\t\t\t\t'July', 'August', 'September', 'October', 'November', 'December' ];\r\n\r\n\t\t\t\tlet monthIndex = monthNames.findIndex( name =>\r\n\t\t\t\t\tname.toLowerCase() === value.toLowerCase() );\r\n\t\t\t\tif ( monthIndex === -1 ) {\r\n\t\t\t\t\tmonthIndex = longMonthNames.findIndex( name =>\r\n\t\t\t\t\t\tname.toLowerCase() === value.toLowerCase() );\r\n\t\t\t\t}\r\n\t\t\t\tmonth = ( monthIndex !== -1 ? monthIndex + 1 : 1 ) as TMonth;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'd':\r\n\t\t\tday = parseInt( value, 10 ) as TDayOfMonth;\r\n\t\t\tbreak;\r\n\t\tcase 'H':\r\n\t\t\thour = parseInt( value, 10 );\r\n\t\t\tbreak;\r\n\t\tcase 'h':\r\n\t\t\thour = parseInt( value, 10 );\r\n\t\t\tis12Hour = true;\r\n\t\t\tbreak;\r\n\t\tcase 'm':\r\n\t\t\tminute = parseInt( value, 10 );\r\n\t\t\tbreak;\r\n\t\tcase 's':\r\n\t\t\tsecond = parseInt( value, 10 );\r\n\t\t\tbreak;\r\n\t\tcase 'S':\r\n\t\t\tlet ms = parseInt( value, 10 );\r\n\t\t\t// Normalize to milliseconds based on length\r\n\t\t\tif ( token.length === 1 ) ms *= 100;\r\n\t\t\telse if ( token.length === 2 ) ms *= 10;\r\n\t\t\tmillisecond = ms;\r\n\t\t\tbreak;\r\n\t\tcase 'a':\r\n\t\t\tisPM = value.toLowerCase().includes( 'p' );\r\n\t\t\tbreak;\r\n\t\t}\r\n\t} );\r\n\r\n\t// Handle 12-hour format\r\n\tif ( is12Hour && isPM && hour < 12 ) {\r\n\t\thour += 12;\r\n\t} else if ( is12Hour && !isPM && hour === 12 ) {\r\n\t\thour = 0;\r\n\t}\r\n\r\n\t// Validate each component using standalone validation functions\r\n\tif ( !isValidYear( year ) ) throw new Error( `Invalid year in date string: ${dateString}` );\r\n\tif ( !isValidMonth( month ) ) throw new Error( `Invalid month in date string: ${dateString}` );\r\n\tif ( !isValidDayOfMonth( day ) ) throw new Error( `Invalid day in date string: ${dateString}` );\r\n\tif ( !isValidHour( hour ) ) throw new Error( `Invalid hour in date string: ${dateString}` );\r\n\tif ( !isValidMinute( minute ) ) throw new Error( `Invalid minute in date string: ${dateString}` );\r\n\tif ( !isValidSecond( second ) ) throw new Error( `Invalid second in date string: ${dateString}` );\r\n\tif ( !isValidMillisecond( millisecond ) ) throw new Error( `Invalid millisecond in date string: ${dateString}` );\r\n\r\n\t// Use TimeInstant.fromParameters instead of creating a Date\r\n\treturn TimeInstant.fromParameters( {\r\n\t\tyear,\r\n\t\tmonth: month as TMonth,\r\n\t\tdate: day as TDayOfMonth,\r\n\t\thours: hour as THourOfDay,\r\n\t\tminutes: minute as TMinuteOfHour,\r\n\t\tseconds: second as TSecondOfMinute,\r\n\t\tmilliseconds: millisecond as TMillisecondOfSecond,\r\n\t} );\r\n}\r\n", "import TimeInstant from \"./time/TimeInstant\";\r\nimport { noop, padRight } from \"./utils/_index.js\";\r\n\r\nconst LEVELS = [ \"trace\", \"log\", \"debug\", \"info\", \"warn\", \"error\" ] as const;\r\ntype TLogLevel = keyof Console & typeof LEVELS[ number ]\r\n\r\nconst timestamp = () => TimeInstant.now().format( 'HH:mm:ss' );\r\n\r\nexport type TLoggerOpts = {\r\n\tconsole: Console;\r\n\tenabled: boolean;\r\n\tminLevel: Uppercase<TLogLevel>;\r\n}\r\n\r\nexport class Logger {\r\n\r\n\tprivate enabled: boolean = true;\r\n\tprivate console: Console;\r\n\tprivate minLevel: number;\r\n\r\n\tpublic constructor(\r\n\t\tpublic readonly name: string,\r\n\t\targs?: Partial<TLoggerOpts>\r\n\t) {\r\n\t\tthis.console = args?.console ?? globalThis.console;\r\n\t\tthis.enabled = args?.enabled ?? true;\r\n\t\tthis.minLevel = LEVELS.indexOf( ( args?.minLevel ?? \"DEBUG\" ).toLowerCase() as TLogLevel );\r\n\t}\r\n\r\n\tpublic get trace() { return this.logWrap( 'trace' ); }\r\n\tpublic get log() { return this.logWrap( 'log' ); }\r\n\tpublic get debug() { return this.logWrap( 'debug' ); }\r\n\tpublic get info() { return this.logWrap( 'info' ); }\r\n\tpublic get warn() { return this.logWrap( 'warn' ); }\r\n\tpublic get error() { return this.logWrap( 'error' ); }\r\n\r\n\tprivate logWrap( methodName: TLogLevel ) {\r\n\t\tif ( !this.enabled || !this.console || LEVELS.indexOf( methodName ) < this.minLevel )\r\n\t\t\treturn noop;\r\n\t\treturn this.console[ methodName ].bind( this.console, timestamp(), padRight( methodName.toUpperCase(), 5, ' ' ), this.name );\r\n\t}\r\n\r\n}\r\n\r\nexport default Logger;\r\n", "import type TimeDuration from \"../time/TimeDuration.js\";\r\nimport type TimeInstant from \"../time/TimeInstant.js\";\r\nimport { TBiFunction, TConditionalParameterOptions, TFunction, TKeysOfType, TPositiveNumber, TReadableArray, isDefined, isNullOrUndefined } from \"../utils/_index.js\";\r\nimport { identity } from \"../utils/functions/constant.js\";\r\nimport { TComparisonDirection, TComparisonFunction, TComparisonResult, TStrictComparisonResult } from \"./types.js\";\r\n\r\ntype TCompareValuesOptions = {\r\n\tnullsFirst: boolean;\r\n};\r\ntype TCompareFunctionOptions = {\r\n\tnullsFirst: boolean;\r\n\tdirection: TComparisonDirection;\r\n};\r\n\r\nconst defaultCompareValuesOptions = {\r\n\tnullsFirst: false,\r\n} as const satisfies Partial<TCompareValuesOptions>;\r\nconst defaultCompareFunctionOptions: TCompareFunctionOptions = {\r\n\t...defaultCompareValuesOptions,\r\n\tdirection: 'ASC',\r\n} as const satisfies Partial<TCompareFunctionOptions>;\r\n\r\nconst naturalOrderComparison = <V>( a: V, b: V ) => a < b ? -1 : 1;\r\n\r\nfunction compareValues<V>( a: V, b: V, cmp: TBiFunction<V, V, TComparisonResult>, { nullsFirst }: TCompareValuesOptions ): TComparisonResult {\r\n\tif ( a === b )\r\n\t\treturn 0;\r\n\r\n\tconst nullA = isNullOrUndefined( a );\r\n\tconst nullB = isNullOrUndefined( b );\r\n\tif ( nullA && nullB )\r\n\t\treturn 0;\r\n\tif ( nullA !== nullB )\r\n\t\treturn ( nullA === nullsFirst ) ? -1 : 1;\r\n\r\n\t// A & B are defined and are different.\r\n\treturn cmp( a, b );\r\n}\r\n\r\nfunction compareFunction<T, V>( fn: TFunction<T, V>, cmp: TBiFunction<V, V, TStrictComparisonResult>, { nullsFirst, direction }: TCompareFunctionOptions ): TComparisonFunction<T> {\r\n\treturn ( a: T, b: T ) => applyDirection( compareValues<V>( fn( a ), fn( b ), cmp, { nullsFirst } ), direction );\r\n}\r\n\r\nfunction applyDirection( res: TComparisonResult, direction: TComparisonDirection ): TComparisonResult {\r\n\treturn res * ( direction === 'ASC' ? 1 : -1 ) as TComparisonResult\r\n}\r\n\r\nfunction combine<T, R, S>( f: TFunction<T, R>, g: TFunction<R, S> ): TFunction<T, S> {\r\n\treturn ( t: T ) => g( f( t ) );\r\n}\r\n\r\nfunction reverse<T>( fn: TComparisonFunction<T> ): TComparisonFunction<T> {\r\n\treturn ( a: T, b: T ) => fn( a, b ) * -1 as TComparisonResult;\r\n}\r\n\r\nconst chain = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, cmpFn: TComparisonFunction<T> ): TSorter<T> => {\r\n\treturn doCreateWithFunctions( [ ...fns, cmpFn ] );\r\n}\r\n\r\nconst transformAndChain = <T, R>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, cmpFn: TComparisonFunction<R> ): TSorter<T> => {\r\n\tconst fn: TComparisonFunction<T> = ( a: T, b: T ) => cmpFn( transform( a ), transform( b ) );\r\n\treturn chain( fns, fn );\r\n}\r\nconst compareStrings = <T, R extends string>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TStringComparisonOptions, typeof defaultStringComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction, ignoreCase } = { ...defaultStringComparisonOptions, ...options };\r\n\tif ( ignoreCase )\r\n\t\ttransform = combine<T, R, R>( transform, t => t.toLowerCase() as R );\r\n\treturn chain( fns, compareFunction( transform, naturalOrderComparison, { nullsFirst, direction } ) );\r\n};\r\nconst compareNumbers = <T, R extends number>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TNumberComparisonOptions, typeof defaultNumberComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction } = { ...defaultNumberComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, naturalOrderComparison, { nullsFirst, direction } ) );\r\n};\r\nconst compareDates = <T, R extends Date>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TDateComparisonOptions, typeof defaultDateComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction } = { ...defaultDateComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, naturalOrderComparison, { nullsFirst, direction } ) );\r\n};\r\nconst compareTimeInstants = <T, R extends TimeInstant>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TTimeInstantComparisonOptions, typeof defaultTimeInstantComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction } = { ...defaultTimeInstantComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, ( a, b ) => a.isBefore( b ) ? -1 : 1, { nullsFirst, direction } ) );\r\n};\r\nconst compareTimeDurations = <T, R extends TimeDuration>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TTimeDurationComparisonOptions, typeof defaultTimeDurationComparisonOptions> = {} ) => {\r\n\tconst { nullsFirst, direction } = { ...defaultTimeDurationComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, ( a, b ) => a.isLessThan( b ) ? -1 : 1, { nullsFirst, direction } ) );\r\n};\r\nconst compareBooleans = <T, R extends boolean>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, options: TConditionalParameterOptions<TBooleanComparisonOptions, typeof defaultBooleanComparisonOptions> ) => {\r\n\tconst { nullsFirst, truesFirst } = { ...defaultBooleanComparisonOptions, ...options };\r\n\treturn chain( fns, compareFunction( transform, naturalOrderComparison, { nullsFirst, direction: truesFirst ? 'DESC' : 'ASC' } ) );\r\n};\r\nconst prioritizeSet = <T, R>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, set: ReadonlyArray<R>, reversed = false ) => {\r\n\treturn compareBooleans( fns, ( t: T ) => {\r\n\t\tconst r = transform( t );\r\n\t\treturn isDefined( r ) && set.includes( r );\r\n\t}, { truesFirst: !reversed, nullsFirst: false } );\r\n}\r\nconst prioritizeArray = <T, R>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R>, arr: ReadonlyArray<R>, reversed = false ) => {\r\n\treturn compareNumbers( fns, ( t: T ) => {\r\n\t\tconst r = transform( t );\r\n\t\tif ( !isDefined( r ) ) return Number.MAX_VALUE;\r\n\t\tconst indexOf = arr.indexOf( r );\r\n\t\treturn indexOf === -1 ? Number.MAX_VALUE : indexOf;\r\n\t}, { direction: reversed ? 'DESC' : 'ASC', nullsFirst: false } );\r\n}\r\n\r\nconst next = <T, R>( fns: ReadonlyArray<TComparisonFunction<T>>, transform: TFunction<T, R> ): TSorterStepFull<R, TSorter<T>> => {\r\n\tconst using = <X>( transformToX: TFunction<R, X> ) => {\r\n\t\treturn next( fns, combine( transform, transformToX ) ) satisfies TSorterStepFull<X, TSorter<T>> as any;\r\n\t};\r\n\tconst retAsChainable = {\r\n\t\tchain( chain: TComparable<R> ) {\r\n\t\t\treturn transformAndChain( fns, transform, chain.compare );\r\n\t\t},\r\n\t\tchainFunction( fn: TComparisonFunction<R> ) {\r\n\t\t\treturn transformAndChain( fns, transform, fn );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForChainables<R, TSorter<T>>;\r\n\tconst retAsUsing = {\r\n\t\tusing,\r\n\t} as const satisfies TSorterStepForUsing<R, TSorter<T>>;\r\n\tconst retAsPrioritizable = {\r\n\t\tprioritizing( arr: Array<R>, _options: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> = {} ) {\r\n\t\t\treturn prioritizeArray( fns, transform, arr );\r\n\t\t},\r\n\t\tdeprioritizing( arr: Array<R>, _options: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> = {} ) {\r\n\t\t\treturn prioritizeArray( fns, transform, arr, true );\r\n\t\t},\r\n\t\tprioritizingWithEqualWeight( arr: Array<R>, _options: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> = {} ) {\r\n\t\t\treturn prioritizeSet( fns, transform, arr );\r\n\t\t},\r\n\t\tdeprioritizingWithEqualWeight( arr: Array<R>, _options: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> = {} ) {\r\n\t\t\treturn prioritizeSet( fns, transform, arr, true );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForPrioritizable<any, TSorter<T>>;\r\n\tconst retForRecords = {\r\n\t\t...retAsUsing,\r\n\t\tusingStrings: field => using( t => t[ field ] ),\r\n\t\tusingNumbers: field => using( t => t[ field ] ),\r\n\t\tusingBooleans: field => using( t => t[ field ] ),\r\n\t\tusingDates: field => using( t => t[ field ] ),\r\n\t\tusingTimeInstant: field => using( t => t[ field ] ),\r\n\t\tusingTimeDuration: field => using( t => t[ field ] ),\r\n\t} as const satisfies TSorterStepForRecords<R, TSorter<T>>;\r\n\tconst retForNumbers = {\r\n\t\t...retAsUsing,\r\n\t\tinAscendingOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareNumbers( fns, transform as TFunction<T, number>, { direction: 'ASC', ...opts } );\r\n\t\t},\r\n\t\tinDescendingOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareNumbers( fns, transform as TFunction<T, number>, { direction: 'DESC', ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForNumbers<R, TSorter<T>>;\r\n\tconst retForStringsV1 = {\r\n\t\t...retAsUsing,\r\n\t\tinLexographicalOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'ASC', ignoreCase: false, ...opts } );\r\n\t\t},\r\n\t\tinLexographicalOrderIgnoringCase( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'ASC', ignoreCase: true, ...opts } );\r\n\t\t},\r\n\t\tinReverseLexographicalOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'DESC', ignoreCase: false, ...opts } );\r\n\t\t},\r\n\t\tinReverseLexographicalOrderIgnoringCase( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'DESC', ignoreCase: true, ...opts } );\r\n\t\t},\r\n\t} as const;\r\n\tconst retForStrings = {\r\n\t\t...retAsUsing,\r\n\t\t...retForStringsV1,\r\n\t\tinLexicographicalOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'ASC', ignoreCase: false, ...opts } );\r\n\t\t},\r\n\t\tinLexicographicalOrderIgnoringCase( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'ASC', ignoreCase: true, ...opts } );\r\n\t\t},\r\n\t\tinReverseLexicographicalOrder( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'DESC', ignoreCase: false, ...opts } );\r\n\t\t},\r\n\t\tinReverseLexicographicalOrderIgnoringCase( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareStrings( fns, transform as TFunction<T, string>, { direction: 'DESC', ignoreCase: true, ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForStrings<R, TSorter<T>>;\r\n\tconst retForBooleans = {\r\n\t\t...retAsUsing,\r\n\t\ttruesFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareBooleans( fns, transform as TFunction<T, boolean>, { truesFirst: true, ...opts } );\r\n\t\t},\r\n\t\tfalsesFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareBooleans( fns, transform as TFunction<T, boolean>, { truesFirst: false, ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForBooleans<R, TSorter<T>>;\r\n\tconst retForDates = {\r\n\t\t...retAsUsing,\r\n\t\toldestDateFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareDates( fns, transform as TFunction<T, Date>, { direction: 'ASC', ...opts } );\r\n\t\t},\r\n\t\tnewestDateFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareDates( fns, transform as TFunction<T, Date>, { direction: 'DESC', ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForDates<R, TSorter<T>>;\r\n\tconst retForInstants = {\r\n\t\t...retAsUsing,\r\n\t\toldestFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareTimeInstants( fns, transform as TFunction<T, TimeInstant>, { direction: 'ASC', ...opts } );\r\n\t\t},\r\n\t\tnewestFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareTimeInstants( fns, transform as TFunction<T, TimeInstant>, { direction: 'DESC', ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForTimeInstant<R, TSorter<T>>;\r\n\tconst retForDurations = {\r\n\t\t...retAsUsing,\r\n\t\tlongestFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareTimeDurations( fns, transform as TFunction<T, TimeDuration>, { direction: 'DESC', ...opts } );\r\n\t\t},\r\n\t\tshortestFirst( opts: { nullsFirst?: boolean } = {} ) {\r\n\t\t\treturn compareTimeDurations( fns, transform as TFunction<T, TimeDuration>, { direction: 'ASC', ...opts } );\r\n\t\t},\r\n\t} as const satisfies TSorterStepForTimeDuration<R, TSorter<T>>;\r\n\treturn {\r\n\t\t...retAsPrioritizable,\r\n\t\t...retAsChainable,\r\n\t\t...retForRecords,\r\n\t\t...retForNumbers,\r\n\t\t...retForStrings,\r\n\t\t...retForBooleans,\r\n\t\t...retForDates,\r\n\t\t...retForInstants,\r\n\t\t...retForDurations,\r\n\t} as const satisfies TSorterStepFull<R, TSorter<T>>;\r\n};\r\n\r\nconst createComparisonFunction = <T>( fns: ReadonlyArray<TComparisonFunction<T>> ): TComparisonFunction<T> => {\r\n\treturn ( a: T, b: T ) => {\r\n\t\tlet cmp: TComparisonResult = 0, i: number = 0;\r\n\t\twhile ( i < fns.length && cmp === 0 ) {\r\n\t\t\tcmp = fns[ i++ ]( a, b );\r\n\t\t}\r\n\t\treturn cmp;\r\n\t}\r\n};\r\n\r\nconst compare = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, a: T, b: T ): TComparisonResult => {\r\n\treturn createComparisonFunction( fns )( a, b );\r\n};\r\n\r\nconst sort = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T> ): Array<T> => {\r\n\tconst comparisonFn = createComparisonFunction( fns );\r\n\treturn [ ...arr ].sort( comparisonFn );\r\n};\r\n\r\nconst top = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T>, n: TPositiveNumber ): Array<T> => {\r\n\treturn sort( fns, arr ).slice( 0, Math.max( 0, n ) );\r\n};\r\n\r\nconst bottom = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T>, n: TPositiveNumber ): Array<T> => {\r\n\treturn sort( fns, arr ).slice( -Math.max( 0, n ) ).reverse();\r\n};\r\n\r\nconst first = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T> ): T | null => {\r\n\treturn arr.length ? top( fns, arr, 1 )[ 0 ] : null;\r\n};\r\n\r\nconst last = <T>( fns: ReadonlyArray<TComparisonFunction<T>>, arr: TReadableArray<T> ): T | null => {\r\n\treturn arr.length ? bottom( fns, arr, 1 )[ 0 ] : null;\r\n};\r\n\r\nfunction doCreateEmpty<T>(): TSorterStarter<T> {\r\n\t// If we have no comparison functions, return an object that only has chain methods.\r\n\tconst base = next( [], x => x ) satisfies TSorterStepFull<T, TSorter<T>>;\r\n\tconst ret = {\r\n\t\t...base,\r\n\t\tusingFunction( fn: TComparisonFunction<T> ) {\r\n\t\t\treturn doCreateWithFunctions( [ fn ] );\r\n\t\t}\r\n\t};\r\n\treturn ret as unknown as TSorterStarter<T>;\r\n}\r\n\r\nfunction doCreateWithFunctions<T>( fns: ReadonlyArray<TComparisonFunction<T>> ): TSorter<T> {\r\n\t// If we have some comparison functions, return an object that has chain methods and ending methods.\r\n\treturn {\r\n\t\tget then() {\r\n\t\t\treturn next( fns, identity ) satisfies TSorterStepFull<T, TSorter<T>> as any;\r\n\t\t},\r\n\t\treversed() {\r\n\t\t\treturn doCreateWithFunctions( [ ...fns.map( reverse ) ] );\r\n\t\t},\r\n\t\tcompare: ( a: T, b: T ) => {\r\n\t\t\treturn compare( fns, a, b )\r\n\t\t},\r\n\t\tsort: ( arr: TReadableArray<T> ): Array<T> => {\r\n\t\t\treturn sort( fns, arr );\r\n\t\t},\r\n\t\ttop: ( arr: TReadableArray<T>, n: TPositiveNumber ): Array<T> => {\r\n\t\t\treturn top( fns, arr, n );\r\n\t\t},\r\n\t\tbottom: ( arr: TReadableArray<T>, n: TPositiveNumber ): Array<T> => {\r\n\t\t\treturn bottom( fns, arr, n );\r\n\t\t},\r\n\t\tfirst: ( arr: TReadableArray<T> ): T | null => {\r\n\t\t\treturn first( fns, arr );\r\n\t\t},\r\n\t\tlast: ( arr: TReadableArray<T> ): T | null => {\r\n\t\t\treturn last( fns, arr );\r\n\t\t},\r\n\t} as const satisfies TSorter<T>;\r\n}\r\n\r\ntype TComparable<T> = { compare: TComparisonFunction<T> };\r\n\r\nexport type TSorter<T> = {\r\n\tget then(): TSorterStep<T, TSorter<T>>;\r\n\treversed: () => TSorter<T>;\r\n\r\n\tcompare: TComparisonFunction<T>;\r\n\tsort: ( arr: TReadableArray<T> ) => Array<T>;\r\n\ttop: ( arr: TReadableArray<T>, n: TPositiveNumber ) => Array<T>;\r\n\tbottom: ( arr: TReadableArray<T>, n: TPositiveNumber ) => Array<T>;\r\n\tfirst: ( arr: TReadableArray<T> ) => T | null;\r\n\tlast: ( arr: TReadableArray<T> ) => T | null;\r\n}\r\n\r\ntype TSorterStepForRecords<T, Ret> = {\r\n\tusingStrings: ( field: TKeysOfType<T, string> ) => TSorterStepUsing<string, Ret>;\r\n\tusingNumbers: ( field: TKeysOfType<T, number> ) => TSorterStepUsing<number, Ret>;\r\n\tusingBooleans: ( field: TKeysOfType<T, boolean> ) => TSorterStepUsing<boolean, Ret>;\r\n\tusingDates: ( field: TKeysOfType<T, Date> ) => TSorterStepUsing<Date, Ret>;\r\n\tusingTimeInstant: ( field: TKeysOfType<T, TimeInstant> ) => TSorterStepUsing<TimeInstant, Ret>;\r\n\tusingTimeDuration: ( field: TKeysOfType<T, TimeDuration> ) => TSorterStepUsing<TimeDuration, Ret>;\r\n};\r\ntype TSorterStepForNumbers<_T, Ret> = {\r\n\tinAscendingOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinDescendingOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForStrings<_T, Ret> = {\r\n\t/** @deprecated: Use inLexographicalOrder instead */ inLexographicalOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\t/** @deprecated: Use inLexographicalOrderIgnoringCase instead */ inLexographicalOrderIgnoringCase( opts?: { nullsFirst?: boolean } ): Ret;\r\n\t/** @deprecated: Use inReverseLexographicalOrder instead */ inReverseLexographicalOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\t/** @deprecated: Use inReverseLexographicalOrderIgnoringCase instead */ inReverseLexographicalOrderIgnoringCase( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinLexicographicalOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinLexicographicalOrderIgnoringCase( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinReverseLexicographicalOrder( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tinReverseLexicographicalOrderIgnoringCase( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForBooleans<_T, Ret> = {\r\n\ttruesFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tfalsesFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForDates<_T, Ret> = {\r\n\toldestDateFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tnewestDateFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForTimeInstant<_T, Ret> = {\r\n\toldestFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tnewestFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForTimeDuration<_T, Ret> = {\r\n\tlongestFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n\tshortestFirst( opts?: { nullsFirst?: boolean } ): Ret;\r\n};\r\ntype TSorterStepForChainables<T, Ret> = {\r\n\tchain: ( chain: TComparable<T> ) => Ret;\r\n\tchainFunction: ( fn: TComparisonFunction<T> ) => Ret;\r\n};\r\ntype TSorterStepForUsing<T, Ret> = {\r\n\tusing: <X>( transform: TFunction<T, X> ) => TSorterStepUsing<X, Ret>;\r\n};\r\ntype TSorterStepForPrioritizable<T extends string | number, Ret> = {\r\n\tprioritizing( arr: T[], options?: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> ): Ret;\r\n\tdeprioritizing( arr: Array<T>, options?: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> ): Ret;\r\n\tprioritizingWithEqualWeight( arr: T[], options?: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> ): Ret;\r\n\tdeprioritizingWithEqualWeight( arr: Array<T>, options?: TConditionalParameterOptions<TPrioritizeOptions, typeof defaultPrioritizeOptions> ): Ret;\r\n};\r\ntype TSorterStepUsing<T, Ret> = {}\r\n\t& ( T extends Record<string | number | symbol, unknown> ? TSorterStepForRecords<T, Ret> : {} )\r\n\t& ( T extends number ? TSorterStepForNumbers<T, Ret> : {} )\r\n\t& ( T extends string ? TSorterStepForStrings<T, Ret> : {} )\r\n\t& ( T extends boolean ? TSorterStepForBooleans<T, Ret> : {} )\r\n\t& ( T extends Date ? TSorterStepForDates<T, Ret> : {} )\r\n\t& ( T extends TimeInstant ? TSorterStepForTimeInstant<T, Ret> : {} )\r\n\t& ( T extends TimeDuration ? TSorterStepForTimeDuration<T, Ret> : {} )\r\n\t& ( T extends string ? TSorterStepForPrioritizable<string, Ret> : {} ) // Allowing all types of strings here is needed because literal types extending strings create compilation problems with method signatures (T[] where T = 'A' | 'B' becomes 'A'[] & 'B'[])\r\n\t& ( T extends number ? TSorterStepForPrioritizable<number, Ret> : {} ) // Allowing all types of numbers here is needed because literal types extending numbers create compilation problems with method signatures (T[] where T = 1 | 2 becomes 1[] & 2[])\r\n\t;\r\ntype TSorterStep<T, Ret> = TSorterStepUsing<T, Ret>\r\n\t& TSorterStepForChainables<T, Ret>\r\n\t& TSorterStepForUsing<T, Ret>\r\n\t;\r\ntype TSorterStepFull<T, Ret> = TSorterStepForRecords<T, Ret>\r\n\t& TSorterStepForNumbers<T, Ret>\r\n\t& TSorterStepForStrings<T, Ret>\r\n\t& TSorterStepForBooleans<T, Ret>\r\n\t& TSorterStepForDates<T, Ret>\r\n\t& TSorterStepForTimeInstant<T, Ret>\r\n\t& TSorterStepForTimeDuration<T, Ret>\r\n\t& TSorterStepForChainables<T, Ret>\r\n\t& TSorterStepForUsing<T, Ret>\r\n\t;\r\ntype TSorterStarter<T> = TSorterStepUsing<T, TSorter<T>> & TSorterStepForUsing<T, TSorter<T>> & { usingFunction: ( fn: TComparisonFunction<T> ) => TSorter<T> };\r\nexport type TSorterBuilder<T> = ( builder: TSorterStarter<T> ) => TSorter<T>;\r\n\r\ntype TStringComparisonOptions = TCompareFunctionOptions & { ignoreCase: boolean };\r\nconst defaultStringComparisonOptions = { ...defaultCompareFunctionOptions, ignoreCase: false } as const satisfies Partial<TStringComparisonOptions>;\r\n\r\ntype TNumberComparisonOptions = TCompareFunctionOptions;\r\nconst defaultNumberComparisonOptions = { ...defaultCompareFunctionOptions } as const satisfies Partial<TNumberComparisonOptions>;\r\n\r\ntype TDateComparisonOptions = TCompareFunctionOptions;\r\nconst defaultDateComparisonOptions = { ...defaultCompareFunctionOptions } as const satisfies Partial<TDateComparisonOptions>;\r\n\r\ntype TTimeInstantComparisonOptions = TCompareFunctionOptions;\r\nconst defaultTimeInstantComparisonOptions = { ...defaultCompareFunctionOptions } as const satisfies Partial<TTimeInstantComparisonOptions>;\r\n\r\ntype TTimeDurationComparisonOptions = TCompareFunctionOptions;\r\nconst defaultTimeDurationComparisonOptions = { ...defaultCompareFunctionOptions } as const satisfies Partial<TTimeDurationComparisonOptions>;\r\n\r\ntype TBooleanComparisonOptions = TCompareValuesOptions & { truesFirst: boolean };\r\nconst defaultBooleanComparisonOptions = { ...defaultCompareValuesOptions } as const satisfies Partial<TBooleanComparisonOptions>;\r\n\r\ntype TPrioritizeOptions = {};\r\nconst defaultPrioritizeOptions = {} as const satisfies Partial<TPrioritizeOptions>;\r\n\r\nexport const Sorter = {\r\n\tcreateFor: <T>( _template?: T ) => doCreateEmpty<T>(),\r\n\tsort: <T>( arr: TReadableArray<T>, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).sort( arr ),\r\n\ttop: <T>( arr: TReadableArray<T>, n: TPositiveNumber, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).top( arr, n ),\r\n\tbottom: <T>( arr: TReadableArray<T>, n: TPositiveNumber, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).bottom( arr, n ),\r\n\tfirst: <T>( arr: TReadableArray<T>, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).first( arr ),\r\n\tlast: <T>( arr: TReadableArray<T>, builder: TSorterBuilder<T> ) => builder( doCreateEmpty() ).last( arr ),\r\n};\r\nexport default Sorter;\r\n", "import { randomNumberInInterval } from \"../utils/random.js\";\r\nimport TimeDuration from \"./TimeDuration.js\";\r\nimport { TimeUnit } from \"./TimeUnit.js\";\r\n\r\nfunction randomize( unit: TimeUnit ) {\r\n\treturn ( a: number, b: number ) => {\r\n\t\treturn TimeDuration.fromMs( randomNumberInInterval( unit.toMs( a ), unit.toMs( b ) ) );\r\n\t}\r\n}\r\n\r\nexport default class RandomTimeDuration {\r\n\r\n\tprivate constructor() {}\r\n\r\n\tpublic static ms = randomize( TimeUnit.MILLISECONDS );\r\n\tpublic static seconds = randomize( TimeUnit.SECONDS );\r\n\tpublic static minutes = randomize( TimeUnit.MINUTES );\r\n\tpublic static hours = randomize( TimeUnit.HOURS );\r\n\tpublic static days = randomize( TimeUnit.DAYS );\r\n\r\n}\r\n", "import { TPositiveNumber } from \"../utils/_index\";\r\nimport TimeDuration from \"./TimeDuration\";\r\n\r\nexport default class TimeFrequency {\r\n\r\n\tpublic constructor(\r\n\t\tpublic readonly times: TPositiveNumber,\r\n\t\tpublic readonly period: TimeDuration,\r\n\t) { \r\n\t\tif ( isNaN( times ) || times <= 0 )\r\n\t\t\tthrow new Error();\r\n\t\tif ( period.isEmpty() )\r\n\t\t\tthrow new Error();\r\n\t}\r\n\r\n\tpublic get frequency() {\r\n\t\treturn this.period.divideBy( this.times );\r\n\t}\r\n\r\n\tpublic static onceEvery( period: TimeDuration ) {\r\n\t\treturn new TimeFrequency( 1, period );\r\n\t}\r\n\r\n\tpublic static twiceEvery( period: TimeDuration ) {\r\n\t\treturn new TimeFrequency( 2, period );\r\n\t}\r\n\r\n}\r\n", "import { TimeDuration } from \"./_index.js\";\r\nimport TimeInstant from \"./TimeInstant.js\";\r\n\r\nexport class TimeRange {\r\n\r\n\tpublic readonly end: TimeInstant;\r\n\r\n\tprotected constructor(\r\n\t\tpublic readonly start: TimeInstant,\r\n\t\tpublic readonly duration: TimeDuration\r\n\t) {\r\n\t\tthis.end = start.addDuration( duration );\r\n\t}\r\n\r\n\tpublic static fromInstants( a: TimeInstant, b: TimeInstant ) {\r\n\t\tconst lowest = TimeInstant.lowest( a, b );\r\n\t\tconst highest = TimeInstant.highest( a, b );\r\n\t\treturn new TimeRange( lowest, lowest.distanceFrom( highest ) );\r\n\t}\r\n\r\n\tpublic static fromInstantWithDuration( a: TimeInstant, d: TimeDuration ) {\r\n\t\treturn new TimeRange( a, d );\r\n\t}\r\n\r\n\tpublic static fromNowWithDuration( d: TimeDuration ) {\r\n\t\treturn new TimeRange( TimeInstant.now(), d );\r\n\t}\r\n\r\n}\r\n", "\r\n\r\nexport class UnavailableUpgradeError<T> extends Error {\r\n\r\n\tconstructor(\r\n\t\tpublic readonly data: T,\r\n\t\tpublic readonly from: number,\r\n\t\tpublic readonly to: number\r\n\t) {\r\n\t\tsuper( `No transition found to upgrade data from version ${from} to version ${to}.` );\r\n\t}\r\n\r\n}\r\n\r\nexport class EmptyUpgradeError<T> extends Error {\r\n\r\n\tconstructor(\r\n\t\tpublic readonly data: T,\r\n\t\tpublic readonly from: number,\r\n\t\tpublic readonly to: number,\r\n\t) {\r\n\t\tsuper( `Transition from version ${ from } to version ${ to } resulted in empty data` );\r\n\t}\r\n\r\n}\r\n", "\r\nimport { TMaybe } from \"../utils/_index\";\r\nimport { TTransition, TTransitionMatrix, TUpgradable } from \"./types\";\r\n\r\nconst DEBUG_ENABLED = false;\r\n\r\nexport default function getTransitionsPath<\r\n\tXStar extends TUpgradable,\r\n\tXFromNumber extends XStar[ \"$version\" ],\r\n\tXToNumber extends XStar[ \"$version\" ]\r\n>(\r\n\tmatrix: TTransitionMatrix<XStar>,\r\n\tfrom: XFromNumber,\r\n\tto: XToNumber\r\n): TMaybe<TTransition<XStar, XFromNumber, XToNumber>[]> {\r\n\treturn internalGetTransitionsPath( matrix, from, to, 0, DEBUG_ENABLED );\r\n}\r\n\r\nfunction internalGetTransitionsPath<\r\n\tXStar extends TUpgradable,\r\n\tXFromNumber extends XStar[ \"$version\" ],\r\n\tXToNumber extends XStar[ \"$version\" ]\r\n>(\r\n\tmatrix: TTransitionMatrix<XStar>,\r\n\tfrom: XFromNumber,\r\n\tto: XToNumber,\r\n\tdepth: number,\r\n\tdebug: boolean,\r\n): TMaybe<TTransition<XStar, any, any>[]> {\r\n\r\n\tdebugLog( debug, depth, from, to, 'Search started.' );\r\n\r\n\tconst transitionsTo = matrix[ to ];\r\n\tif ( !transitionsTo ) {\r\n\t\tdebugLog( debug, depth, from, to, 'No transitions available to this version' );\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// Check if there is a transition that goes directly from from to to.\r\n\tconst exactTransition = transitionsTo[ from ];\r\n\tif ( exactTransition ) {\r\n\t\tdebugLog( debug, depth, from, to, 'Found exact transition.' );\r\n\t\treturn [ exactTransition ];\r\n\t}\r\n\r\n\t// Otherwise, recursively search for the min path.\r\n\tconst keys = Object.keys( transitionsTo );\r\n\treturn keys.reduce( ( curBestPath: TMaybe<TTransition<XStar, any, any>[]>, transitionKey: string ) => {\r\n\t\tconst transition = transitionsTo[ transitionKey as unknown as XStar[ \"$version\" ] ]!;\r\n\t\tconst path = internalGetTransitionsPath( matrix, from, transition.from, depth + 1, debug );\r\n\t\tif ( path === null ) {\r\n\t\t\tdebugLog( debug, depth + 1, from, transition.from, 'No path found.' );\r\n\t\t\treturn curBestPath;\r\n\t\t} else {\r\n\t\t\tif ( curBestPath === null || curBestPath.length > path.length + 1 ) {\r\n\t\t\t\tdebugLog( debug, depth + 1, from, transition.from, 'New best path found: ' + printTransitions( path ) );\r\n\t\t\t\treturn [ ...path, transition ];\r\n\t\t\t} else {\r\n\t\t\t\treturn curBestPath;\r\n\t\t\t}\r\n\t\t}\r\n\t}, null as TMaybe<TTransition<XStar, any, any>[]> );\r\n\r\n}\r\n\r\nfunction debugLog(\r\n\tenabled: boolean,\r\n\tdepth: number,\r\n\tfrom: number,\r\n\tto: number,\r\n\tmessage: string\r\n) {\r\n\tif ( !enabled )\r\n\t\treturn;\r\n\t// istanbul ignore next\r\n\t// eslint-disable-next-line no-restricted-globals\r\n\tconsole.info(\r\n\t\t'#'.repeat( depth + 1 ),\r\n\t\tfrom + ' -> ' + to,\r\n\t\tmessage\r\n\t);\r\n}\r\n\r\nfunction printTransitions( transitions: TTransition<any, any, any>[] ): string {\r\n\treturn transitions.reduce( ( ret, cur ) => {\r\n\t\treturn ret + \" -> \" + cur.to;\r\n\t}, \"\" + transitions[ 0 ].from );\r\n}\r\n\r\n", "\r\nimport { isDefined, isNumber, isPositiveNumber, jsonCloneDeep, TJsonSerializable } from \"../utils/_index.js\";\r\nimport { EmptyUpgradeError, UnavailableUpgradeError } from \"./errors\";\r\nimport getTransitionsPath from \"./getTransitionsPath\";\r\nimport { TPossibleFromVersion, TPossibleVersion, TTransitionMatrix, TUpgradable, TUpgradeFunction, TVersionMap } from \"./types\";\r\n\r\nconst VERSION_FIELD = \"$version\";\r\n\r\nexport interface IDataUpgrader<XStar extends TUpgradable, XLatest extends XStar> {\r\n\tupgrade( data: XStar ): Promise<XLatest>;\r\n}\r\n\r\nexport class DataUpgrader<X extends TUpgradable, XLatest extends X> implements IDataUpgrader<X, XLatest> {\r\n\r\n\tprivate transitions: TTransitionMatrix<X> = {};\r\n\r\n\tprivate constructor(\r\n\t\tprivate latestVersion: XLatest[ typeof VERSION_FIELD ]\r\n\t) { }\r\n\r\n\tpublic addTransition<\r\n\t\tXFrom extends TVersionMap<X>[ XFromNumber ],\r\n\t\tXTo extends TVersionMap<X>[ XToNumber ],\r\n\t\tXFromNumber extends TPossibleFromVersion<X, XLatest>,\r\n\t\tXToNumber extends Exclude<TPossibleVersion<X>, XFromNumber>,\r\n\t>(\r\n\t\tfrom: XFromNumber,\r\n\t\tto: XToNumber,\r\n\t\tapply: TUpgradeFunction<X, XFrom, XTo>\r\n\t): this {\r\n\t\tif ( from === undefined || from < 0 )\r\n\t\t\tthrow new Error( `Invalid argument from, non-negative number expected, got: ${from}` );\r\n\t\tif ( to === undefined || to <= 0 )\r\n\t\t\tthrow new Error( `Invalid argument to, positive number expected, got: ${to}` );\r\n\t\tif ( to <= from )\r\n\t\t\tthrow new Error( `Invalid argument to, expected number greater than ${from}, got: ${to}` );\r\n\t\tif ( to > this.latestVersion )\r\n\t\t\tthrow new Error( `Invalid argument to, expected number lower than ${this.latestVersion}, got: ${to}` );\r\n\t\tif ( this.transitions[ to ]?.[ from ] )\r\n\t\t\tthrow new Error( `Invalid transition arguments, duplicated transition found from ${from} to ${to}` );\r\n\t\tconst toMatrix: TTransitionMatrix<X>[ XTo[ typeof VERSION_FIELD ] ] = this.transitions[ to ] ?? {};\r\n\t\ttoMatrix[ from ] = { from, to, apply };\r\n\t\tthis.transitions[ to ] = toMatrix;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic async upgrade( data: X ): Promise<XLatest> {\r\n\t\tif ( !data || typeof data !== \"object\" )\r\n\t\t\tthrow new Error( `Invalid argument data, object expected, got: ${typeof data}.` );\r\n\t\tif ( data.$version === null || data.$version === undefined || typeof data.$version !== \"number\" )\r\n\t\t\tthrow new Error( `Invalid argument data, version metadata required, got: ${data.$version as unknown as string}` );\r\n\t\tif ( data.$version > this.latestVersion )\r\n\t\t\tthrow new Error( `Invalid argument data, version metadata is in the future: ${data.$version}, current: ${this.latestVersion}` );\r\n\t\tif ( this.isLatestVersion( data ) )\r\n\t\t\treturn data;\r\n\r\n\t\tconst from = data.$version;\r\n\t\tconst to = this.latestVersion;\r\n\t\tconst path = getTransitionsPath<X, typeof from, XLatest[ typeof VERSION_FIELD ]>( this.transitions, from, to );\r\n\t\tif ( path === null )\r\n\t\t\tthrow new UnavailableUpgradeError( data, from, to );\r\n\r\n\t\tlet current: X = jsonCloneDeep( data );\r\n\t\tfor ( const transition of path ) {\r\n\t\t\tconst next = await transition.apply( current as any );\r\n\t\t\tif ( next === null || next === undefined )\r\n\t\t\t\tthrow new EmptyUpgradeError( current, from, to );\r\n\t\t\tcurrent = next;\r\n\t\t}\r\n\r\n\t\treturn current as XLatest;\r\n\t}\r\n\r\n\tpublic isLatestVersion( data: X ): data is XLatest {\r\n\t\treturn data.$version === this.latestVersion;\r\n\t}\r\n\r\n\tpublic static create<\r\n\t\tX extends TUpgradable,\r\n\t\tXLatestVersion extends X,\r\n\t>(\r\n\t\tlatest: XLatestVersion[ typeof VERSION_FIELD ]\r\n\t) {\r\n\t\treturn new DataUpgrader<X, XLatestVersion>( latest );\r\n\t}\r\n\r\n\tpublic static Errors = {\r\n\t\tEmptyUpgrade: EmptyUpgradeError,\r\n\t\tUnavailableUpgrade: UnavailableUpgradeError\r\n\t} as const;\r\n\r\n}\r\n\r\nexport function isUpgradable( obj: TJsonSerializable ): obj is TUpgradable {\r\n\treturn isDefined( obj ) && typeof obj === \"object\" && VERSION_FIELD in obj && isNumber( obj.$version ) && isPositiveNumber( obj.$version );\r\n}\r\n\r\nexport default DataUpgrader;\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["arr", "min", "max", "partition", "dict", "min", "max", "min", "max", "tail", "getFromDate", "timestamp", "timestamp", "monthNames", "reverse", "chain", "first", "last", "next"]
|
|
7
7
|
}
|