@byloth/core 2.0.0-rc.6 → 2.0.0-rc.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sources":["../src/helpers.ts","../src/models/exceptions/core.ts","../src/models/exceptions/index.ts","../src/models/iterators/smart-iterator.ts","../src/models/aggregators/reduced-iterator.ts","../src/models/aggregators/aggregated-async-iterator.ts","../src/models/iterators/smart-async-iterator.ts","../src/models/aggregators/aggregated-iterator.ts","../src/models/game-loop.ts","../src/models/json/json-storage.ts","../src/models/promises/smart-promise.ts","../src/models/promises/deferred-promise.ts","../src/models/promises/thenable.ts","../src/models/promises/timed-promise.ts","../src/models/publisher.ts","../src/utils/date.ts","../src/models/timers/clock.ts","../src/models/timers/countdown.ts","../src/utils/random.ts","../src/utils/async.ts","../src/utils/dom.ts","../src/utils/iterator.ts","../src/utils/math.ts","../src/utils/string.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\n\n// @ts-ignore\nexport const isBrowser = ((typeof window !== \"undefined\") && (typeof window.document !== \"undefined\"));\n\n// @ts-ignore\nexport const isNode = ((typeof process !== \"undefined\") && (process.versions?.node));\n\n// @ts-ignore\nexport const isWebWorker = ((typeof self === \"object\") && (self.constructor?.name === \"DedicatedWorkerGlobalScope\"));\n","export default class Exception extends Error\n{\n public static FromUnknown(error: unknown): Exception\n {\n if (error instanceof Exception)\n {\n return error;\n }\n if (error instanceof Error)\n {\n const exc = new Exception(error.message);\n\n exc.stack = error.stack;\n exc.name = error.name;\n\n return exc;\n }\n\n return new Exception(`${error}`);\n }\n\n public constructor(message: string, cause?: unknown, name = \"Exception\")\n {\n super(message);\n\n this.cause = cause;\n this.name = name;\n\n if (cause)\n {\n if (cause instanceof Error)\n {\n this.stack += `\\n\\nCaused by ${cause.stack}`;\n }\n else\n {\n this.stack += `\\n\\nCaused by ${cause}`;\n }\n }\n }\n\n public readonly [Symbol.toStringTag]: string = \"Exception\";\n}\n\nexport class FatalErrorException extends Exception\n{\n public constructor(message?: string, cause?: unknown, name = \"FatalErrorException\")\n {\n if (message === undefined)\n {\n message = \"The program has encountered an unrecoverable error and cannot continue as expected. \" +\n \"Please, try again later. If the problem persists, contact the support team.\";\n }\n\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"FatalErrorException\";\n}\nexport class NotImplementedException extends FatalErrorException\n{\n public constructor(message?: string, cause?: unknown, name = \"NotImplementedException\")\n {\n if (message === undefined)\n {\n message = \"This feature is not implemented yet. Please, try again later.\";\n }\n\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"NotImplementedException\";\n}\n","import Exception from \"./core.js\";\n\nexport class FileException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"FileException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"FileException\";\n}\nexport class FileExistsException extends FileException\n{\n public constructor(message: string, cause?: unknown, name = \"FileExistsException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"FileExistsException\";\n}\nexport class FileNotFoundException extends FileException\n{\n public constructor(message: string, cause?: unknown, name = \"FileNotFoundException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"FileNotFoundException\";\n}\n\nexport class KeyException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"KeyException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"KeyException\";\n}\nexport class NetworkException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"NetworkException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"NetworkException\";\n}\nexport class PermissionException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"PermissionException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"PermissionException\";\n}\nexport class ReferenceException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"ReferenceException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"ReferenceException\";\n}\n\nexport class RuntimeException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"RuntimeException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"RuntimeException\";\n}\nexport class EnvironmentException extends RuntimeException\n{\n public constructor(message: string, cause?: unknown, name = \"EnvironmentException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"EnvironmentException\";\n}\n\nexport class TimeoutException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"TimeoutException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"TimeoutException\";\n}\nexport class TypeException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"TypeException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"TypeException\";\n}\n\nexport class ValueException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"ValueException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"ValueException\";\n}\nexport class RangeException extends ValueException\n{\n public constructor(message: string, cause?: unknown, name = \"RangeException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"RangeException\";\n}\n\nexport { Exception };\nexport { FatalErrorException, NotImplementedException } from \"./core.js\";\n","import AggregatedIterator from \"../aggregators/aggregated-iterator.js\";\nimport { ValueException } from \"../exceptions/index.js\";\n\nimport type { GeneratorFunction, Iteratee, TypeGuardIteratee, Reducer, IteratorLike } from \"./types.js\";\n\nexport default class SmartIterator<T, R = void, N = undefined> implements Iterator<T, R, N>\n{\n protected _iterator: Iterator<T, R, N>;\n\n public return?: (value?: R) => IteratorResult<T, R>;\n public throw?: (error?: unknown) => IteratorResult<T, R>;\n\n public constructor(iterable: Iterable<T, R, N>);\n public constructor(iterator: Iterator<T, R, N>);\n public constructor(generatorFn: GeneratorFunction<T, R, N>);\n public constructor(argument: IteratorLike<T, R, N> | GeneratorFunction<T, R, N>);\n public constructor(argument: IteratorLike<T, R, N> | GeneratorFunction<T, R, N>)\n {\n if (argument instanceof Function)\n {\n this._iterator = argument();\n }\n else if (Symbol.iterator in argument)\n {\n this._iterator = argument[Symbol.iterator]() as Iterator<T, R, N>;\n }\n else\n {\n this._iterator = argument;\n }\n\n if (this._iterator.return) { this.return = (value) => this._iterator.return!(value); }\n if (this._iterator.throw) { this.throw = (error) => this._iterator.throw!(error); }\n }\n\n public every(predicate: Iteratee<T, boolean>): boolean\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n\n if (result.done) { return true; }\n if (!(predicate(result.value, index))) { return false; }\n\n index += 1;\n }\n }\n public some(predicate: Iteratee<T, boolean>): boolean\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n\n if (result.done) { return false; }\n if (predicate(result.value, index)) { return true; }\n\n index += 1;\n }\n }\n\n public filter(predicate: Iteratee<T, boolean>): SmartIterator<T, R>;\n public filter<S extends T>(predicate: TypeGuardIteratee<T, S>): SmartIterator<S, R>;\n public filter(predicate: Iteratee<T, boolean>): SmartIterator<T, R>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<T, R>(function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = iterator.next();\n\n if (result.done) { return result.value; }\n if (predicate(result.value, index)) { yield result.value; }\n\n index += 1;\n }\n });\n }\n public map<V>(iteratee: Iteratee<T, V>): SmartIterator<V, R>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<V, R>(function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n yield iteratee(result.value, index);\n\n index += 1;\n }\n });\n }\n public reduce(reducer: Reducer<T, T>): T;\n public reduce<A>(reducer: Reducer<T, A>, initialValue: A): A;\n public reduce<A>(reducer: Reducer<T, A>, initialValue?: A): A\n {\n let index = 0;\n let accumulator = initialValue;\n if (accumulator === undefined)\n {\n const result = this._iterator.next();\n if (result.done) { throw new ValueException(\"Cannot reduce an empty iterator without an initial value.\"); }\n\n accumulator = (result.value as unknown) as A;\n index += 1;\n }\n\n while (true)\n {\n const result = this._iterator.next();\n if (result.done) { return accumulator; }\n\n accumulator = reducer(accumulator, result.value, index);\n\n index += 1;\n }\n }\n\n public flatMap<V>(iteratee: Iteratee<T, Iterable<V>>): SmartIterator<V, R>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<V, R>(function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n const iterable = iteratee(result.value, index);\n for (const value of iterable)\n {\n yield value;\n }\n\n index += 1;\n }\n });\n }\n\n public drop(count: number): SmartIterator<T, R | undefined>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<T, R | undefined>(function* ()\n {\n let index = 0;\n while (index < count)\n {\n const result = iterator.next();\n if (result.done) { return; }\n\n index += 1;\n }\n\n while (true)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n }\n });\n }\n public take(limit: number): SmartIterator<T, R | undefined>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<T, R | undefined>(function* ()\n {\n let index = 0;\n while (index < limit)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n\n index += 1;\n }\n\n return;\n });\n }\n\n public find(predicate: Iteratee<T, boolean>): T | undefined;\n public find<S extends T>(predicate: TypeGuardIteratee<T, S>): S | undefined;\n public find(predicate: Iteratee<T, boolean>): T | undefined\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n\n if (result.done) { return; }\n if (predicate(result.value, index)) { return result.value; }\n\n index += 1;\n }\n }\n\n public enumerate(): SmartIterator<[number, T], R>\n {\n return this.map((value, index) => [index, value]);\n }\n public unique(): SmartIterator<T, R>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<T, R>(function* ()\n {\n const values = new Set<T>();\n\n while (true)\n {\n const result = iterator.next();\n\n if (result.done) { return result.value; }\n if (values.has(result.value)) { continue; }\n\n values.add(result.value);\n\n yield result.value;\n }\n });\n }\n\n public count(): number\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n if (result.done) { return index; }\n\n index += 1;\n }\n }\n\n public forEach(iteratee: Iteratee<T>): void\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n if (result.done) { return; }\n\n iteratee(result.value, index);\n\n index += 1;\n }\n }\n\n public next(...values: N extends undefined ? [] : [N]): IteratorResult<T, R>\n {\n return this._iterator.next(...values);\n }\n\n public groupBy<K extends PropertyKey>(iteratee: Iteratee<T, K>): AggregatedIterator<K, T>\n {\n return new AggregatedIterator(this.map((element, index) =>\n {\n const key = iteratee(element, index);\n\n return [key, element] as [K, T];\n }));\n }\n\n public toArray(): T[]\n {\n return Array.from(this as Iterable<T>);\n }\n\n public readonly [Symbol.toStringTag]: string = \"SmartIterator\";\n\n public [Symbol.iterator](): SmartIterator<T, R, N> { return this; }\n}\n","import { ValueException } from \"../exceptions/index.js\";\nimport { SmartIterator } from \"../iterators/index.js\";\nimport type { GeneratorFunction } from \"../iterators/types.js\";\n\nimport AggregatedIterator from \"./aggregated-iterator.js\";\nimport type { KeyedIteratee, KeyedReducer, KeyedTypeGuardIteratee } from \"./types.js\";\n\nexport default class ReducedIterator<K extends PropertyKey, T>\n{\n protected _elements: SmartIterator<[K, T]>;\n\n public constructor(iterable: Iterable<[K, T]>);\n public constructor(iterator: Iterator<[K, T]>);\n public constructor(generatorFn: GeneratorFunction<[K, T]>);\n public constructor(argument: Iterable<[K, T]> | Iterator<[K, T]> | GeneratorFunction<[K, T]>);\n public constructor(argument: Iterable<[K, T]> | Iterator<[K, T]> | GeneratorFunction<[K, T]>)\n {\n this._elements = new SmartIterator(argument);\n }\n\n public every(predicate: KeyedIteratee<K, T, boolean>): boolean\n {\n for (const [index, [key, element]] of this._elements.enumerate())\n {\n if (!(predicate(key, element, index))) { return false; }\n }\n\n return true;\n }\n public some(predicate: KeyedIteratee<K, T, boolean>): boolean\n {\n for (const [index, [key, element]] of this._elements.enumerate())\n {\n if (predicate(key, element, index)) { return true; }\n }\n\n return false;\n }\n\n public filter(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, T>;\n public filter<S extends T>(predicate: KeyedTypeGuardIteratee<K, T, S>): ReducedIterator<K, S>;\n public filter(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, T>\n {\n const elements = this._elements.enumerate();\n\n return new ReducedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n if (predicate(key, element, index)) { yield [key, element]; }\n }\n });\n }\n public map<V>(iteratee: KeyedIteratee<K, T, V>): ReducedIterator<K, V>\n {\n const elements = this._elements.enumerate();\n\n return new ReducedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n yield [key, iteratee(key, element, index)];\n }\n });\n }\n public reduce(reducer: KeyedReducer<K, T, T>): T;\n public reduce<A>(reducer: KeyedReducer<K, T, A>, initialValue: A): A;\n public reduce<A>(reducer: KeyedReducer<K, T, A>, initialValue?: A): A\n {\n let index = 0;\n let accumulator = initialValue;\n if (accumulator === undefined)\n {\n const result = this._elements.next();\n if (result.done) { throw new ValueException(\"Cannot reduce an empty iterator without an initial value.\"); }\n\n accumulator = (result.value[1] as unknown) as A;\n index += 1;\n }\n\n for (const [key, element] of this._elements)\n {\n accumulator = reducer(key, accumulator, element, index);\n\n index += 1;\n }\n\n return accumulator;\n }\n\n public flatMap<V>(iteratee: KeyedIteratee<K, T, Iterable<V>>): AggregatedIterator<K, V>\n {\n const elements = this._elements.enumerate();\n\n return new AggregatedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n for (const value of iteratee(key, element, index)) { yield [key, value]; }\n }\n });\n }\n\n public drop(count: number): ReducedIterator<K, T>\n {\n const elements = this._elements.enumerate();\n\n return new ReducedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n if (index >= count) { yield [key, element]; }\n }\n });\n }\n public take(count: number): ReducedIterator<K, T>\n {\n const elements = this._elements.enumerate();\n\n return new ReducedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n if (index >= count) { break; }\n\n yield [key, element];\n }\n });\n }\n\n public enumerate(): ReducedIterator<K, [number, T]>\n {\n return this.map((_, element, index) => [index, element]);\n }\n public unique(): ReducedIterator<K, T>\n {\n const elements = this._elements;\n\n return new ReducedIterator(function* ()\n {\n const values = new Set<T>();\n\n for (const [key, element] of elements)\n {\n if (values.has(element)) { continue; }\n values.add(element);\n\n yield [key, element];\n }\n });\n }\n\n public count(): number\n {\n let index = 0;\n\n for (const _ of this._elements) { index += 1; }\n\n return index;\n }\n\n public forEach(iteratee: KeyedIteratee<K, T>): void\n {\n for (const [index, [key, element]] of this._elements.enumerate())\n {\n iteratee(key, element, index);\n }\n }\n\n public keys(): SmartIterator<K>\n {\n const elements = this._elements;\n\n return new SmartIterator<K>(function* ()\n {\n for (const [key] of elements)\n {\n yield key;\n }\n });\n }\n public items(): SmartIterator<[K, T]>\n {\n return this._elements;\n }\n public values(): SmartIterator<T>\n {\n const elements = this._elements;\n\n return new SmartIterator<T>(function* ()\n {\n for (const [_, element] of elements)\n {\n yield element;\n }\n });\n }\n\n public toArray(): T[]\n {\n return Array.from(this.values());\n }\n public toMap(): Map<K, T>\n {\n return new Map(this.items());\n }\n public toObject(): Record<K, T>\n {\n return Object.fromEntries(this.items()) as Record<K, T>;\n }\n\n public readonly [Symbol.toStringTag]: string = \"ReducedIterator\";\n}\n","import { SmartAsyncIterator } from \"../iterators/index.js\";\nimport type {\n GeneratorFunction,\n AsyncGeneratorFunction,\n MaybeAsyncGeneratorFunction,\n MaybeAsyncIteratorLike\n\n} from \"../iterators/types.js\";\nimport type { MaybePromise } from \"../types.js\";\n\nimport ReducedIterator from \"./reduced-iterator.js\";\nimport type { MaybeAsyncKeyedIteratee, MaybeAsyncKeyedTypeGuardIteratee, MaybeAsyncKeyedReducer } from \"./types.js\";\n\nexport default class AggregatedAsyncIterator<K extends PropertyKey, T>\n{\n protected _elements: SmartAsyncIterator<[K, T]>;\n\n public constructor(iterable: Iterable<[K, T]>);\n public constructor(iterable: AsyncIterable<[K, T]>);\n public constructor(iterator: Iterator<[K, T]>);\n public constructor(iterator: AsyncIterator<[K, T]>);\n public constructor(generatorFn: GeneratorFunction<[K, T]>);\n public constructor(generatorFn: AsyncGeneratorFunction<[K, T]>);\n public constructor(argument: MaybeAsyncIteratorLike<[K, T]> | MaybeAsyncGeneratorFunction<[K, T]>);\n public constructor(argument: MaybeAsyncIteratorLike<[K, T]> | MaybeAsyncGeneratorFunction<[K, T]>)\n {\n this._elements = new SmartAsyncIterator(argument);\n }\n\n public async every(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): Promise<ReducedIterator<K, boolean>>\n {\n const values = new Map<K, [number, boolean]>();\n\n for await (const [key, element] of this._elements)\n {\n const [index, result] = values.get(key) ?? [0, true];\n\n if (!(result)) { continue; }\n\n values.set(key, [index + 1, await predicate(key, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, result]] of values) { yield [key, result]; }\n });\n }\n public async some(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): Promise<ReducedIterator<K, boolean>>\n {\n const values = new Map<K, [number, boolean]>();\n\n for await (const [key, element] of this._elements)\n {\n const [index, result] = values.get(key) ?? [0, false];\n\n if (result) { continue; }\n\n values.set(key, [index + 1, await predicate(key, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, result]] of values) { yield [key, result]; }\n });\n }\n\n public filter(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): AggregatedAsyncIterator<K, T>;\n public filter<S extends T>(predicate: MaybeAsyncKeyedTypeGuardIteratee<K, T, S>): AggregatedAsyncIterator<K, S>;\n public filter(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): AggregatedAsyncIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, T]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n\n if (await predicate(key, element, index)) { yield [key, element]; }\n\n indexes.set(key, index + 1);\n }\n });\n }\n public map<V>(iteratee: MaybeAsyncKeyedIteratee<K, T, V>): AggregatedAsyncIterator<K, V>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, V]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n\n yield [key, await iteratee(key, element, index)];\n\n indexes.set(key, index + 1);\n }\n });\n }\n public async reduce(reducer: MaybeAsyncKeyedReducer<K, T, T>): Promise<ReducedIterator<K, T>>;\n public async reduce<A>(reducer: MaybeAsyncKeyedReducer<K, T, A>, initialValue: (key: K) => MaybePromise<A>)\n : Promise<ReducedIterator<K, A>>;\n public async reduce<A>(reducer: MaybeAsyncKeyedReducer<K, T, A>, initialValue?: (key: K) => MaybePromise<A>)\n : Promise<ReducedIterator<K, A>>\n {\n const values = new Map<K, [number, A]>();\n\n for await (const [key, element] of this._elements)\n {\n let index: number;\n let accumulator: A;\n\n if (values.has(key)) { [index, accumulator] = values.get(key)!; }\n else if (initialValue !== undefined)\n {\n index = 0;\n accumulator = await initialValue(key);\n }\n else\n {\n values.set(key, [0, (element as unknown) as A]);\n\n continue;\n }\n\n values.set(key, [index + 1, await reducer(key, accumulator, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, accumulator]] of values) { yield [key, accumulator]; }\n });\n }\n\n public flatMap<V>(iteratee: MaybeAsyncKeyedIteratee<K, T, Iterable<V>>): AggregatedAsyncIterator<K, V>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, V]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n const values = await iteratee(key, element, index);\n\n for await (const value of values) { yield [key, value]; }\n\n indexes.set(key, index + 1);\n }\n });\n }\n\n public drop(count: number): AggregatedAsyncIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, T]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n if (index < count)\n {\n indexes.set(key, index + 1);\n\n continue;\n }\n\n yield [key, element];\n }\n });\n }\n public take(limit: number): AggregatedAsyncIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, T]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n if (index >= limit) { continue; }\n\n yield [key, element];\n\n indexes.set(key, index + 1);\n }\n });\n }\n\n public async find(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): Promise<ReducedIterator<K, T | undefined>>;\n public async find<S extends T>(predicate: MaybeAsyncKeyedTypeGuardIteratee<K, T, S>)\n : Promise<ReducedIterator<K, S | undefined>>;\n\n public async find(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): Promise<ReducedIterator<K, T | undefined>>\n {\n const values = new Map<K, [number, T | undefined]>();\n\n for await (const [key, element] of this._elements)\n {\n let [index, finding] = values.get(key) ?? [0, undefined];\n\n if (finding !== undefined) { continue; }\n if (await predicate(key, element, index)) { finding = element; }\n\n values.set(key, [index + 1, finding]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, finding]] of values) { yield [key, finding]; }\n });\n }\n\n public unique(): AggregatedAsyncIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, T]>\n {\n const keys = new Map<K, Set<T>>();\n\n for await (const [key, element] of elements)\n {\n const values = keys.get(key) ?? new Set<T>();\n\n if (values.has(element)) { continue; }\n\n values.add(element);\n keys.set(key, values);\n\n yield [key, element];\n }\n });\n }\n\n public async count(): Promise<ReducedIterator<K, number>>\n {\n const counters = new Map<K, number>();\n\n for await (const [key] of this._elements)\n {\n const count = counters.get(key) ?? 0;\n\n counters.set(key, count + 1);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, count] of counters) { yield [key, count]; }\n });\n }\n\n public async forEach(iteratee: MaybeAsyncKeyedIteratee<K, T>): Promise<void>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of this._elements)\n {\n const index = indexes.get(key) ?? 0;\n\n iteratee(key, element, index);\n\n indexes.set(key, index + 1);\n }\n }\n\n public keys(): SmartAsyncIterator<K>\n {\n const elements = this._elements;\n\n return new SmartAsyncIterator<K>(async function* ()\n {\n const keys = new Set<K>();\n\n for await (const [key] of elements)\n {\n if (keys.has(key)) { continue; }\n keys.add(key);\n\n yield key;\n }\n });\n }\n public items(): SmartAsyncIterator<[K, T]>\n {\n return this._elements;\n }\n public values(): SmartAsyncIterator<T>\n {\n const elements = this._elements;\n\n return new SmartAsyncIterator<T>(async function* ()\n {\n for await (const [_, element] of elements) { yield element; }\n });\n }\n\n public async toArray(): Promise<T[][]>\n {\n const map = await this.toMap();\n\n return Array.from(map.values());\n }\n public async toMap(): Promise<Map<K, T[]>>\n {\n const groups = new Map<K, T[]>();\n\n for await (const [key, element] of this._elements)\n {\n const value = groups.get(key) ?? [];\n\n value.push(element);\n groups.set(key, value);\n }\n\n return groups;\n }\n public async toObject(): Promise<Record<K, T[]>>\n {\n const groups = { } as Record<K, T[]>;\n\n for await (const [key, element] of this._elements)\n {\n const value = groups[key] ?? [];\n\n value.push(element);\n groups[key] = value;\n }\n\n return groups;\n }\n\n public readonly [Symbol.toStringTag]: string = \"AggregatedAsyncIterator\";\n}\n","import AggregatedAsyncIterator from \"../aggregators/aggregated-async-iterator.js\";\nimport { ValueException } from \"../exceptions/index.js\";\n\nimport type {\n GeneratorFunction,\n AsyncGeneratorFunction,\n MaybeAsyncGeneratorFunction,\n MaybeAsyncIteratee,\n MaybeAsyncReducer,\n MaybeAsyncIterable,\n MaybeAsyncIteratorLike,\n MaybeAsyncTypeGuardIteratee\n\n} from \"./types.js\";\n\nexport default class SmartAsyncIterator<T, R = void, N = undefined> implements AsyncIterator<T, R, N>\n{\n protected _iterator: AsyncIterator<T, R, N>;\n\n public return?: (value?: R) => Promise<IteratorResult<T, R>>;\n public throw?: (error?: unknown) => Promise<IteratorResult<T, R>>;\n\n public constructor(iterable: Iterable<T>);\n public constructor(iterable: AsyncIterable<T>);\n public constructor(iterator: Iterator<T, R, N>);\n public constructor(iterator: AsyncIterator<T, R, N>);\n public constructor(generatorFn: GeneratorFunction<T, R, N>);\n public constructor(generatorFn: AsyncGeneratorFunction<T, R, N>);\n public constructor(argument: MaybeAsyncIteratorLike<T, R, N> | MaybeAsyncGeneratorFunction<T, R, N>);\n public constructor(argument: MaybeAsyncIteratorLike<T, R, N> | MaybeAsyncGeneratorFunction<T, R, N>)\n {\n if (argument instanceof Function)\n {\n const generator = argument();\n if (Symbol.asyncIterator in generator)\n {\n this._iterator = generator;\n }\n else\n {\n this._iterator = (async function* ()\n {\n let next: [] | [N] = [];\n\n while (true)\n {\n const result = generator.next(...next);\n if (result.done) { return result.value; }\n\n next = [yield result.value];\n }\n\n })();\n }\n }\n else if (Symbol.asyncIterator in argument)\n {\n this._iterator = argument[Symbol.asyncIterator]() as AsyncIterator<T, R, N>;\n }\n else if (Symbol.iterator in argument)\n {\n const iterator = argument[Symbol.iterator]();\n this._iterator = (async function* ()\n {\n while (true)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n }\n\n })();\n }\n else\n {\n this._iterator = (async function* ()\n {\n let next: [] | [N] = [];\n\n while (true)\n {\n const result: IteratorResult<T, R> = await argument.next(...next);\n if (result.done) { return result.value; }\n\n next = [yield result.value];\n }\n\n })();\n }\n\n if (this._iterator.return) { this.return = (value?: R) => this._iterator.return!(value); }\n if (this._iterator.throw) { this.throw = (error?: unknown) => this._iterator.throw!(error); }\n }\n\n public async every(predicate: MaybeAsyncIteratee<T, boolean>): Promise<boolean>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n\n if (result.done) { return true; }\n if (!(await predicate(result.value, index))) { return false; }\n\n index += 1;\n }\n }\n public async some(predicate: MaybeAsyncIteratee<T, boolean>): Promise<boolean>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n\n if (result.done) { return false; }\n if (await predicate(result.value, index)) { return true; }\n\n index += 1;\n }\n }\n\n public filter(predicate: MaybeAsyncIteratee<T, boolean>): SmartAsyncIterator<T, R>;\n public filter<S extends T>(predicate: MaybeAsyncTypeGuardIteratee<T, S>): SmartAsyncIterator<S, R>;\n public filter(predicate: MaybeAsyncIteratee<T, boolean>): SmartAsyncIterator<T, R>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<T, R>(async function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = await iterator.next();\n\n if (result.done) { return result.value; }\n if (await predicate(result.value, index)) { yield result.value; }\n\n index += 1;\n }\n });\n }\n public map<V>(iteratee: MaybeAsyncIteratee<T, V>): SmartAsyncIterator<V, R>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<V, R>(async function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = await iterator.next();\n if (result.done) { return result.value; }\n\n yield await iteratee(result.value, index);\n\n index += 1;\n }\n });\n }\n public async reduce(reducer: MaybeAsyncReducer<T, T>): Promise<T>;\n public async reduce<A>(reducer: MaybeAsyncReducer<T, A>, initialValue: A): Promise<A>;\n public async reduce<A>(reducer: MaybeAsyncReducer<T, A>, initialValue?: A): Promise<A>\n {\n let index = 0;\n let accumulator = initialValue;\n if (accumulator === undefined)\n {\n const result = await this._iterator.next();\n if (result.done) { throw new ValueException(\"Cannot reduce an empty iterator without an initial value.\"); }\n\n accumulator = (result.value as unknown) as A;\n index += 1;\n }\n\n while (true)\n {\n const result = await this._iterator.next();\n if (result.done) { return accumulator; }\n\n accumulator = await reducer(accumulator, result.value, index);\n\n index += 1;\n }\n }\n\n public flatMap<V>(iteratee: MaybeAsyncIteratee<T, MaybeAsyncIterable<V>>): SmartAsyncIterator<V, R>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<V, R>(async function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = await iterator.next();\n if (result.done) { return result.value; }\n\n const elements = await iteratee(result.value, index);\n\n for await (const element of elements)\n {\n yield element;\n }\n\n index += 1;\n }\n });\n }\n\n public drop(count: number): SmartAsyncIterator<T, R | undefined>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<T, R | undefined>(async function* ()\n {\n let index = 0;\n\n while (index < count)\n {\n const result = await iterator.next();\n if (result.done) { return; }\n\n index += 1;\n }\n\n while (true)\n {\n const result = await iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n }\n });\n }\n public take(limit: number): SmartAsyncIterator<T, R | undefined>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<T, R | undefined>(async function* ()\n {\n let index = 0;\n\n while (index < limit)\n {\n const result = await iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n\n index += 1;\n }\n\n return;\n });\n }\n\n public async find(predicate: MaybeAsyncIteratee<T, boolean>): Promise<T | undefined>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n\n if (result.done) { return; }\n if (await predicate(result.value, index)) { return result.value; }\n\n index += 1;\n }\n }\n\n public enumerate(): SmartAsyncIterator<[number, T], R>\n {\n return this.map((value, index) => [index, value]);\n }\n public unique(): SmartAsyncIterator<T, R>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<T, R>(async function* ()\n {\n const values = new Set<T>();\n\n while (true)\n {\n const result = await iterator.next();\n\n if (result.done) { return result.value; }\n if (values.has(result.value)) { continue; }\n\n values.add(result.value);\n\n yield result.value;\n }\n });\n }\n\n public async count(): Promise<number>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n if (result.done) { return index; }\n\n index += 1;\n }\n }\n public async forEach(iteratee: MaybeAsyncIteratee<T>): Promise<void>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n if (result.done) { return; }\n\n await iteratee(result.value, index);\n\n index += 1;\n }\n }\n\n public next(...values: N extends undefined ? [] : [N]): Promise<IteratorResult<T, R>>\n {\n return this._iterator.next(...values);\n }\n\n public groupBy<K extends PropertyKey>(iteratee: MaybeAsyncIteratee<T, K>): AggregatedAsyncIterator<K, T>\n {\n return new AggregatedAsyncIterator(this.map(async (element, index) =>\n {\n const key = await iteratee(element, index);\n\n return [key, element] as [K, T];\n }));\n }\n\n public toArray(): Promise<T[]>\n {\n return Array.fromAsync(this as AsyncIterable<T>);\n }\n\n public readonly [Symbol.toStringTag]: string = \"SmartAsyncIterator\";\n\n public [Symbol.asyncIterator](): SmartAsyncIterator<T, R, N> { return this; }\n}\n","import { SmartIterator } from \"../iterators/index.js\";\nimport type { GeneratorFunction, IteratorLike } from \"../iterators/types.js\";\n\nimport ReducedIterator from \"./reduced-iterator.js\";\nimport type { KeyedIteratee, KeyedTypeGuardIteratee, KeyedReducer } from \"./types.js\";\n\nexport default class AggregatedIterator<K extends PropertyKey, T>\n{\n protected _elements: SmartIterator<[K, T]>;\n\n public constructor(iterable: Iterable<[K, T]>);\n public constructor(iterator: Iterator<[K, T]>);\n public constructor(generatorFn: GeneratorFunction<[K, T]>);\n public constructor(argument: IteratorLike<[K, T]> | GeneratorFunction<[K, T]>);\n public constructor(argument: IteratorLike<[K, T]> | GeneratorFunction<[K, T]>)\n {\n this._elements = new SmartIterator(argument);\n }\n\n public every(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, boolean>\n {\n const values = new Map<K, [number, boolean]>();\n\n for (const [key, element] of this._elements)\n {\n const [index, result] = values.get(key) ?? [0, true];\n\n if (!(result)) { continue; }\n\n values.set(key, [index + 1, predicate(key, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, result]] of values) { yield [key, result]; }\n });\n }\n public some(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, boolean>\n {\n const values = new Map<K, [number, boolean]>();\n\n for (const [key, element] of this._elements)\n {\n const [index, result] = values.get(key) ?? [0, false];\n\n if (result) { continue; }\n\n values.set(key, [index + 1, predicate(key, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, result]] of values) { yield [key, result]; }\n });\n }\n\n public filter(predicate: KeyedIteratee<K, T, boolean>): AggregatedIterator<K, T>;\n public filter<S extends T>(predicate: KeyedTypeGuardIteratee<K, T, S>): AggregatedIterator<K, S>;\n public filter(predicate: KeyedIteratee<K, T, boolean>): AggregatedIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n\n if (predicate(key, element, index)) { yield [key, element]; }\n\n indexes.set(key, index + 1);\n }\n });\n }\n public map<V>(iteratee: KeyedIteratee<K, T, V>): AggregatedIterator<K, V>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n\n yield [key, iteratee(key, element, index)];\n\n indexes.set(key, index + 1);\n }\n });\n }\n public reduce(reducer: KeyedReducer<K, T, T>): ReducedIterator<K, T>;\n public reduce<A>(reducer: KeyedReducer<K, T, A>, initialValue: (key: K) => A): ReducedIterator<K, A>;\n public reduce<A>(reducer: KeyedReducer<K, T, A>, initialValue?: (key: K) => A): ReducedIterator<K, A>\n {\n const values = new Map<K, [number, A]>();\n\n for (const [key, element] of this._elements)\n {\n let index: number;\n let accumulator: A;\n\n if (values.has(key)) { [index, accumulator] = values.get(key)!; }\n else if (initialValue !== undefined)\n {\n index = 0;\n accumulator = initialValue(key);\n }\n else\n {\n values.set(key, [0, (element as unknown) as A]);\n\n continue;\n }\n\n values.set(key, [index + 1, reducer(key, accumulator, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, accumulator]] of values) { yield [key, accumulator]; }\n });\n }\n\n public flatMap<V>(iteratee: KeyedIteratee<K, T, Iterable<V>>): AggregatedIterator<K, V>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n const values = iteratee(key, element, index);\n\n for (const value of values) { yield [key, value]; }\n\n indexes.set(key, index + 1);\n }\n });\n }\n\n public drop(count: number): AggregatedIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n if (index < count)\n {\n indexes.set(key, index + 1);\n\n continue;\n }\n\n yield [key, element];\n }\n });\n }\n public take(limit: number): AggregatedIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n if (index >= limit) { continue; }\n\n yield [key, element];\n\n indexes.set(key, index + 1);\n }\n });\n }\n\n public find(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, T | undefined>;\n public find<S extends T>(predicate: KeyedTypeGuardIteratee<K, T, S>): ReducedIterator<K, S | undefined>;\n public find(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, T | undefined>\n {\n const values = new Map<K, [number, T | undefined]>();\n\n for (const [key, element] of this._elements)\n {\n let [index, finding] = values.get(key) ?? [0, undefined];\n\n if (finding !== undefined) { continue; }\n if (predicate(key, element, index)) { finding = element; }\n\n values.set(key, [index + 1, finding]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, finding]] of values) { yield [key, finding]; }\n });\n }\n\n public enumerate(): AggregatedIterator<K, [number, T]>\n {\n return this.map((_, value, index) => [index, value]);\n }\n public unique(): AggregatedIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const keys = new Map<K, Set<T>>();\n\n for (const [key, element] of elements)\n {\n const values = keys.get(key) ?? new Set<T>();\n\n if (values.has(element)) { continue; }\n\n values.add(element);\n keys.set(key, values);\n\n yield [key, element];\n }\n });\n }\n\n public count(): ReducedIterator<K, number>\n {\n const counters = new Map<K, number>();\n\n for (const [key] of this._elements)\n {\n const count = counters.get(key) ?? 0;\n\n counters.set(key, count + 1);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, count] of counters) { yield [key, count]; }\n });\n }\n\n public forEach(iteratee: KeyedIteratee<K, T>): void\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of this._elements)\n {\n const index = indexes.get(key) ?? 0;\n\n iteratee(key, element, index);\n\n indexes.set(key, index + 1);\n }\n }\n\n public keys(): SmartIterator<K>\n {\n const elements = this._elements;\n\n return new SmartIterator<K>(function* ()\n {\n const keys = new Set<K>();\n\n for (const [key] of elements)\n {\n if (keys.has(key)) { continue; }\n keys.add(key);\n\n yield key;\n }\n });\n }\n public items(): SmartIterator<[K, T]>\n {\n return this._elements;\n }\n public values(): SmartIterator<T>\n {\n const elements = this._elements;\n\n return new SmartIterator<T>(function* ()\n {\n for (const [_, element] of elements) { yield element; }\n });\n }\n\n public toArray(): T[][]\n {\n const map = this.toMap();\n\n return Array.from(map.values());\n }\n public toMap(): Map<K, T[]>\n {\n const groups = new Map<K, T[]>();\n\n for (const [key, element] of this._elements)\n {\n const value = groups.get(key) ?? [];\n\n value.push(element);\n groups.set(key, value);\n }\n\n return groups;\n }\n public toObject(): Record<K, T[]>\n {\n const groups = { } as Record<K, T[]>;\n\n for (const [key, element] of this._elements)\n {\n const value = groups[key] ?? [];\n\n value.push(element);\n groups[key] = value;\n }\n\n return groups;\n }\n\n public readonly [Symbol.toStringTag]: string = \"AggregatedIterator\";\n}\n","import type { Interval } from \"../core/types.js\";\nimport { isBrowser } from \"../helpers.js\";\n\nimport { FatalErrorException, RuntimeException } from \"./exceptions/index.js\";\n\nexport default class GameLoop\n{\n protected _handle?: number | Interval;\n\n protected _startTime: number;\n public get startTime(): number\n {\n return this._startTime;\n }\n\n protected _isRunning: boolean;\n public get isRunning(): boolean\n {\n return this._isRunning;\n }\n\n public get elapsedTime(): number\n {\n return performance.now() - this._startTime;\n }\n\n protected _start: () => void;\n protected _stop: () => void;\n\n public constructor(callback: FrameRequestCallback, msIfNotBrowser = 40)\n {\n this._startTime = 0;\n this._isRunning = false;\n\n if (isBrowser)\n {\n this._start = () =>\n {\n callback(this.elapsedTime);\n\n this._handle = window.requestAnimationFrame(this._start);\n };\n\n this._stop = () => window.cancelAnimationFrame(this._handle as number);\n }\n else\n {\n // eslint-disable-next-line no-console\n console.warn(\n \"Not a browser environment detected. \" +\n `Using setInterval@${msIfNotBrowser}ms instead of requestAnimationFrame...`\n );\n\n this._start = () =>\n {\n this._handle = setInterval(() => callback(this.elapsedTime), msIfNotBrowser);\n };\n\n this._stop = () => clearInterval(this._handle as Interval);\n }\n }\n\n public start(elapsedTime = 0): void\n {\n if (this._isRunning) { throw new RuntimeException(\"The game loop has already been started.\"); }\n\n this._startTime = performance.now() - elapsedTime;\n this._start();\n this._isRunning = true;\n }\n\n public stop(): void\n {\n if (!(this._isRunning)) { throw new RuntimeException(\"The game loop hadn't yet started.\"); }\n if (!(this._handle)) { throw new FatalErrorException(); }\n\n this._stop();\n this._handle = undefined;\n this._isRunning = false;\n }\n\n public readonly [Symbol.toStringTag]: string = \"GameLoop\";\n}\n","\nimport { isBrowser } from \"../../helpers.js\";\nimport { EnvironmentException } from \"../exceptions/index.js\";\n\nimport type { JSONValue } from \"./types.js\";\n\n/**\n * A wrapper around the `Storage` API to store and retrieve JSON values.\n *\n * It allows to handle either the `sessionStorage` or the `localStorage`\n * storage at the same time, depending on the required use case.\n */\nexport default class JSONStorage\n{\n protected _preferPersistence: boolean;\n\n protected _volatile: Storage;\n protected _persistent: Storage;\n\n public constructor(preferPersistence = true)\n {\n this._preferPersistence = preferPersistence;\n\n if (!(isBrowser))\n {\n throw new EnvironmentException(\n \"The `JSONStorage` class can only be instantiated within a browser environment.\"\n );\n }\n\n this._volatile = window.sessionStorage;\n this._persistent = window.localStorage;\n }\n\n protected _get<T extends JSONValue>(storage: Storage, propertyName: string): T | undefined;\n protected _get<T extends JSONValue>(storage: Storage, propertyName: string, defaultValue: T): T;\n protected _get<T extends JSONValue>(storage: Storage, propertyName: string, defaultValue?: T): T | undefined;\n protected _get<T extends JSONValue>(storage: Storage, propertyName: string, defaultValue?: T): T | undefined\n {\n const propertyValue = storage.getItem(propertyName);\n if (propertyValue)\n {\n try\n {\n return JSON.parse(propertyValue);\n }\n catch\n {\n // eslint-disable-next-line no-console\n console.warn(\n `The \"${propertyValue}\" value for \"${propertyName}\"` +\n \" property cannot be parsed. Clearing the storage...\");\n\n storage.removeItem(propertyName);\n }\n }\n\n return defaultValue;\n }\n protected _set<T extends JSONValue>(storage: Storage, propertyName: string, newValue?: T): void\n {\n const encodedValue = JSON.stringify(newValue);\n if (encodedValue)\n {\n storage.setItem(propertyName, encodedValue);\n }\n else\n {\n storage.removeItem(propertyName);\n }\n }\n\n /**\n * Retrieves the value with the specified name from the corresponding storage.\n *\n * @param propertyName The name of the property to retrieve.\n * @param defaultValue The default value to return if the property does not exist.\n * @param persistent Whether to use the persistent `localStorage` or the volatile `sessionStorage`.\n *\n * @returns The value of the property or the default value if the property does not exist.\n */\n public get<T extends JSONValue>(propertyName: string, defaultValue: undefined, persistent?: boolean): T | undefined;\n public get<T extends JSONValue>(propertyName: string, defaultValue: T, persistent?: boolean): T ;\n public get<T extends JSONValue>(propertyName: string, defaultValue?: T, persistent?: boolean): T | undefined;\n public get<T extends JSONValue>(propertyName: string, defaultValue?: T, persistent = this._preferPersistence)\n : T | undefined\n {\n const storage = persistent ? this._persistent : this._volatile;\n\n return this._get<T>(storage, propertyName, defaultValue);\n }\n /**\n * Retrieves the value with the specified name from the volatile `sessionStorage`.\n *\n * @param propertyName The name of the property to retrieve.\n * @param defaultValue The default value to return if the property does not exist.\n *\n * @returns The value of the property or the default value if the property does not exist.\n */\n public recall<T extends JSONValue>(propertyName: string): T | undefined;\n public recall<T extends JSONValue>(propertyName: string, defaultValue: T): T;\n public recall<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined;\n public recall<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined\n {\n return this._get<T>(this._volatile, propertyName, defaultValue);\n }\n /**\n * Retrieves the value with the specified name looking first in the\n * volatile `sessionStorage` and then in the persistent `localStorage`.\n *\n * @param propertyName The name of the property to retrieve.\n * @param defaultValue The default value to return if the property does not exist.\n *\n * @returns The value of the property or the default value if the property does not exist.\n */\n public retrieve<T extends JSONValue>(propertyName: string): T | undefined;\n public retrieve<T extends JSONValue>(propertyName: string, defaultValue: T): T;\n public retrieve<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined;\n public retrieve<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined\n {\n return this.recall<T>(propertyName) ?? this.read<T>(propertyName, defaultValue);\n }\n /**\n * Retrieves the value with the specified name from the persistent `localStorage`.\n *\n * @param propertyName The name of the property to retrieve.\n * @param defaultValue The default value to return if the property does not exist.\n *\n * @returns The value of the property or the default value if the property does not exist.\n */\n public read<T extends JSONValue>(propertyName: string): T | undefined;\n public read<T extends JSONValue>(propertyName: string, defaultValue: T): T;\n public read<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined;\n public read<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined\n {\n return this._get<T>(this._persistent, propertyName, defaultValue);\n }\n\n /**\n * Checks whether the property with the specified name exists in the corresponding storage.\n *\n * @param propertyName The name of the property to check.\n * @param persistent Whether to use the persistent `localStorage` or the volatile `sessionStorage`.\n *\n * @returns `true` if the property exists, `false` otherwise.\n */\n public has(propertyName: string, persistent?: boolean): boolean\n {\n const storage = persistent ? this._persistent : this._volatile;\n\n return storage.getItem(propertyName) !== null;\n }\n /**\n * Checks whether the property with the specified name exists in the volatile `sessionStorage`.\n *\n * @param propertyName The name of the property to check.\n *\n * @returns `true` if the property exists, `false` otherwise.\n */\n public knows(propertyName: string): boolean\n {\n return this._volatile.getItem(propertyName) !== null;\n }\n /**\n * Checks whether the property with the specified name exists looking first in the\n * volatile `sessionStorage` and then in the persistent `localStorage`.\n *\n * @param propertyName The name of the property to check.\n *\n * @returns `true` if the property exists, `false` otherwise.\n */\n public find(propertyName: string): boolean\n {\n return this.knows(propertyName) ?? this.exists(propertyName);\n }\n /**\n * Checks whether the property with the specified name exists in the persistent `localStorage`.\n *\n * @param propertyName The name of the property to check.\n *\n * @returns `true` if the property exists, `false` otherwise.\n */\n public exists(propertyName: string): boolean\n {\n return this._persistent.getItem(propertyName) !== null;\n }\n\n /**\n * Sets the value with the specified name in the corresponding storage.\n * If the value is `undefined`, the property is removed from the storage.\n *\n * @param propertyName The name of the property to set.\n * @param newValue The new value to set.\n * @param persistent Whether to use the persistent `localStorage` or the volatile `sessionStorage`.\n */\n public set<T extends JSONValue>(propertyName: string, newValue?: T, persistent = this._preferPersistence): void\n {\n const storage = persistent ? this._persistent : this._volatile;\n\n this._set<T>(storage, propertyName, newValue);\n }\n /**\n * Sets the value with the specified name in the volatile `sessionStorage`.\n * If the value is `undefined`, the property is removed from the storage.\n *\n * @param propertyName The name of the property to set.\n * @param newValue The new value to set.\n */\n public remember<T extends JSONValue>(propertyName: string, newValue?: T): void\n {\n this._set<T>(this._volatile, propertyName, newValue);\n }\n /**\n * Sets the value with the specified name in the persistent `localStorage`.\n * If the value is `undefined`, the property is removed from the storage.\n *\n * @param propertyName The name of the property to set.\n * @param newValue The new value to set.\n */\n public write<T extends JSONValue>(propertyName: string, newValue?: T): void\n {\n this._set<T>(this._persistent, propertyName, newValue);\n }\n\n /**\n * Removes the value with the specified name from the volatile `sessionStorage`.\n *\n * @param propertyName The name of the property to remove.\n */\n public forget(propertyName: string): void\n {\n this._volatile.removeItem(propertyName);\n }\n /**\n * Removes the value with the specified name from the persistent `localStorage`.\n *\n * @param propertyName The name of the property to remove.\n */\n public erase(propertyName: string): void\n {\n this._persistent.removeItem(propertyName);\n }\n /**\n * Removes the value with the specified name from all the storages.\n *\n * @param propertyName The name of the property to remove.\n */\n public clear(propertyName: string): void\n {\n this._volatile.removeItem(propertyName);\n this._persistent.removeItem(propertyName);\n }\n\n public readonly [Symbol.toStringTag]: string = \"JSONStorage\";\n}\n","import type { FulfilledHandler, PromiseExecutor, RejectedHandler } from \"./types.js\";\n\nexport default class SmartPromise<T = void> implements Promise<T>\n{\n public static FromPromise<T>(promise: Promise<T>): SmartPromise<T>\n {\n return new SmartPromise((resolve, reject) => promise.then(resolve, reject));\n }\n\n protected _isPending: boolean;\n protected _isFulfilled: boolean;\n protected _isRejected: boolean;\n\n protected _promise: Promise<T>;\n\n public constructor(executor: PromiseExecutor<T>)\n {\n this._isPending = true;\n this._isFulfilled = false;\n this._isRejected = false;\n\n const _onFulfilled = (result: T): T =>\n {\n this._isPending = false;\n this._isFulfilled = true;\n\n return result;\n };\n const _onRejected = (reason: unknown): never =>\n {\n this._isPending = false;\n this._isRejected = true;\n\n throw reason;\n };\n\n this._promise = new Promise<T>(executor)\n .then(_onFulfilled, _onRejected);\n }\n\n public get isPending(): boolean { return this._isPending; }\n public get isFulfilled(): boolean { return this._isFulfilled; }\n public get isRejected(): boolean { return this._isRejected; }\n\n public then(onFulfilled?: null): Promise<T>;\n public then<F = T>(onFulfilled: FulfilledHandler<T, F>, onRejected?: null): Promise<F>;\n public then<F = T, R = never>(onFulfilled: FulfilledHandler<T, F>, onRejected: RejectedHandler<unknown, R>)\n : Promise<F | R>;\n public then<F = T, R = never>(\n onFulfilled?: FulfilledHandler<T, F> | null,\n onRejected?: RejectedHandler<unknown, R> | null): Promise<F | R>\n {\n return this._promise.then(onFulfilled, onRejected);\n }\n\n public catch(onRejected?: null): Promise<T>;\n public catch<R = never>(onRejected: RejectedHandler<unknown, R>): Promise<T | R>;\n public catch<R = never>(onRejected?: RejectedHandler<unknown, R> | null): Promise<T | R>\n {\n return this._promise.catch(onRejected);\n }\n public finally(onFinally?: (() => void) | null): Promise<T>\n {\n return this._promise.finally(onFinally);\n }\n\n public readonly [Symbol.toStringTag]: string = \"SmartPromise\";\n}\n","import type { PromiseResolver, PromiseRejecter, FulfilledHandler, RejectedHandler } from \"./types.js\";\n\nimport SmartPromise from \"./smart-promise.js\";\n\nexport default class DeferredPromise<T = void, F = T, R = never> extends SmartPromise<F | R>\n{\n protected _resolve: PromiseResolver<T>;\n protected _reject: PromiseRejecter;\n\n public constructor(onFulfilled?: FulfilledHandler<T, F> | null, onRejected?: RejectedHandler<unknown, R> | null)\n {\n let _resolve: PromiseResolver<T>;\n let _reject: PromiseRejecter;\n\n super((resolve, reject) =>\n {\n // ReferenceError: Must call super constructor in derived class before accessing\n // 'this' or returning from derived constructor.\n //\n _resolve = resolve as PromiseResolver<T>;\n _reject = reject;\n });\n\n this._promise.then(onFulfilled as FulfilledHandler<F | R>, onRejected);\n\n this._resolve = _resolve!;\n this._reject = _reject!;\n }\n\n public get resolve(): PromiseResolver<T> { return this._resolve; }\n public get reject(): PromiseRejecter { return this._reject; }\n\n public watch(otherPromise: PromiseLike<T>): this\n {\n otherPromise.then(this.resolve, this.reject);\n\n return this;\n }\n\n public readonly [Symbol.toStringTag]: string = \"DeferredPromise\";\n}\n","export default class Thenable<T> implements Promise<T>\n{\n protected _onFulfilled: (result: T) => T;\n protected _resolve(result: T): T\n {\n return this._onFulfilled(result);\n }\n\n public constructor()\n {\n this._onFulfilled = (result: T) => result;\n }\n\n public then(onFulfilled?: null): Thenable<T>;\n public then<F = T>(onFulfilled: (result: T) => F, onRejected?: null): Thenable<F>;\n public then<F = T, R = never>(onFulfilled: (result: T) => F, onRejected: (reason: unknown) => R)\n : Thenable<F | R>;\n public then<F = T, R = never>(onFulfilled?: ((result: T) => F) | null, onRejected?: ((reason: unknown) => R) | null)\n : Thenable<F | R>\n {\n if (onRejected)\n {\n const _previousOnFulfilled = this._onFulfilled;\n this._onFulfilled = (result: T) =>\n {\n try\n {\n result = _previousOnFulfilled(result);\n\n return (onFulfilled!(result) as unknown) as T;\n }\n catch (error)\n {\n return (onRejected(error) as unknown) as T;\n }\n };\n }\n else if (onFulfilled)\n {\n const _previousOnFulfilled = this._onFulfilled;\n this._onFulfilled = (result: T) =>\n {\n result = _previousOnFulfilled(result);\n\n return (onFulfilled(result) as unknown) as T;\n };\n }\n\n return (this as unknown) as Thenable<F | R>;\n }\n\n public catch(onRejected?: null): Thenable<T>;\n public catch<R = never>(onRejected: (reason: unknown) => R): Thenable<T | R>;\n public catch<R = never>(onRejected?: ((reason: unknown) => R) | null): Thenable<T | R>\n {\n if (onRejected)\n {\n const _previousOnFulfilled = this._onFulfilled;\n this._onFulfilled = (result) =>\n {\n try\n {\n return _previousOnFulfilled(result);\n }\n catch (error)\n {\n return (onRejected(error) as unknown) as T;\n }\n };\n }\n\n return this as Thenable<T | R>;\n }\n\n public finally(onFinally?: (() => void) | null): Thenable<T>\n {\n if (onFinally)\n {\n const _previousOnFulfilled = this._onFulfilled;\n this._onFulfilled = (result) =>\n {\n try\n {\n return _previousOnFulfilled(result);\n }\n finally\n {\n onFinally();\n }\n };\n }\n\n return this;\n }\n\n public readonly [Symbol.toStringTag]: string = \"Thenable\";\n}\n","import { TimeoutException } from \"../exceptions/index.js\";\n\nimport SmartPromise from \"./smart-promise.js\";\nimport type { MaybePromise, PromiseExecutor } from \"./types.js\";\n\nexport default class TimedPromise<T = void> extends SmartPromise<T>\n{\n public constructor(executor: PromiseExecutor<T>, timeout?: number)\n {\n super((resolve, reject) =>\n {\n const _resolve = (result: MaybePromise<T>) =>\n {\n clearTimeout(_timeoutId);\n resolve(result);\n };\n const _reject = (reason: unknown) =>\n {\n clearTimeout(_timeoutId);\n reject(reason);\n };\n\n const _timeout = () => _reject(new TimeoutException(\"The operation has timed out.\"));\n const _timeoutId = setTimeout(_timeout, timeout);\n\n executor(_resolve, _reject);\n });\n }\n\n public readonly [Symbol.toStringTag]: string = \"TimedPromise\";\n}\n","import { ReferenceException } from \"./exceptions/index.js\";\n\nexport type Subscriber<A extends unknown[] = [], R = void> = (...args: A) => R;\n\nexport default class Publisher<A extends unknown[] = [], R = void>\n{\n protected _subscribers: Subscriber<A, R>[];\n\n public constructor()\n {\n this._subscribers = [];\n }\n\n public subscribe(subscriber: Subscriber<A, R>): () => void\n {\n this._subscribers.push(subscriber);\n\n return () =>\n {\n const index = this._subscribers.indexOf(subscriber);\n if (index < 0)\n {\n throw new ReferenceException(\"Unable to unsubscribe the required subscriber. \" +\n \"The subscription was already unsubscribed.\");\n }\n\n this._subscribers.splice(index, 1);\n };\n }\n\n public publish(...args: A): R[]\n {\n return this._subscribers\n .slice()\n .map((subscriber) => subscriber(...args));\n }\n\n public readonly [Symbol.toStringTag]: string = \"Publisher\";\n}\n","\nimport { SmartIterator } from \"../models/index.js\";\n\nexport enum TimeUnit\n{\n /* eslint-disable @typescript-eslint/prefer-literal-enum-member */\n\n Millisecond = 1,\n Second = 1000,\n Minute = 60 * Second,\n Hour = 60 * Minute,\n Day = 24 * Hour,\n Week = 7 * Day,\n Month = 30 * Day,\n Year = 365 * Day\n}\n\nexport function dateDifference(start: string | Date, end: string | Date, unit = TimeUnit.Day): number\n{\n start = new Date(start);\n end = new Date(end);\n\n return Math.floor((end.getTime() - start.getTime()) / unit);\n}\n\nexport function dateRange(start: string | Date, end: string | Date, offset = TimeUnit.Day): SmartIterator<Date>\n{\n start = new Date(start);\n end = new Date(end);\n\n return new SmartIterator<Date>(function* ()\n {\n const endTime = end.getTime();\n\n let unixTime: number = start.getTime();\n while (unixTime < endTime)\n {\n yield new Date(unixTime);\n\n unixTime += offset;\n }\n });\n}\n\nexport function dateRound(date: string | Date, unit = TimeUnit.Day): Date\n{\n date = new Date(date);\n\n return new Date(Math.floor(date.getTime() / unit) * unit);\n}\n","import { TimeUnit } from \"../../utils/date.js\";\n\nimport { RangeException, RuntimeException } from \"../exceptions/index.js\";\nimport GameLoop from \"../game-loop.js\";\nimport Publisher from \"../publisher.js\";\n\nexport default class Clock extends GameLoop\n{\n protected _starter: Publisher;\n protected _stopper: Publisher;\n protected _ticker: Publisher<[number]>;\n\n public constructor(msIfNotBrowser: number = TimeUnit.Second)\n {\n super((elapsedTime) => this._ticker.publish(elapsedTime), msIfNotBrowser);\n\n this._starter = new Publisher();\n this._stopper = new Publisher();\n this._ticker = new Publisher();\n }\n\n public start(elapsedTime = 0): void\n {\n if (this._isRunning) { throw new RuntimeException(\"The clock has already been started.\"); }\n\n super.start(elapsedTime);\n\n this._starter.publish();\n }\n\n public stop(): void\n {\n if (!(this._isRunning)) { throw new RuntimeException(\"The clock hadn't yet started.\"); }\n\n super.stop();\n\n this._stopper.publish();\n }\n\n public onStart(callback: () => void): () => void\n {\n return this._starter.subscribe(callback);\n }\n public onStop(callback: () => void): () => void\n {\n return this._stopper.subscribe(callback);\n }\n\n public onTick(callback: (elapsedTime: number) => void, tickStep = 0): () => void\n {\n if (tickStep < 0) { throw new RangeException(\"The tick step must be a non-negative number.\"); }\n if (tickStep === 0) { return this._ticker.subscribe(callback); }\n\n let lastTick = 0;\n\n return this._ticker.subscribe((elapsedTime: number) =>\n {\n if ((elapsedTime - lastTick) < tickStep) { return; }\n\n callback(elapsedTime);\n lastTick = elapsedTime;\n });\n }\n\n public readonly [Symbol.toStringTag]: string = \"Clock\";\n}\n","import { TimeUnit } from \"../../utils/date.js\";\n\nimport { FatalErrorException, RangeException, RuntimeException } from \"../exceptions/index.js\";\nimport { DeferredPromise, SmartPromise } from \"../promises/index.js\";\n\nimport GameLoop from \"../game-loop.js\";\nimport Publisher from \"../publisher.js\";\n\nexport default class Countdown extends GameLoop\n{\n protected _deferrer?: DeferredPromise<void>;\n\n protected _expirer: Publisher;\n protected _starter: Publisher;\n protected _stopper: Publisher<[unknown]>;\n protected _ticker: Publisher<[number]>;\n\n protected _duration: number;\n public get duration(): number\n {\n return this._duration;\n }\n\n public get remainingTime(): number\n {\n return this._duration - this.elapsedTime;\n }\n\n public constructor(duration: number, msIfNotBrowser: number = TimeUnit.Second)\n {\n const callback = () =>\n {\n const remainingTime = this.remainingTime;\n this._ticker.publish(remainingTime);\n\n if (remainingTime <= 0)\n {\n this._deferrerStop();\n\n this._expirer.publish();\n }\n };\n\n super(callback, msIfNotBrowser);\n\n this._expirer = new Publisher();\n this._starter = new Publisher();\n this._stopper = new Publisher();\n this._ticker = new Publisher();\n\n this._duration = duration;\n }\n\n protected _deferrerStop(reason?: unknown): void\n {\n if (!(this._isRunning)) { throw new RuntimeException(\"The countdown hadn't yet started.\"); }\n if (!(this._deferrer)) { throw new FatalErrorException(); }\n\n super.stop();\n\n if (reason !== undefined) { this._deferrer.reject(reason); }\n else { this._deferrer.resolve(); }\n\n this._deferrer = undefined;\n }\n\n public start(remainingTime: number = this.duration): SmartPromise<void>\n {\n if (this._isRunning) { throw new RuntimeException(\"The countdown has already been started.\"); }\n if (this._deferrer) { throw new FatalErrorException(); }\n\n this._deferrer = new DeferredPromise();\n super.start(this.duration - remainingTime);\n\n this._starter.publish();\n\n return this._deferrer;\n }\n public stop(reason?: unknown): void\n {\n this._deferrerStop(reason);\n\n this._stopper.publish(reason);\n }\n\n public onExpire(callback: () => void): () => void\n {\n return this._expirer.subscribe(callback);\n }\n\n public onStart(callback: () => void): () => void\n {\n return this._starter.subscribe(callback);\n }\n public onStop(callback: (reason?: unknown) => void): () => void\n {\n return this._stopper.subscribe(callback);\n }\n\n public onTick(callback: (remainingTime: number) => void, tickStep = 0): () => void\n {\n if (tickStep < 0) { throw new RangeException(\"The tick step must be a non-negative number.\"); }\n if (tickStep === 0) { return this._ticker.subscribe(callback); }\n\n let lastTick = 0;\n\n return this._ticker.subscribe((remainingTime: number) =>\n {\n if ((lastTick - remainingTime) < tickStep) { return; }\n\n callback(remainingTime);\n lastTick = remainingTime;\n });\n }\n\n public readonly [Symbol.toStringTag]: string = \"Countdown\";\n}\n","import { ValueException } from \"../models/index.js\";\n\nexport default class Random\n{\n public static Boolean(ratio = 0.5): boolean\n {\n return (Math.random() < ratio);\n }\n\n public static Integer(max: number): number;\n public static Integer(min: number, max: number): number;\n public static Integer(min: number, max?: number): number\n {\n if (max === undefined) { return Math.floor(Math.random() * min); }\n\n return Math.floor(Math.random() * (max - min) + min);\n }\n\n public static Decimal(): number;\n public static Decimal(max: number): number;\n public static Decimal(min: number, max: number): number;\n public static Decimal(min?: number, max?: number): number\n {\n if (min === undefined) { return Math.random(); }\n if (max === undefined) { return (Math.random() * min); }\n\n return (Math.random() * (max - min) + min);\n }\n\n public static Index<T>(elements: T[]): number\n {\n if (elements.length === 0) { throw new ValueException(\"You must provide at least one element.\"); }\n\n return this.Integer(elements.length);\n }\n public static Choice<T>(elements: T[]): T\n {\n return elements[Random.Index(elements)];\n }\n\n private constructor() { /* ... */ }\n\n public readonly [Symbol.toStringTag]: string = \"Random\";\n}\n","export function delay(milliseconds: number): Promise<void>\n{\n return new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n}\n\nexport function nextAnimationFrame(): Promise<void>\n{\n return new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n}\n","export function loadScript(scriptUrl: string, scriptType = \"text/javascript\"): Promise<void>\n{\n return new Promise<void>((resolve, reject) =>\n {\n const script = document.createElement(\"script\");\n\n script.async = true;\n script.defer = true;\n script.src = scriptUrl;\n script.type = scriptType;\n\n script.onload = () => resolve();\n script.onerror = () => reject();\n\n document.body.appendChild(script);\n });\n}\n","import { SmartIterator } from \"../models/index.js\";\n\nexport function chain<T>(...iterables: Iterable<T>[]): SmartIterator<T>\n{\n return new SmartIterator<T>(function* ()\n {\n for (const iterable of iterables)\n {\n for (const element of iterable) { yield element; }\n }\n });\n}\n\nexport function count<T>(elements: Iterable<T>): number\n{\n if (Array.isArray(elements)) { return elements.length; }\n\n let _count = 0;\n for (const _ of elements) { _count += 1; }\n\n return _count;\n}\n\nexport function enumerate<T>(elements: Iterable<T>): SmartIterator<[number, T]>\n{\n return new SmartIterator<[number, T]>(function* ()\n {\n let index = 0;\n\n for (const element of elements)\n {\n yield [index, element];\n\n index += 1;\n }\n });\n}\n\nexport function range(end: number): SmartIterator<number>;\nexport function range(start: number, end: number): SmartIterator<number>;\nexport function range(start: number, end: number, step: number): SmartIterator<number>;\nexport function range(start: number, end?: number, step = 1): SmartIterator<number>\n{\n return new SmartIterator<number>(function* ()\n {\n if (end === undefined)\n {\n end = start;\n start = 0;\n }\n\n if (start > end) { step = step ?? -1; }\n\n for (let index = start; index < end; index += step) { yield index; }\n });\n}\n\nexport function shuffle<T>(iterable: Iterable<T>): T[]\n{\n const array = Array.from(iterable);\n\n for (let index = array.length - 1; index > 0; index -= 1)\n {\n const jndex = Math.floor(Math.random() * (index + 1));\n\n [array[index], array[jndex]] = [array[jndex], array[index]];\n }\n\n return array;\n}\n\nexport function unique<T>(elements: Iterable<T>): SmartIterator<T>\n{\n return new SmartIterator<T>(function* ()\n {\n const values = new Set<T>();\n\n for (const element of elements)\n {\n if (values.has(element)) { continue; }\n\n values.add(element);\n\n yield element;\n }\n });\n}\n\nexport function zip<T, U>(first: Iterable<T>, second: Iterable<U>): SmartIterator<[T, U]>\n{\n return new SmartIterator<[T, U]>(function* ()\n {\n const firstIterator = first[Symbol.iterator]();\n const secondIterator = second[Symbol.iterator]();\n\n while (true)\n {\n const firstResult = firstIterator.next();\n const secondResult = secondIterator.next();\n\n if ((firstResult.done) || (secondResult.done)) { break; }\n\n yield [firstResult.value, secondResult.value];\n }\n });\n}\n","import { ValueException } from \"../models/exceptions/index.js\";\nimport { zip } from \"./iterator.js\";\n\nexport function average<T extends number>(values: Iterable<T>): number;\nexport function average<T extends number>(values: Iterable<T>, weights: Iterable<number>): number;\nexport function average<T extends number>(values: Iterable<T>, weights?: Iterable<number>): number\n{\n if (weights === undefined)\n {\n let _sum = 0;\n let _index = 0;\n\n for (const value of values)\n {\n _sum += value;\n _index += 1;\n }\n\n if (_index === 0) { throw new ValueException(\"You must provide at least one value.\"); }\n\n return _sum / _index;\n }\n\n let _sum = 0;\n let _count = 0;\n let _index = 0;\n\n for (const [value, weight] of zip(values, weights))\n {\n if (weight <= 0)\n {\n throw new ValueException(`The weight for the value #${_index} must be greater than zero.`);\n }\n\n _sum += value * weight;\n _count += weight;\n _index += 1;\n }\n\n if (_index === 0) { throw new ValueException(\"You must provide at least one value and weight.\"); }\n if (_count > 0) { throw new ValueException(\"The sum of weights must be greater than zero.\"); }\n\n return _sum / _count;\n}\n\nexport function hash(value: string): number\n{\n let hashedValue = 0;\n for (let index = 0; index < value.length; index += 1)\n {\n const char = value.charCodeAt(index);\n\n hashedValue = ((hashedValue << 5) - hashedValue) + char;\n hashedValue |= 0;\n }\n\n return hashedValue;\n}\n\nexport function sum<T extends number>(values: Iterable<T>): number\n{\n let _sum = 0;\n for (const value of values) { _sum += value; }\n\n return _sum;\n}\n","export function capitalize(value: string): string\n{\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;\n}\n","export const VERSION = \"2.0.0-rc.6\";\n\nexport type { Constructor, Interval, Timeout } from \"./core/types.js\";\n\nexport { isBrowser, isNode, isWebWorker } from \"./helpers.js\";\n\nexport {\n AggregatedIterator,\n AggregatedAsyncIterator,\n Clock,\n Countdown,\n DeferredPromise,\n Exception,\n FatalErrorException,\n FileException,\n FileExistsException,\n FileNotFoundException,\n GameLoop,\n JSONStorage,\n KeyException,\n NotImplementedException,\n NetworkException,\n PermissionException,\n Publisher,\n RangeException,\n ReducedIterator,\n ReferenceException,\n RuntimeException,\n SmartIterator,\n SmartAsyncIterator,\n SmartPromise,\n Thenable,\n TimeoutException,\n TimedPromise,\n TypeException,\n ValueException\n\n} from \"./models/index.js\";\n\nexport type {\n AsyncGeneratorFunction,\n AsyncIteratorLike,\n FulfilledHandler,\n GeneratorFunction,\n Iteratee,\n IteratorLike,\n JSONArray,\n JSONObject,\n JSONValue,\n KeyedIteratee,\n KeyedReducer,\n KeyedTypeGuardIteratee,\n MaybeAsyncKeyedIteratee,\n MaybeAsyncKeyedReducer,\n MaybeAsyncKeyedTypeGuardIteratee,\n MaybeAsyncReducer,\n MaybeAsyncIteratee,\n MaybeAsyncIteratorLike,\n MaybeAsyncTypeGuardIteratee,\n MaybePromise,\n PromiseExecutor,\n PromiseRejecter,\n PromiseResolver,\n Reducer,\n RejectedHandler,\n Subscriber,\n TypeGuardIteratee\n\n} from \"./models/types.js\";\n\nexport {\n average,\n capitalize,\n chain,\n count,\n delay,\n dateDifference,\n dateRange,\n dateRound,\n TimeUnit,\n enumerate,\n hash,\n loadScript,\n nextAnimationFrame,\n Random,\n range,\n shuffle,\n sum,\n unique,\n zip\n\n} from \"./utils/index.js\";\n"],"names":["isBrowser","_a","isNode","isWebWorker","_b","Exception","message","cause","name","__publicField","error","exc","FatalErrorException","NotImplementedException","FileException","FileExistsException","FileNotFoundException","KeyException","NetworkException","PermissionException","ReferenceException","RuntimeException","EnvironmentException","TimeoutException","TypeException","ValueException","RangeException","SmartIterator","argument","value","predicate","index","result","iterator","iteratee","reducer","initialValue","accumulator","iterable","count","limit","values","AggregatedIterator","element","_ReducedIterator","key","elements","_","ReducedIterator","_AggregatedAsyncIterator","SmartAsyncIterator","indexes","finding","keys","counters","map","groups","AggregatedAsyncIterator","generator","next","_AggregatedIterator","GameLoop","callback","msIfNotBrowser","elapsedTime","JSONStorage","preferPersistence","storage","propertyName","defaultValue","propertyValue","newValue","encodedValue","persistent","_SmartPromise","executor","_onFulfilled","_onRejected","reason","promise","resolve","reject","onFulfilled","onRejected","onFinally","SmartPromise","DeferredPromise","_resolve","_reject","otherPromise","Thenable","_previousOnFulfilled","TimedPromise","timeout","_timeoutId","Publisher","subscriber","args","TimeUnit","dateDifference","start","end","unit","dateRange","offset","endTime","unixTime","dateRound","date","Clock","tickStep","lastTick","Countdown","duration","remainingTime","_Random","ratio","min","max","Random","delay","milliseconds","nextAnimationFrame","loadScript","scriptUrl","scriptType","script","chain","iterables","_count","enumerate","range","step","shuffle","array","jndex","unique","zip","first","second","firstIterator","secondIterator","firstResult","secondResult","average","weights","_sum","_index","weight","hash","hashedValue","char","sum","capitalize","VERSION"],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sources":["../src/helpers.ts","../src/models/exceptions/core.ts","../src/models/exceptions/index.ts","../src/models/iterators/smart-iterator.ts","../src/models/aggregators/reduced-iterator.ts","../src/models/aggregators/aggregated-async-iterator.ts","../src/models/iterators/smart-async-iterator.ts","../src/models/aggregators/aggregated-iterator.ts","../src/models/game-loop.ts","../src/models/json/json-storage.ts","../src/models/promises/smart-promise.ts","../src/models/promises/deferred-promise.ts","../src/models/promises/thenable.ts","../src/models/promises/timed-promise.ts","../src/models/publisher.ts","../src/utils/date.ts","../src/models/timers/clock.ts","../src/models/timers/countdown.ts","../src/utils/random.ts","../src/utils/async.ts","../src/utils/dom.ts","../src/utils/iterator.ts","../src/utils/math.ts","../src/utils/string.ts","../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\n\n// @ts-ignore\nexport const isBrowser = ((typeof window !== \"undefined\") && (typeof window.document !== \"undefined\"));\n\n// @ts-ignore\nexport const isNode = ((typeof process !== \"undefined\") && (process.versions?.node));\n\n// @ts-ignore\nexport const isWebWorker = ((typeof self === \"object\") && (self.constructor?.name === \"DedicatedWorkerGlobalScope\"));\n","export default class Exception extends Error\n{\n public static FromUnknown(error: unknown): Exception\n {\n if (error instanceof Exception)\n {\n return error;\n }\n if (error instanceof Error)\n {\n const exc = new Exception(error.message);\n\n exc.stack = error.stack;\n exc.name = error.name;\n\n return exc;\n }\n\n return new Exception(`${error}`);\n }\n\n public constructor(message: string, cause?: unknown, name = \"Exception\")\n {\n super(message);\n\n this.cause = cause;\n this.name = name;\n\n if (cause)\n {\n if (cause instanceof Error)\n {\n this.stack += `\\n\\nCaused by ${cause.stack}`;\n }\n else\n {\n this.stack += `\\n\\nCaused by ${cause}`;\n }\n }\n }\n\n public readonly [Symbol.toStringTag]: string = \"Exception\";\n}\n\nexport class FatalErrorException extends Exception\n{\n public constructor(message?: string, cause?: unknown, name = \"FatalErrorException\")\n {\n if (message === undefined)\n {\n message = \"The program has encountered an unrecoverable error and cannot continue as expected. \" +\n \"Please, try again later. If the problem persists, contact the support team.\";\n }\n\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"FatalErrorException\";\n}\nexport class NotImplementedException extends FatalErrorException\n{\n public constructor(message?: string, cause?: unknown, name = \"NotImplementedException\")\n {\n if (message === undefined)\n {\n message = \"This feature is not implemented yet. Please, try again later.\";\n }\n\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"NotImplementedException\";\n}\n","import Exception from \"./core.js\";\n\nexport class FileException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"FileException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"FileException\";\n}\nexport class FileExistsException extends FileException\n{\n public constructor(message: string, cause?: unknown, name = \"FileExistsException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"FileExistsException\";\n}\nexport class FileNotFoundException extends FileException\n{\n public constructor(message: string, cause?: unknown, name = \"FileNotFoundException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"FileNotFoundException\";\n}\n\nexport class KeyException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"KeyException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"KeyException\";\n}\nexport class NetworkException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"NetworkException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"NetworkException\";\n}\nexport class PermissionException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"PermissionException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"PermissionException\";\n}\nexport class ReferenceException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"ReferenceException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"ReferenceException\";\n}\n\nexport class RuntimeException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"RuntimeException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"RuntimeException\";\n}\nexport class EnvironmentException extends RuntimeException\n{\n public constructor(message: string, cause?: unknown, name = \"EnvironmentException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"EnvironmentException\";\n}\n\nexport class TimeoutException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"TimeoutException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"TimeoutException\";\n}\nexport class TypeException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"TypeException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"TypeException\";\n}\n\nexport class ValueException extends Exception\n{\n public constructor(message: string, cause?: unknown, name = \"ValueException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"ValueException\";\n}\nexport class RangeException extends ValueException\n{\n public constructor(message: string, cause?: unknown, name = \"RangeException\")\n {\n super(message, cause, name);\n }\n\n public readonly [Symbol.toStringTag]: string = \"RangeException\";\n}\n\nexport { Exception };\nexport { FatalErrorException, NotImplementedException } from \"./core.js\";\n","import AggregatedIterator from \"../aggregators/aggregated-iterator.js\";\nimport { ValueException } from \"../exceptions/index.js\";\n\nimport type { GeneratorFunction, Iteratee, TypeGuardIteratee, Reducer, IteratorLike } from \"./types.js\";\n\nexport default class SmartIterator<T, R = void, N = undefined> implements Iterator<T, R, N>\n{\n protected _iterator: Iterator<T, R, N>;\n\n public return?: (value?: R) => IteratorResult<T, R>;\n public throw?: (error?: unknown) => IteratorResult<T, R>;\n\n public constructor(iterable: Iterable<T, R, N>);\n public constructor(iterator: Iterator<T, R, N>);\n public constructor(generatorFn: GeneratorFunction<T, R, N>);\n public constructor(argument: IteratorLike<T, R, N> | GeneratorFunction<T, R, N>);\n public constructor(argument: IteratorLike<T, R, N> | GeneratorFunction<T, R, N>)\n {\n if (argument instanceof Function)\n {\n this._iterator = argument();\n }\n else if (Symbol.iterator in argument)\n {\n this._iterator = argument[Symbol.iterator]() as Iterator<T, R, N>;\n }\n else\n {\n this._iterator = argument;\n }\n\n if (this._iterator.return) { this.return = (value) => this._iterator.return!(value); }\n if (this._iterator.throw) { this.throw = (error) => this._iterator.throw!(error); }\n }\n\n public every(predicate: Iteratee<T, boolean>): boolean\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n\n if (result.done) { return true; }\n if (!(predicate(result.value, index))) { return false; }\n\n index += 1;\n }\n }\n public some(predicate: Iteratee<T, boolean>): boolean\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n\n if (result.done) { return false; }\n if (predicate(result.value, index)) { return true; }\n\n index += 1;\n }\n }\n\n public filter(predicate: Iteratee<T, boolean>): SmartIterator<T, R>;\n public filter<S extends T>(predicate: TypeGuardIteratee<T, S>): SmartIterator<S, R>;\n public filter(predicate: Iteratee<T, boolean>): SmartIterator<T, R>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<T, R>(function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = iterator.next();\n\n if (result.done) { return result.value; }\n if (predicate(result.value, index)) { yield result.value; }\n\n index += 1;\n }\n });\n }\n public map<V>(iteratee: Iteratee<T, V>): SmartIterator<V, R>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<V, R>(function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n yield iteratee(result.value, index);\n\n index += 1;\n }\n });\n }\n public reduce(reducer: Reducer<T, T>): T;\n public reduce<A>(reducer: Reducer<T, A>, initialValue: A): A;\n public reduce<A>(reducer: Reducer<T, A>, initialValue?: A): A\n {\n let index = 0;\n let accumulator = initialValue;\n if (accumulator === undefined)\n {\n const result = this._iterator.next();\n if (result.done) { throw new ValueException(\"Cannot reduce an empty iterator without an initial value.\"); }\n\n accumulator = (result.value as unknown) as A;\n index += 1;\n }\n\n while (true)\n {\n const result = this._iterator.next();\n if (result.done) { return accumulator; }\n\n accumulator = reducer(accumulator, result.value, index);\n\n index += 1;\n }\n }\n\n public flatMap<V>(iteratee: Iteratee<T, Iterable<V>>): SmartIterator<V, R>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<V, R>(function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n const iterable = iteratee(result.value, index);\n for (const value of iterable)\n {\n yield value;\n }\n\n index += 1;\n }\n });\n }\n\n public drop(count: number): SmartIterator<T, R | undefined>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<T, R | undefined>(function* ()\n {\n let index = 0;\n while (index < count)\n {\n const result = iterator.next();\n if (result.done) { return; }\n\n index += 1;\n }\n\n while (true)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n }\n });\n }\n public take(limit: number): SmartIterator<T, R | undefined>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<T, R | undefined>(function* ()\n {\n let index = 0;\n while (index < limit)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n\n index += 1;\n }\n\n return;\n });\n }\n\n public find(predicate: Iteratee<T, boolean>): T | undefined;\n public find<S extends T>(predicate: TypeGuardIteratee<T, S>): S | undefined;\n public find(predicate: Iteratee<T, boolean>): T | undefined\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n\n if (result.done) { return; }\n if (predicate(result.value, index)) { return result.value; }\n\n index += 1;\n }\n }\n\n public enumerate(): SmartIterator<[number, T], R>\n {\n return this.map((value, index) => [index, value]);\n }\n public unique(): SmartIterator<T, R>\n {\n const iterator = this._iterator;\n\n return new SmartIterator<T, R>(function* ()\n {\n const values = new Set<T>();\n\n while (true)\n {\n const result = iterator.next();\n\n if (result.done) { return result.value; }\n if (values.has(result.value)) { continue; }\n\n values.add(result.value);\n\n yield result.value;\n }\n });\n }\n\n public count(): number\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n if (result.done) { return index; }\n\n index += 1;\n }\n }\n\n public forEach(iteratee: Iteratee<T>): void\n {\n let index = 0;\n\n while (true)\n {\n const result = this._iterator.next();\n if (result.done) { return; }\n\n iteratee(result.value, index);\n\n index += 1;\n }\n }\n\n public next(...values: N extends undefined ? [] : [N]): IteratorResult<T, R>\n {\n return this._iterator.next(...values);\n }\n\n public groupBy<K extends PropertyKey>(iteratee: Iteratee<T, K>): AggregatedIterator<K, T>\n {\n return new AggregatedIterator(this.map((element, index) =>\n {\n const key = iteratee(element, index);\n\n return [key, element] as [K, T];\n }));\n }\n\n public toArray(): T[]\n {\n return Array.from(this as Iterable<T>);\n }\n\n public readonly [Symbol.toStringTag]: string = \"SmartIterator\";\n\n public [Symbol.iterator](): SmartIterator<T, R, N> { return this; }\n}\n","import { ValueException } from \"../exceptions/index.js\";\nimport { SmartIterator } from \"../iterators/index.js\";\nimport type { GeneratorFunction } from \"../iterators/types.js\";\n\nimport AggregatedIterator from \"./aggregated-iterator.js\";\nimport type { KeyedIteratee, KeyedReducer, KeyedTypeGuardIteratee } from \"./types.js\";\n\nexport default class ReducedIterator<K extends PropertyKey, T>\n{\n protected _elements: SmartIterator<[K, T]>;\n\n public constructor(iterable: Iterable<[K, T]>);\n public constructor(iterator: Iterator<[K, T]>);\n public constructor(generatorFn: GeneratorFunction<[K, T]>);\n public constructor(argument: Iterable<[K, T]> | Iterator<[K, T]> | GeneratorFunction<[K, T]>);\n public constructor(argument: Iterable<[K, T]> | Iterator<[K, T]> | GeneratorFunction<[K, T]>)\n {\n this._elements = new SmartIterator(argument);\n }\n\n public every(predicate: KeyedIteratee<K, T, boolean>): boolean\n {\n for (const [index, [key, element]] of this._elements.enumerate())\n {\n if (!(predicate(key, element, index))) { return false; }\n }\n\n return true;\n }\n public some(predicate: KeyedIteratee<K, T, boolean>): boolean\n {\n for (const [index, [key, element]] of this._elements.enumerate())\n {\n if (predicate(key, element, index)) { return true; }\n }\n\n return false;\n }\n\n public filter(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, T>;\n public filter<S extends T>(predicate: KeyedTypeGuardIteratee<K, T, S>): ReducedIterator<K, S>;\n public filter(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, T>\n {\n const elements = this._elements.enumerate();\n\n return new ReducedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n if (predicate(key, element, index)) { yield [key, element]; }\n }\n });\n }\n public map<V>(iteratee: KeyedIteratee<K, T, V>): ReducedIterator<K, V>\n {\n const elements = this._elements.enumerate();\n\n return new ReducedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n yield [key, iteratee(key, element, index)];\n }\n });\n }\n public reduce(reducer: KeyedReducer<K, T, T>): T;\n public reduce<A>(reducer: KeyedReducer<K, T, A>, initialValue: A): A;\n public reduce<A>(reducer: KeyedReducer<K, T, A>, initialValue?: A): A\n {\n let index = 0;\n let accumulator = initialValue;\n if (accumulator === undefined)\n {\n const result = this._elements.next();\n if (result.done) { throw new ValueException(\"Cannot reduce an empty iterator without an initial value.\"); }\n\n accumulator = (result.value[1] as unknown) as A;\n index += 1;\n }\n\n for (const [key, element] of this._elements)\n {\n accumulator = reducer(key, accumulator, element, index);\n\n index += 1;\n }\n\n return accumulator;\n }\n\n public flatMap<V>(iteratee: KeyedIteratee<K, T, Iterable<V>>): AggregatedIterator<K, V>\n {\n const elements = this._elements.enumerate();\n\n return new AggregatedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n for (const value of iteratee(key, element, index)) { yield [key, value]; }\n }\n });\n }\n\n public drop(count: number): ReducedIterator<K, T>\n {\n const elements = this._elements.enumerate();\n\n return new ReducedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n if (index >= count) { yield [key, element]; }\n }\n });\n }\n public take(count: number): ReducedIterator<K, T>\n {\n const elements = this._elements.enumerate();\n\n return new ReducedIterator(function* ()\n {\n for (const [index, [key, element]] of elements)\n {\n if (index >= count) { break; }\n\n yield [key, element];\n }\n });\n }\n\n public enumerate(): ReducedIterator<K, [number, T]>\n {\n return this.map((_, element, index) => [index, element]);\n }\n public unique(): ReducedIterator<K, T>\n {\n const elements = this._elements;\n\n return new ReducedIterator(function* ()\n {\n const values = new Set<T>();\n\n for (const [key, element] of elements)\n {\n if (values.has(element)) { continue; }\n values.add(element);\n\n yield [key, element];\n }\n });\n }\n\n public count(): number\n {\n let index = 0;\n\n for (const _ of this._elements) { index += 1; }\n\n return index;\n }\n\n public forEach(iteratee: KeyedIteratee<K, T>): void\n {\n for (const [index, [key, element]] of this._elements.enumerate())\n {\n iteratee(key, element, index);\n }\n }\n\n public keys(): SmartIterator<K>\n {\n const elements = this._elements;\n\n return new SmartIterator<K>(function* ()\n {\n for (const [key] of elements)\n {\n yield key;\n }\n });\n }\n public items(): SmartIterator<[K, T]>\n {\n return this._elements;\n }\n public values(): SmartIterator<T>\n {\n const elements = this._elements;\n\n return new SmartIterator<T>(function* ()\n {\n for (const [_, element] of elements)\n {\n yield element;\n }\n });\n }\n\n public toArray(): T[]\n {\n return Array.from(this.values());\n }\n public toMap(): Map<K, T>\n {\n return new Map(this.items());\n }\n public toObject(): Record<K, T>\n {\n return Object.fromEntries(this.items()) as Record<K, T>;\n }\n\n public readonly [Symbol.toStringTag]: string = \"ReducedIterator\";\n}\n","import { SmartAsyncIterator } from \"../iterators/index.js\";\nimport type {\n GeneratorFunction,\n AsyncGeneratorFunction,\n MaybeAsyncGeneratorFunction,\n MaybeAsyncIteratorLike\n\n} from \"../iterators/types.js\";\nimport type { MaybePromise } from \"../types.js\";\n\nimport ReducedIterator from \"./reduced-iterator.js\";\nimport type { MaybeAsyncKeyedIteratee, MaybeAsyncKeyedTypeGuardIteratee, MaybeAsyncKeyedReducer } from \"./types.js\";\n\nexport default class AggregatedAsyncIterator<K extends PropertyKey, T>\n{\n protected _elements: SmartAsyncIterator<[K, T]>;\n\n public constructor(iterable: Iterable<[K, T]>);\n public constructor(iterable: AsyncIterable<[K, T]>);\n public constructor(iterator: Iterator<[K, T]>);\n public constructor(iterator: AsyncIterator<[K, T]>);\n public constructor(generatorFn: GeneratorFunction<[K, T]>);\n public constructor(generatorFn: AsyncGeneratorFunction<[K, T]>);\n public constructor(argument: MaybeAsyncIteratorLike<[K, T]> | MaybeAsyncGeneratorFunction<[K, T]>);\n public constructor(argument: MaybeAsyncIteratorLike<[K, T]> | MaybeAsyncGeneratorFunction<[K, T]>)\n {\n this._elements = new SmartAsyncIterator(argument);\n }\n\n public async every(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): Promise<ReducedIterator<K, boolean>>\n {\n const values = new Map<K, [number, boolean]>();\n\n for await (const [key, element] of this._elements)\n {\n const [index, result] = values.get(key) ?? [0, true];\n\n if (!(result)) { continue; }\n\n values.set(key, [index + 1, await predicate(key, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, result]] of values) { yield [key, result]; }\n });\n }\n public async some(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): Promise<ReducedIterator<K, boolean>>\n {\n const values = new Map<K, [number, boolean]>();\n\n for await (const [key, element] of this._elements)\n {\n const [index, result] = values.get(key) ?? [0, false];\n\n if (result) { continue; }\n\n values.set(key, [index + 1, await predicate(key, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, result]] of values) { yield [key, result]; }\n });\n }\n\n public filter(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): AggregatedAsyncIterator<K, T>;\n public filter<S extends T>(predicate: MaybeAsyncKeyedTypeGuardIteratee<K, T, S>): AggregatedAsyncIterator<K, S>;\n public filter(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): AggregatedAsyncIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, T]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n\n if (await predicate(key, element, index)) { yield [key, element]; }\n\n indexes.set(key, index + 1);\n }\n });\n }\n public map<V>(iteratee: MaybeAsyncKeyedIteratee<K, T, V>): AggregatedAsyncIterator<K, V>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, V]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n\n yield [key, await iteratee(key, element, index)];\n\n indexes.set(key, index + 1);\n }\n });\n }\n public async reduce(reducer: MaybeAsyncKeyedReducer<K, T, T>): Promise<ReducedIterator<K, T>>;\n public async reduce<A>(reducer: MaybeAsyncKeyedReducer<K, T, A>, initialValue: (key: K) => MaybePromise<A>)\n : Promise<ReducedIterator<K, A>>;\n public async reduce<A>(reducer: MaybeAsyncKeyedReducer<K, T, A>, initialValue?: (key: K) => MaybePromise<A>)\n : Promise<ReducedIterator<K, A>>\n {\n const values = new Map<K, [number, A]>();\n\n for await (const [key, element] of this._elements)\n {\n let index: number;\n let accumulator: A;\n\n if (values.has(key)) { [index, accumulator] = values.get(key)!; }\n else if (initialValue !== undefined)\n {\n index = 0;\n accumulator = await initialValue(key);\n }\n else\n {\n values.set(key, [0, (element as unknown) as A]);\n\n continue;\n }\n\n values.set(key, [index + 1, await reducer(key, accumulator, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, accumulator]] of values) { yield [key, accumulator]; }\n });\n }\n\n public flatMap<V>(iteratee: MaybeAsyncKeyedIteratee<K, T, Iterable<V>>): AggregatedAsyncIterator<K, V>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, V]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n const values = await iteratee(key, element, index);\n\n for await (const value of values) { yield [key, value]; }\n\n indexes.set(key, index + 1);\n }\n });\n }\n\n public drop(count: number): AggregatedAsyncIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, T]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n if (index < count)\n {\n indexes.set(key, index + 1);\n\n continue;\n }\n\n yield [key, element];\n }\n });\n }\n public take(limit: number): AggregatedAsyncIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, T]>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n if (index >= limit) { continue; }\n\n yield [key, element];\n\n indexes.set(key, index + 1);\n }\n });\n }\n\n public async find(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): Promise<ReducedIterator<K, T | undefined>>;\n public async find<S extends T>(predicate: MaybeAsyncKeyedTypeGuardIteratee<K, T, S>)\n : Promise<ReducedIterator<K, S | undefined>>;\n\n public async find(predicate: MaybeAsyncKeyedIteratee<K, T, boolean>): Promise<ReducedIterator<K, T | undefined>>\n {\n const values = new Map<K, [number, T | undefined]>();\n\n for await (const [key, element] of this._elements)\n {\n let [index, finding] = values.get(key) ?? [0, undefined];\n\n if (finding !== undefined) { continue; }\n if (await predicate(key, element, index)) { finding = element; }\n\n values.set(key, [index + 1, finding]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, finding]] of values) { yield [key, finding]; }\n });\n }\n\n public unique(): AggregatedAsyncIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedAsyncIterator(async function* (): AsyncGenerator<[K, T]>\n {\n const keys = new Map<K, Set<T>>();\n\n for await (const [key, element] of elements)\n {\n const values = keys.get(key) ?? new Set<T>();\n\n if (values.has(element)) { continue; }\n\n values.add(element);\n keys.set(key, values);\n\n yield [key, element];\n }\n });\n }\n\n public async count(): Promise<ReducedIterator<K, number>>\n {\n const counters = new Map<K, number>();\n\n for await (const [key] of this._elements)\n {\n const count = counters.get(key) ?? 0;\n\n counters.set(key, count + 1);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, count] of counters) { yield [key, count]; }\n });\n }\n\n public async forEach(iteratee: MaybeAsyncKeyedIteratee<K, T>): Promise<void>\n {\n const indexes = new Map<K, number>();\n\n for await (const [key, element] of this._elements)\n {\n const index = indexes.get(key) ?? 0;\n\n iteratee(key, element, index);\n\n indexes.set(key, index + 1);\n }\n }\n\n public keys(): SmartAsyncIterator<K>\n {\n const elements = this._elements;\n\n return new SmartAsyncIterator<K>(async function* ()\n {\n const keys = new Set<K>();\n\n for await (const [key] of elements)\n {\n if (keys.has(key)) { continue; }\n keys.add(key);\n\n yield key;\n }\n });\n }\n public items(): SmartAsyncIterator<[K, T]>\n {\n return this._elements;\n }\n public values(): SmartAsyncIterator<T>\n {\n const elements = this._elements;\n\n return new SmartAsyncIterator<T>(async function* ()\n {\n for await (const [_, element] of elements) { yield element; }\n });\n }\n\n public async toArray(): Promise<T[][]>\n {\n const map = await this.toMap();\n\n return Array.from(map.values());\n }\n public async toMap(): Promise<Map<K, T[]>>\n {\n const groups = new Map<K, T[]>();\n\n for await (const [key, element] of this._elements)\n {\n const value = groups.get(key) ?? [];\n\n value.push(element);\n groups.set(key, value);\n }\n\n return groups;\n }\n public async toObject(): Promise<Record<K, T[]>>\n {\n const groups = { } as Record<K, T[]>;\n\n for await (const [key, element] of this._elements)\n {\n const value = groups[key] ?? [];\n\n value.push(element);\n groups[key] = value;\n }\n\n return groups;\n }\n\n public readonly [Symbol.toStringTag]: string = \"AggregatedAsyncIterator\";\n}\n","import AggregatedAsyncIterator from \"../aggregators/aggregated-async-iterator.js\";\nimport { ValueException } from \"../exceptions/index.js\";\n\nimport type {\n GeneratorFunction,\n AsyncGeneratorFunction,\n MaybeAsyncGeneratorFunction,\n MaybeAsyncIteratee,\n MaybeAsyncReducer,\n MaybeAsyncIterable,\n MaybeAsyncIteratorLike,\n MaybeAsyncTypeGuardIteratee\n\n} from \"./types.js\";\n\nexport default class SmartAsyncIterator<T, R = void, N = undefined> implements AsyncIterator<T, R, N>\n{\n protected _iterator: AsyncIterator<T, R, N>;\n\n public return?: (value?: R) => Promise<IteratorResult<T, R>>;\n public throw?: (error?: unknown) => Promise<IteratorResult<T, R>>;\n\n public constructor(iterable: Iterable<T>);\n public constructor(iterable: AsyncIterable<T>);\n public constructor(iterator: Iterator<T, R, N>);\n public constructor(iterator: AsyncIterator<T, R, N>);\n public constructor(generatorFn: GeneratorFunction<T, R, N>);\n public constructor(generatorFn: AsyncGeneratorFunction<T, R, N>);\n public constructor(argument: MaybeAsyncIteratorLike<T, R, N> | MaybeAsyncGeneratorFunction<T, R, N>);\n public constructor(argument: MaybeAsyncIteratorLike<T, R, N> | MaybeAsyncGeneratorFunction<T, R, N>)\n {\n if (argument instanceof Function)\n {\n const generator = argument();\n if (Symbol.asyncIterator in generator)\n {\n this._iterator = generator;\n }\n else\n {\n this._iterator = (async function* ()\n {\n let next: [] | [N] = [];\n\n while (true)\n {\n const result = generator.next(...next);\n if (result.done) { return result.value; }\n\n next = [yield result.value];\n }\n\n })();\n }\n }\n else if (Symbol.asyncIterator in argument)\n {\n this._iterator = argument[Symbol.asyncIterator]() as AsyncIterator<T, R, N>;\n }\n else if (Symbol.iterator in argument)\n {\n const iterator = argument[Symbol.iterator]();\n this._iterator = (async function* ()\n {\n while (true)\n {\n const result = iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n }\n\n })();\n }\n else\n {\n this._iterator = (async function* ()\n {\n let next: [] | [N] = [];\n\n while (true)\n {\n const result: IteratorResult<T, R> = await argument.next(...next);\n if (result.done) { return result.value; }\n\n next = [yield result.value];\n }\n\n })();\n }\n\n if (this._iterator.return) { this.return = (value?: R) => this._iterator.return!(value); }\n if (this._iterator.throw) { this.throw = (error?: unknown) => this._iterator.throw!(error); }\n }\n\n public async every(predicate: MaybeAsyncIteratee<T, boolean>): Promise<boolean>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n\n if (result.done) { return true; }\n if (!(await predicate(result.value, index))) { return false; }\n\n index += 1;\n }\n }\n public async some(predicate: MaybeAsyncIteratee<T, boolean>): Promise<boolean>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n\n if (result.done) { return false; }\n if (await predicate(result.value, index)) { return true; }\n\n index += 1;\n }\n }\n\n public filter(predicate: MaybeAsyncIteratee<T, boolean>): SmartAsyncIterator<T, R>;\n public filter<S extends T>(predicate: MaybeAsyncTypeGuardIteratee<T, S>): SmartAsyncIterator<S, R>;\n public filter(predicate: MaybeAsyncIteratee<T, boolean>): SmartAsyncIterator<T, R>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<T, R>(async function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = await iterator.next();\n\n if (result.done) { return result.value; }\n if (await predicate(result.value, index)) { yield result.value; }\n\n index += 1;\n }\n });\n }\n public map<V>(iteratee: MaybeAsyncIteratee<T, V>): SmartAsyncIterator<V, R>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<V, R>(async function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = await iterator.next();\n if (result.done) { return result.value; }\n\n yield await iteratee(result.value, index);\n\n index += 1;\n }\n });\n }\n public async reduce(reducer: MaybeAsyncReducer<T, T>): Promise<T>;\n public async reduce<A>(reducer: MaybeAsyncReducer<T, A>, initialValue: A): Promise<A>;\n public async reduce<A>(reducer: MaybeAsyncReducer<T, A>, initialValue?: A): Promise<A>\n {\n let index = 0;\n let accumulator = initialValue;\n if (accumulator === undefined)\n {\n const result = await this._iterator.next();\n if (result.done) { throw new ValueException(\"Cannot reduce an empty iterator without an initial value.\"); }\n\n accumulator = (result.value as unknown) as A;\n index += 1;\n }\n\n while (true)\n {\n const result = await this._iterator.next();\n if (result.done) { return accumulator; }\n\n accumulator = await reducer(accumulator, result.value, index);\n\n index += 1;\n }\n }\n\n public flatMap<V>(iteratee: MaybeAsyncIteratee<T, MaybeAsyncIterable<V>>): SmartAsyncIterator<V, R>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<V, R>(async function* ()\n {\n let index = 0;\n\n while (true)\n {\n const result = await iterator.next();\n if (result.done) { return result.value; }\n\n const elements = await iteratee(result.value, index);\n\n for await (const element of elements)\n {\n yield element;\n }\n\n index += 1;\n }\n });\n }\n\n public drop(count: number): SmartAsyncIterator<T, R | undefined>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<T, R | undefined>(async function* ()\n {\n let index = 0;\n\n while (index < count)\n {\n const result = await iterator.next();\n if (result.done) { return; }\n\n index += 1;\n }\n\n while (true)\n {\n const result = await iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n }\n });\n }\n public take(limit: number): SmartAsyncIterator<T, R | undefined>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<T, R | undefined>(async function* ()\n {\n let index = 0;\n\n while (index < limit)\n {\n const result = await iterator.next();\n if (result.done) { return result.value; }\n\n yield result.value;\n\n index += 1;\n }\n\n return;\n });\n }\n\n public async find(predicate: MaybeAsyncIteratee<T, boolean>): Promise<T | undefined>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n\n if (result.done) { return; }\n if (await predicate(result.value, index)) { return result.value; }\n\n index += 1;\n }\n }\n\n public enumerate(): SmartAsyncIterator<[number, T], R>\n {\n return this.map((value, index) => [index, value]);\n }\n public unique(): SmartAsyncIterator<T, R>\n {\n const iterator = this._iterator;\n\n return new SmartAsyncIterator<T, R>(async function* ()\n {\n const values = new Set<T>();\n\n while (true)\n {\n const result = await iterator.next();\n\n if (result.done) { return result.value; }\n if (values.has(result.value)) { continue; }\n\n values.add(result.value);\n\n yield result.value;\n }\n });\n }\n\n public async count(): Promise<number>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n if (result.done) { return index; }\n\n index += 1;\n }\n }\n public async forEach(iteratee: MaybeAsyncIteratee<T>): Promise<void>\n {\n let index = 0;\n\n while (true)\n {\n const result = await this._iterator.next();\n if (result.done) { return; }\n\n await iteratee(result.value, index);\n\n index += 1;\n }\n }\n\n public next(...values: N extends undefined ? [] : [N]): Promise<IteratorResult<T, R>>\n {\n return this._iterator.next(...values);\n }\n\n public groupBy<K extends PropertyKey>(iteratee: MaybeAsyncIteratee<T, K>): AggregatedAsyncIterator<K, T>\n {\n return new AggregatedAsyncIterator(this.map(async (element, index) =>\n {\n const key = await iteratee(element, index);\n\n return [key, element] as [K, T];\n }));\n }\n\n public toArray(): Promise<T[]>\n {\n return Array.fromAsync(this as AsyncIterable<T>);\n }\n\n public readonly [Symbol.toStringTag]: string = \"SmartAsyncIterator\";\n\n public [Symbol.asyncIterator](): SmartAsyncIterator<T, R, N> { return this; }\n}\n","import { SmartIterator } from \"../iterators/index.js\";\nimport type { GeneratorFunction, IteratorLike } from \"../iterators/types.js\";\n\nimport ReducedIterator from \"./reduced-iterator.js\";\nimport type { KeyedIteratee, KeyedTypeGuardIteratee, KeyedReducer } from \"./types.js\";\n\nexport default class AggregatedIterator<K extends PropertyKey, T>\n{\n protected _elements: SmartIterator<[K, T]>;\n\n public constructor(iterable: Iterable<[K, T]>);\n public constructor(iterator: Iterator<[K, T]>);\n public constructor(generatorFn: GeneratorFunction<[K, T]>);\n public constructor(argument: IteratorLike<[K, T]> | GeneratorFunction<[K, T]>);\n public constructor(argument: IteratorLike<[K, T]> | GeneratorFunction<[K, T]>)\n {\n this._elements = new SmartIterator(argument);\n }\n\n public every(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, boolean>\n {\n const values = new Map<K, [number, boolean]>();\n\n for (const [key, element] of this._elements)\n {\n const [index, result] = values.get(key) ?? [0, true];\n\n if (!(result)) { continue; }\n\n values.set(key, [index + 1, predicate(key, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, result]] of values) { yield [key, result]; }\n });\n }\n public some(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, boolean>\n {\n const values = new Map<K, [number, boolean]>();\n\n for (const [key, element] of this._elements)\n {\n const [index, result] = values.get(key) ?? [0, false];\n\n if (result) { continue; }\n\n values.set(key, [index + 1, predicate(key, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, result]] of values) { yield [key, result]; }\n });\n }\n\n public filter(predicate: KeyedIteratee<K, T, boolean>): AggregatedIterator<K, T>;\n public filter<S extends T>(predicate: KeyedTypeGuardIteratee<K, T, S>): AggregatedIterator<K, S>;\n public filter(predicate: KeyedIteratee<K, T, boolean>): AggregatedIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n\n if (predicate(key, element, index)) { yield [key, element]; }\n\n indexes.set(key, index + 1);\n }\n });\n }\n public map<V>(iteratee: KeyedIteratee<K, T, V>): AggregatedIterator<K, V>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n\n yield [key, iteratee(key, element, index)];\n\n indexes.set(key, index + 1);\n }\n });\n }\n public reduce(reducer: KeyedReducer<K, T, T>): ReducedIterator<K, T>;\n public reduce<A>(reducer: KeyedReducer<K, T, A>, initialValue: (key: K) => A): ReducedIterator<K, A>;\n public reduce<A>(reducer: KeyedReducer<K, T, A>, initialValue?: (key: K) => A): ReducedIterator<K, A>\n {\n const values = new Map<K, [number, A]>();\n\n for (const [key, element] of this._elements)\n {\n let index: number;\n let accumulator: A;\n\n if (values.has(key)) { [index, accumulator] = values.get(key)!; }\n else if (initialValue !== undefined)\n {\n index = 0;\n accumulator = initialValue(key);\n }\n else\n {\n values.set(key, [0, (element as unknown) as A]);\n\n continue;\n }\n\n values.set(key, [index + 1, reducer(key, accumulator, element, index)]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, accumulator]] of values) { yield [key, accumulator]; }\n });\n }\n\n public flatMap<V>(iteratee: KeyedIteratee<K, T, Iterable<V>>): AggregatedIterator<K, V>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n const values = iteratee(key, element, index);\n\n for (const value of values) { yield [key, value]; }\n\n indexes.set(key, index + 1);\n }\n });\n }\n\n public drop(count: number): AggregatedIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n if (index < count)\n {\n indexes.set(key, index + 1);\n\n continue;\n }\n\n yield [key, element];\n }\n });\n }\n public take(limit: number): AggregatedIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of elements)\n {\n const index = indexes.get(key) ?? 0;\n if (index >= limit) { continue; }\n\n yield [key, element];\n\n indexes.set(key, index + 1);\n }\n });\n }\n\n public find(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, T | undefined>;\n public find<S extends T>(predicate: KeyedTypeGuardIteratee<K, T, S>): ReducedIterator<K, S | undefined>;\n public find(predicate: KeyedIteratee<K, T, boolean>): ReducedIterator<K, T | undefined>\n {\n const values = new Map<K, [number, T | undefined]>();\n\n for (const [key, element] of this._elements)\n {\n let [index, finding] = values.get(key) ?? [0, undefined];\n\n if (finding !== undefined) { continue; }\n if (predicate(key, element, index)) { finding = element; }\n\n values.set(key, [index + 1, finding]);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, [_, finding]] of values) { yield [key, finding]; }\n });\n }\n\n public enumerate(): AggregatedIterator<K, [number, T]>\n {\n return this.map((_, value, index) => [index, value]);\n }\n public unique(): AggregatedIterator<K, T>\n {\n const elements = this._elements;\n\n return new AggregatedIterator(function* ()\n {\n const keys = new Map<K, Set<T>>();\n\n for (const [key, element] of elements)\n {\n const values = keys.get(key) ?? new Set<T>();\n\n if (values.has(element)) { continue; }\n\n values.add(element);\n keys.set(key, values);\n\n yield [key, element];\n }\n });\n }\n\n public count(): ReducedIterator<K, number>\n {\n const counters = new Map<K, number>();\n\n for (const [key] of this._elements)\n {\n const count = counters.get(key) ?? 0;\n\n counters.set(key, count + 1);\n }\n\n return new ReducedIterator(function* ()\n {\n for (const [key, count] of counters) { yield [key, count]; }\n });\n }\n\n public forEach(iteratee: KeyedIteratee<K, T>): void\n {\n const indexes = new Map<K, number>();\n\n for (const [key, element] of this._elements)\n {\n const index = indexes.get(key) ?? 0;\n\n iteratee(key, element, index);\n\n indexes.set(key, index + 1);\n }\n }\n\n public keys(): SmartIterator<K>\n {\n const elements = this._elements;\n\n return new SmartIterator<K>(function* ()\n {\n const keys = new Set<K>();\n\n for (const [key] of elements)\n {\n if (keys.has(key)) { continue; }\n keys.add(key);\n\n yield key;\n }\n });\n }\n public items(): SmartIterator<[K, T]>\n {\n return this._elements;\n }\n public values(): SmartIterator<T>\n {\n const elements = this._elements;\n\n return new SmartIterator<T>(function* ()\n {\n for (const [_, element] of elements) { yield element; }\n });\n }\n\n public toArray(): T[][]\n {\n const map = this.toMap();\n\n return Array.from(map.values());\n }\n public toMap(): Map<K, T[]>\n {\n const groups = new Map<K, T[]>();\n\n for (const [key, element] of this._elements)\n {\n const value = groups.get(key) ?? [];\n\n value.push(element);\n groups.set(key, value);\n }\n\n return groups;\n }\n public toObject(): Record<K, T[]>\n {\n const groups = { } as Record<K, T[]>;\n\n for (const [key, element] of this._elements)\n {\n const value = groups[key] ?? [];\n\n value.push(element);\n groups[key] = value;\n }\n\n return groups;\n }\n\n public readonly [Symbol.toStringTag]: string = \"AggregatedIterator\";\n}\n","import type { Interval } from \"../core/types.js\";\nimport { isBrowser } from \"../helpers.js\";\n\nimport { FatalErrorException, RuntimeException } from \"./exceptions/index.js\";\n\nexport default class GameLoop\n{\n protected _handle?: number | Interval;\n\n protected _startTime: number;\n public get startTime(): number\n {\n return this._startTime;\n }\n\n protected _isRunning: boolean;\n public get isRunning(): boolean\n {\n return this._isRunning;\n }\n\n public get elapsedTime(): number\n {\n return performance.now() - this._startTime;\n }\n\n protected _start: () => void;\n protected _stop: () => void;\n\n public constructor(callback: FrameRequestCallback, msIfNotBrowser = 40)\n {\n this._startTime = 0;\n this._isRunning = false;\n\n if (isBrowser)\n {\n this._start = () =>\n {\n callback(this.elapsedTime);\n\n this._handle = window.requestAnimationFrame(this._start);\n };\n\n this._stop = () => window.cancelAnimationFrame(this._handle as number);\n }\n else\n {\n // eslint-disable-next-line no-console\n console.warn(\n \"Not a browser environment detected. \" +\n `Using setInterval@${msIfNotBrowser}ms instead of requestAnimationFrame...`\n );\n\n this._start = () =>\n {\n this._handle = setInterval(() => callback(this.elapsedTime), msIfNotBrowser);\n };\n\n this._stop = () => clearInterval(this._handle as Interval);\n }\n }\n\n public start(elapsedTime = 0): void\n {\n if (this._isRunning) { throw new RuntimeException(\"The game loop has already been started.\"); }\n\n this._startTime = performance.now() - elapsedTime;\n this._start();\n this._isRunning = true;\n }\n\n public stop(): void\n {\n if (!(this._isRunning)) { throw new RuntimeException(\"The game loop hadn't yet started.\"); }\n if (!(this._handle)) { throw new FatalErrorException(); }\n\n this._stop();\n this._handle = undefined;\n this._isRunning = false;\n }\n\n public readonly [Symbol.toStringTag]: string = \"GameLoop\";\n}\n","\nimport { isBrowser } from \"../../helpers.js\";\nimport { EnvironmentException } from \"../exceptions/index.js\";\n\nimport type { JSONValue } from \"./types.js\";\n\n/**\n * A wrapper around the `Storage` API to store and retrieve JSON values.\n *\n * It allows to handle either the `sessionStorage` or the `localStorage`\n * storage at the same time, depending on the required use case.\n */\nexport default class JSONStorage\n{\n protected _preferPersistence: boolean;\n\n protected _volatile: Storage;\n protected _persistent: Storage;\n\n public constructor(preferPersistence = true)\n {\n this._preferPersistence = preferPersistence;\n\n if (!(isBrowser))\n {\n throw new EnvironmentException(\n \"The `JSONStorage` class can only be instantiated within a browser environment.\"\n );\n }\n\n this._volatile = window.sessionStorage;\n this._persistent = window.localStorage;\n }\n\n protected _get<T extends JSONValue>(storage: Storage, propertyName: string): T | undefined;\n protected _get<T extends JSONValue>(storage: Storage, propertyName: string, defaultValue: T): T;\n protected _get<T extends JSONValue>(storage: Storage, propertyName: string, defaultValue?: T): T | undefined;\n protected _get<T extends JSONValue>(storage: Storage, propertyName: string, defaultValue?: T): T | undefined\n {\n const propertyValue = storage.getItem(propertyName);\n if (propertyValue)\n {\n try\n {\n return JSON.parse(propertyValue);\n }\n catch\n {\n // eslint-disable-next-line no-console\n console.warn(\n `The \"${propertyValue}\" value for \"${propertyName}\"` +\n \" property cannot be parsed. Clearing the storage...\");\n\n storage.removeItem(propertyName);\n }\n }\n\n return defaultValue;\n }\n protected _set<T extends JSONValue>(storage: Storage, propertyName: string, newValue?: T): void\n {\n const encodedValue = JSON.stringify(newValue);\n if (encodedValue)\n {\n storage.setItem(propertyName, encodedValue);\n }\n else\n {\n storage.removeItem(propertyName);\n }\n }\n\n /**\n * Retrieves the value with the specified name from the corresponding storage.\n *\n * @param propertyName The name of the property to retrieve.\n * @param defaultValue The default value to return if the property does not exist.\n * @param persistent Whether to use the persistent `localStorage` or the volatile `sessionStorage`.\n *\n * @returns The value of the property or the default value if the property does not exist.\n */\n public get<T extends JSONValue>(propertyName: string, defaultValue: undefined, persistent?: boolean): T | undefined;\n public get<T extends JSONValue>(propertyName: string, defaultValue: T, persistent?: boolean): T ;\n public get<T extends JSONValue>(propertyName: string, defaultValue?: T, persistent?: boolean): T | undefined;\n public get<T extends JSONValue>(propertyName: string, defaultValue?: T, persistent = this._preferPersistence)\n : T | undefined\n {\n const storage = persistent ? this._persistent : this._volatile;\n\n return this._get<T>(storage, propertyName, defaultValue);\n }\n /**\n * Retrieves the value with the specified name from the volatile `sessionStorage`.\n *\n * @param propertyName The name of the property to retrieve.\n * @param defaultValue The default value to return if the property does not exist.\n *\n * @returns The value of the property or the default value if the property does not exist.\n */\n public recall<T extends JSONValue>(propertyName: string): T | undefined;\n public recall<T extends JSONValue>(propertyName: string, defaultValue: T): T;\n public recall<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined;\n public recall<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined\n {\n return this._get<T>(this._volatile, propertyName, defaultValue);\n }\n /**\n * Retrieves the value with the specified name looking first in the\n * volatile `sessionStorage` and then in the persistent `localStorage`.\n *\n * @param propertyName The name of the property to retrieve.\n * @param defaultValue The default value to return if the property does not exist.\n *\n * @returns The value of the property or the default value if the property does not exist.\n */\n public retrieve<T extends JSONValue>(propertyName: string): T | undefined;\n public retrieve<T extends JSONValue>(propertyName: string, defaultValue: T): T;\n public retrieve<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined;\n public retrieve<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined\n {\n return this.recall<T>(propertyName) ?? this.read<T>(propertyName, defaultValue);\n }\n /**\n * Retrieves the value with the specified name from the persistent `localStorage`.\n *\n * @param propertyName The name of the property to retrieve.\n * @param defaultValue The default value to return if the property does not exist.\n *\n * @returns The value of the property or the default value if the property does not exist.\n */\n public read<T extends JSONValue>(propertyName: string): T | undefined;\n public read<T extends JSONValue>(propertyName: string, defaultValue: T): T;\n public read<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined;\n public read<T extends JSONValue>(propertyName: string, defaultValue?: T): T | undefined\n {\n return this._get<T>(this._persistent, propertyName, defaultValue);\n }\n\n /**\n * Checks whether the property with the specified name exists in the corresponding storage.\n *\n * @param propertyName The name of the property to check.\n * @param persistent Whether to use the persistent `localStorage` or the volatile `sessionStorage`.\n *\n * @returns `true` if the property exists, `false` otherwise.\n */\n public has(propertyName: string, persistent?: boolean): boolean\n {\n const storage = persistent ? this._persistent : this._volatile;\n\n return storage.getItem(propertyName) !== null;\n }\n /**\n * Checks whether the property with the specified name exists in the volatile `sessionStorage`.\n *\n * @param propertyName The name of the property to check.\n *\n * @returns `true` if the property exists, `false` otherwise.\n */\n public knows(propertyName: string): boolean\n {\n return this._volatile.getItem(propertyName) !== null;\n }\n /**\n * Checks whether the property with the specified name exists looking first in the\n * volatile `sessionStorage` and then in the persistent `localStorage`.\n *\n * @param propertyName The name of the property to check.\n *\n * @returns `true` if the property exists, `false` otherwise.\n */\n public find(propertyName: string): boolean\n {\n return this.knows(propertyName) ?? this.exists(propertyName);\n }\n /**\n * Checks whether the property with the specified name exists in the persistent `localStorage`.\n *\n * @param propertyName The name of the property to check.\n *\n * @returns `true` if the property exists, `false` otherwise.\n */\n public exists(propertyName: string): boolean\n {\n return this._persistent.getItem(propertyName) !== null;\n }\n\n /**\n * Sets the value with the specified name in the corresponding storage.\n * If the value is `undefined`, the property is removed from the storage.\n *\n * @param propertyName The name of the property to set.\n * @param newValue The new value to set.\n * @param persistent Whether to use the persistent `localStorage` or the volatile `sessionStorage`.\n */\n public set<T extends JSONValue>(propertyName: string, newValue?: T, persistent = this._preferPersistence): void\n {\n const storage = persistent ? this._persistent : this._volatile;\n\n this._set<T>(storage, propertyName, newValue);\n }\n /**\n * Sets the value with the specified name in the volatile `sessionStorage`.\n * If the value is `undefined`, the property is removed from the storage.\n *\n * @param propertyName The name of the property to set.\n * @param newValue The new value to set.\n */\n public remember<T extends JSONValue>(propertyName: string, newValue?: T): void\n {\n this._set<T>(this._volatile, propertyName, newValue);\n }\n /**\n * Sets the value with the specified name in the persistent `localStorage`.\n * If the value is `undefined`, the property is removed from the storage.\n *\n * @param propertyName The name of the property to set.\n * @param newValue The new value to set.\n */\n public write<T extends JSONValue>(propertyName: string, newValue?: T): void\n {\n this._set<T>(this._persistent, propertyName, newValue);\n }\n\n /**\n * Removes the value with the specified name from the volatile `sessionStorage`.\n *\n * @param propertyName The name of the property to remove.\n */\n public forget(propertyName: string): void\n {\n this._volatile.removeItem(propertyName);\n }\n /**\n * Removes the value with the specified name from the persistent `localStorage`.\n *\n * @param propertyName The name of the property to remove.\n */\n public erase(propertyName: string): void\n {\n this._persistent.removeItem(propertyName);\n }\n /**\n * Removes the value with the specified name from all the storages.\n *\n * @param propertyName The name of the property to remove.\n */\n public clear(propertyName: string): void\n {\n this._volatile.removeItem(propertyName);\n this._persistent.removeItem(propertyName);\n }\n\n public readonly [Symbol.toStringTag]: string = \"JSONStorage\";\n}\n","import type { FulfilledHandler, PromiseExecutor, RejectedHandler } from \"./types.js\";\n\nexport default class SmartPromise<T = void> implements Promise<T>\n{\n public static FromPromise<T>(promise: Promise<T>): SmartPromise<T>\n {\n return new SmartPromise((resolve, reject) => promise.then(resolve, reject));\n }\n\n protected _isPending: boolean;\n protected _isFulfilled: boolean;\n protected _isRejected: boolean;\n\n protected _promise: Promise<T>;\n\n public constructor(executor: PromiseExecutor<T>)\n {\n this._isPending = true;\n this._isFulfilled = false;\n this._isRejected = false;\n\n const _onFulfilled = (result: T): T =>\n {\n this._isPending = false;\n this._isFulfilled = true;\n\n return result;\n };\n const _onRejected = (reason: unknown): never =>\n {\n this._isPending = false;\n this._isRejected = true;\n\n throw reason;\n };\n\n this._promise = new Promise<T>(executor)\n .then(_onFulfilled, _onRejected);\n }\n\n public get isPending(): boolean { return this._isPending; }\n public get isFulfilled(): boolean { return this._isFulfilled; }\n public get isRejected(): boolean { return this._isRejected; }\n\n public then(onFulfilled?: null): Promise<T>;\n public then<F = T>(onFulfilled: FulfilledHandler<T, F>, onRejected?: null): Promise<F>;\n public then<F = T, R = never>(onFulfilled: FulfilledHandler<T, F>, onRejected: RejectedHandler<unknown, R>)\n : Promise<F | R>;\n public then<F = T, R = never>(\n onFulfilled?: FulfilledHandler<T, F> | null,\n onRejected?: RejectedHandler<unknown, R> | null): Promise<F | R>\n {\n return this._promise.then(onFulfilled, onRejected);\n }\n\n public catch(onRejected?: null): Promise<T>;\n public catch<R = never>(onRejected: RejectedHandler<unknown, R>): Promise<T | R>;\n public catch<R = never>(onRejected?: RejectedHandler<unknown, R> | null): Promise<T | R>\n {\n return this._promise.catch(onRejected);\n }\n public finally(onFinally?: (() => void) | null): Promise<T>\n {\n return this._promise.finally(onFinally);\n }\n\n public readonly [Symbol.toStringTag]: string = \"SmartPromise\";\n}\n","import type { PromiseResolver, PromiseRejecter, FulfilledHandler, RejectedHandler } from \"./types.js\";\n\nimport SmartPromise from \"./smart-promise.js\";\n\nexport default class DeferredPromise<T = void, F = T, R = never> extends SmartPromise<F | R>\n{\n protected _resolve: PromiseResolver<T>;\n protected _reject: PromiseRejecter;\n\n public constructor(onFulfilled?: FulfilledHandler<T, F> | null, onRejected?: RejectedHandler<unknown, R> | null)\n {\n let _resolve: PromiseResolver<T>;\n let _reject: PromiseRejecter;\n\n super((resolve, reject) =>\n {\n // ReferenceError: Must call super constructor in derived class before accessing\n // 'this' or returning from derived constructor.\n //\n _resolve = resolve as PromiseResolver<T>;\n _reject = reject;\n });\n\n this._promise.then(onFulfilled as FulfilledHandler<F | R>, onRejected);\n\n this._resolve = _resolve!;\n this._reject = _reject!;\n }\n\n public get resolve(): PromiseResolver<T> { return this._resolve; }\n public get reject(): PromiseRejecter { return this._reject; }\n\n public watch(otherPromise: PromiseLike<T>): this\n {\n otherPromise.then(this.resolve, this.reject);\n\n return this;\n }\n\n public readonly [Symbol.toStringTag]: string = \"DeferredPromise\";\n}\n","export default class Thenable<T> implements Promise<T>\n{\n protected _onFulfilled: (result: T) => T;\n protected _resolve(result: T): T\n {\n return this._onFulfilled(result);\n }\n\n public constructor()\n {\n this._onFulfilled = (result: T) => result;\n }\n\n public then(onFulfilled?: null): Thenable<T>;\n public then<F = T>(onFulfilled: (result: T) => F, onRejected?: null): Thenable<F>;\n public then<F = T, R = never>(onFulfilled: (result: T) => F, onRejected: (reason: unknown) => R)\n : Thenable<F | R>;\n public then<F = T, R = never>(onFulfilled?: ((result: T) => F) | null, onRejected?: ((reason: unknown) => R) | null)\n : Thenable<F | R>\n {\n if (onRejected)\n {\n const _previousOnFulfilled = this._onFulfilled;\n this._onFulfilled = (result: T) =>\n {\n try\n {\n result = _previousOnFulfilled(result);\n\n return (onFulfilled!(result) as unknown) as T;\n }\n catch (error)\n {\n return (onRejected(error) as unknown) as T;\n }\n };\n }\n else if (onFulfilled)\n {\n const _previousOnFulfilled = this._onFulfilled;\n this._onFulfilled = (result: T) =>\n {\n result = _previousOnFulfilled(result);\n\n return (onFulfilled(result) as unknown) as T;\n };\n }\n\n return (this as unknown) as Thenable<F | R>;\n }\n\n public catch(onRejected?: null): Thenable<T>;\n public catch<R = never>(onRejected: (reason: unknown) => R): Thenable<T | R>;\n public catch<R = never>(onRejected?: ((reason: unknown) => R) | null): Thenable<T | R>\n {\n if (onRejected)\n {\n const _previousOnFulfilled = this._onFulfilled;\n this._onFulfilled = (result) =>\n {\n try\n {\n return _previousOnFulfilled(result);\n }\n catch (error)\n {\n return (onRejected(error) as unknown) as T;\n }\n };\n }\n\n return this as Thenable<T | R>;\n }\n\n public finally(onFinally?: (() => void) | null): Thenable<T>\n {\n if (onFinally)\n {\n const _previousOnFulfilled = this._onFulfilled;\n this._onFulfilled = (result) =>\n {\n try\n {\n return _previousOnFulfilled(result);\n }\n finally\n {\n onFinally();\n }\n };\n }\n\n return this;\n }\n\n public readonly [Symbol.toStringTag]: string = \"Thenable\";\n}\n","import { TimeoutException } from \"../exceptions/index.js\";\n\nimport SmartPromise from \"./smart-promise.js\";\nimport type { MaybePromise, PromiseExecutor } from \"./types.js\";\n\nexport default class TimedPromise<T = void> extends SmartPromise<T>\n{\n public constructor(executor: PromiseExecutor<T>, timeout?: number)\n {\n super((resolve, reject) =>\n {\n const _resolve = (result: MaybePromise<T>) =>\n {\n clearTimeout(_timeoutId);\n resolve(result);\n };\n const _reject = (reason: unknown) =>\n {\n clearTimeout(_timeoutId);\n reject(reason);\n };\n\n const _timeout = () => _reject(new TimeoutException(\"The operation has timed out.\"));\n const _timeoutId = setTimeout(_timeout, timeout);\n\n executor(_resolve, _reject);\n });\n }\n\n public readonly [Symbol.toStringTag]: string = \"TimedPromise\";\n}\n","import { ReferenceException } from \"./exceptions/index.js\";\n\nexport type Subscriber<A extends unknown[] = [], R = void> = (...args: A) => R;\n\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\nexport default class Publisher<T extends { [K in keyof T]: [unknown[], unknown] } = Record<string, [[], void]>>\n{\n protected _subscribers: Map<keyof T, Subscriber<unknown[], unknown>[]>;\n\n public constructor()\n {\n this._subscribers = new Map();\n }\n\n public subscribe<K extends keyof T, A extends T[K][0], R extends T[K][1]>(event: K, subscriber: Subscriber<A, R>)\n : () => void\n {\n if (!(this._subscribers.has(event))) { this._subscribers.set(event, []); }\n\n const subscribers = this._subscribers.get(event)!;\n subscribers.push(subscriber as Subscriber<unknown[], unknown>);\n\n return () =>\n {\n const index = subscribers.indexOf(subscriber as Subscriber<unknown[], unknown>);\n if (index < 0)\n {\n throw new ReferenceException(\"Unable to unsubscribe the required subscriber. \" +\n \"The subscription was already unsubscribed.\");\n }\n\n subscribers.splice(index, 1);\n };\n }\n\n public publish<K extends keyof T, A extends T[K][0], R extends T[K][1]>(event: K, ...args: A): R[]\n {\n const subscribers = this._subscribers.get(event);\n if (!(subscribers)) { return []; }\n\n return subscribers.slice()\n .map((subscriber) => subscriber(...args)) as R[];\n }\n\n public readonly [Symbol.toStringTag]: string = \"Publisher\";\n}\n","\nimport { SmartIterator } from \"../models/index.js\";\n\nexport enum TimeUnit\n{\n /* eslint-disable @typescript-eslint/prefer-literal-enum-member */\n\n Millisecond = 1,\n Second = 1000,\n Minute = 60 * Second,\n Hour = 60 * Minute,\n Day = 24 * Hour,\n Week = 7 * Day,\n Month = 30 * Day,\n Year = 365 * Day\n}\n\nexport function dateDifference(start: string | Date, end: string | Date, unit = TimeUnit.Day): number\n{\n start = new Date(start);\n end = new Date(end);\n\n return Math.floor((end.getTime() - start.getTime()) / unit);\n}\n\nexport function dateRange(start: string | Date, end: string | Date, offset = TimeUnit.Day): SmartIterator<Date>\n{\n start = new Date(start);\n end = new Date(end);\n\n return new SmartIterator<Date>(function* ()\n {\n const endTime = end.getTime();\n\n let unixTime: number = start.getTime();\n while (unixTime < endTime)\n {\n yield new Date(unixTime);\n\n unixTime += offset;\n }\n });\n}\n\nexport function dateRound(date: string | Date, unit = TimeUnit.Day): Date\n{\n date = new Date(date);\n\n return new Date(Math.floor(date.getTime() / unit) * unit);\n}\n","import { TimeUnit } from \"../../utils/date.js\";\nimport { RangeException, RuntimeException } from \"../exceptions/index.js\";\n\nimport GameLoop from \"../game-loop.js\";\nimport Publisher from \"../publisher.js\";\n\ninterface ClockEvents\n{\n /* eslint-disable @typescript-eslint/no-invalid-void-type */\n\n start: [[], void];\n stop: [[], void];\n tick: [[number], void];\n}\n\nexport default class Clock extends GameLoop\n{\n protected _publisher: Publisher<ClockEvents>;\n\n public constructor(msIfNotBrowser: number = TimeUnit.Second)\n {\n super((elapsedTime) => this._publisher.publish(\"tick\", elapsedTime), msIfNotBrowser);\n\n this._publisher = new Publisher();\n }\n\n public start(elapsedTime = 0): void\n {\n if (this._isRunning) { throw new RuntimeException(\"The clock has already been started.\"); }\n\n super.start(elapsedTime);\n\n this._publisher.publish(\"start\");\n }\n\n public stop(): void\n {\n if (!(this._isRunning)) { throw new RuntimeException(\"The clock hadn't yet started.\"); }\n\n super.stop();\n\n this._publisher.publish(\"stop\");\n }\n\n public onStart(callback: () => void): () => void\n {\n return this._publisher.subscribe(\"start\", callback);\n }\n public onStop(callback: () => void): () => void\n {\n return this._publisher.subscribe(\"stop\", callback);\n }\n\n public onTick(callback: (elapsedTime: number) => void, tickStep = 0): () => void\n {\n if (tickStep < 0) { throw new RangeException(\"The tick step must be a non-negative number.\"); }\n if (tickStep === 0) { return this._publisher.subscribe(\"tick\", callback); }\n\n let lastTick = 0;\n\n return this._publisher.subscribe(\"tick\", (elapsedTime: number) =>\n {\n if ((elapsedTime - lastTick) < tickStep) { return; }\n\n callback(elapsedTime);\n lastTick = elapsedTime;\n });\n }\n\n public readonly [Symbol.toStringTag]: string = \"Clock\";\n}\n","import { TimeUnit } from \"../../utils/date.js\";\n\nimport { FatalErrorException, RangeException, RuntimeException } from \"../exceptions/index.js\";\nimport { DeferredPromise, SmartPromise } from \"../promises/index.js\";\n\nimport GameLoop from \"../game-loop.js\";\nimport Publisher from \"../publisher.js\";\n\ninterface CountdownEvents\n{\n /* eslint-disable @typescript-eslint/no-invalid-void-type */\n\n start: [[], void];\n stop: [[unknown], void];\n tick: [[number], void];\n expire: [[], void];\n}\n\nexport default class Countdown extends GameLoop\n{\n protected _deferrer?: DeferredPromise<void>;\n\n protected _publisher: Publisher<CountdownEvents>;\n\n protected _duration: number;\n public get duration(): number\n {\n return this._duration;\n }\n\n public get remainingTime(): number\n {\n return this._duration - this.elapsedTime;\n }\n\n public constructor(duration: number, msIfNotBrowser: number = TimeUnit.Second)\n {\n const callback = () =>\n {\n const remainingTime = this.remainingTime;\n this._publisher.publish(\"tick\", remainingTime);\n\n if (remainingTime <= 0)\n {\n this._deferrerStop();\n\n this._publisher.publish(\"expire\");\n }\n };\n\n super(callback, msIfNotBrowser);\n\n this._publisher = new Publisher();\n this._duration = duration;\n }\n\n protected _deferrerStop(reason?: unknown): void\n {\n if (!(this._isRunning)) { throw new RuntimeException(\"The countdown hadn't yet started.\"); }\n if (!(this._deferrer)) { throw new FatalErrorException(); }\n\n super.stop();\n\n if (reason !== undefined) { this._deferrer.reject(reason); }\n else { this._deferrer.resolve(); }\n\n this._deferrer = undefined;\n }\n\n public start(remainingTime: number = this.duration): SmartPromise<void>\n {\n if (this._isRunning) { throw new RuntimeException(\"The countdown has already been started.\"); }\n if (this._deferrer) { throw new FatalErrorException(); }\n\n this._deferrer = new DeferredPromise();\n super.start(this.duration - remainingTime);\n\n this._publisher.publish(\"start\");\n\n return this._deferrer;\n }\n public stop(reason?: unknown): void\n {\n this._deferrerStop(reason);\n\n this._publisher.publish(\"stop\", reason);\n }\n\n public onExpire(callback: () => void): () => void\n {\n return this._publisher.subscribe(\"expire\", callback);\n }\n\n public onStart(callback: () => void): () => void\n {\n return this._publisher.subscribe(\"start\", callback);\n }\n public onStop(callback: (reason?: unknown) => void): () => void\n {\n return this._publisher.subscribe(\"stop\", callback);\n }\n\n public onTick(callback: (remainingTime: number) => void, tickStep = 0): () => void\n {\n if (tickStep < 0) { throw new RangeException(\"The tick step must be a non-negative number.\"); }\n if (tickStep === 0) { return this._publisher.subscribe(\"tick\", callback); }\n\n let lastTick = 0;\n\n return this._publisher.subscribe(\"tick\", (remainingTime: number) =>\n {\n if ((lastTick - remainingTime) < tickStep) { return; }\n\n callback(remainingTime);\n lastTick = remainingTime;\n });\n }\n\n public readonly [Symbol.toStringTag]: string = \"Countdown\";\n}\n","import { ValueException } from \"../models/index.js\";\n\nexport default class Random\n{\n public static Boolean(ratio = 0.5): boolean\n {\n return (Math.random() < ratio);\n }\n\n public static Integer(max: number): number;\n public static Integer(min: number, max: number): number;\n public static Integer(min: number, max?: number): number\n {\n if (max === undefined) { return Math.floor(Math.random() * min); }\n\n return Math.floor(Math.random() * (max - min) + min);\n }\n\n public static Decimal(): number;\n public static Decimal(max: number): number;\n public static Decimal(min: number, max: number): number;\n public static Decimal(min?: number, max?: number): number\n {\n if (min === undefined) { return Math.random(); }\n if (max === undefined) { return (Math.random() * min); }\n\n return (Math.random() * (max - min) + min);\n }\n\n public static Index<T>(elements: T[]): number\n {\n if (elements.length === 0) { throw new ValueException(\"You must provide at least one element.\"); }\n\n return this.Integer(elements.length);\n }\n public static Choice<T>(elements: T[]): T\n {\n return elements[Random.Index(elements)];\n }\n\n private constructor() { /* ... */ }\n\n public readonly [Symbol.toStringTag]: string = \"Random\";\n}\n","export function delay(milliseconds: number): Promise<void>\n{\n return new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n}\n\nexport function nextAnimationFrame(): Promise<void>\n{\n return new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n}\n","export function loadScript(scriptUrl: string, scriptType = \"text/javascript\"): Promise<void>\n{\n return new Promise<void>((resolve, reject) =>\n {\n const script = document.createElement(\"script\");\n\n script.async = true;\n script.defer = true;\n script.src = scriptUrl;\n script.type = scriptType;\n\n script.onload = () => resolve();\n script.onerror = () => reject();\n\n document.body.appendChild(script);\n });\n}\n","import { SmartIterator } from \"../models/index.js\";\n\nexport function chain<T>(...iterables: Iterable<T>[]): SmartIterator<T>\n{\n return new SmartIterator<T>(function* ()\n {\n for (const iterable of iterables)\n {\n for (const element of iterable) { yield element; }\n }\n });\n}\n\nexport function count<T>(elements: Iterable<T>): number\n{\n if (Array.isArray(elements)) { return elements.length; }\n\n let _count = 0;\n for (const _ of elements) { _count += 1; }\n\n return _count;\n}\n\nexport function enumerate<T>(elements: Iterable<T>): SmartIterator<[number, T]>\n{\n return new SmartIterator<[number, T]>(function* ()\n {\n let index = 0;\n\n for (const element of elements)\n {\n yield [index, element];\n\n index += 1;\n }\n });\n}\n\nexport function range(end: number): SmartIterator<number>;\nexport function range(start: number, end: number): SmartIterator<number>;\nexport function range(start: number, end: number, step: number): SmartIterator<number>;\nexport function range(start: number, end?: number, step = 1): SmartIterator<number>\n{\n return new SmartIterator<number>(function* ()\n {\n if (end === undefined)\n {\n end = start;\n start = 0;\n }\n\n if (start > end) { step = step ?? -1; }\n\n for (let index = start; index < end; index += step) { yield index; }\n });\n}\n\nexport function shuffle<T>(iterable: Iterable<T>): T[]\n{\n const array = Array.from(iterable);\n\n for (let index = array.length - 1; index > 0; index -= 1)\n {\n const jndex = Math.floor(Math.random() * (index + 1));\n\n [array[index], array[jndex]] = [array[jndex], array[index]];\n }\n\n return array;\n}\n\nexport function unique<T>(elements: Iterable<T>): SmartIterator<T>\n{\n return new SmartIterator<T>(function* ()\n {\n const values = new Set<T>();\n\n for (const element of elements)\n {\n if (values.has(element)) { continue; }\n\n values.add(element);\n\n yield element;\n }\n });\n}\n\nexport function zip<T, U>(first: Iterable<T>, second: Iterable<U>): SmartIterator<[T, U]>\n{\n return new SmartIterator<[T, U]>(function* ()\n {\n const firstIterator = first[Symbol.iterator]();\n const secondIterator = second[Symbol.iterator]();\n\n while (true)\n {\n const firstResult = firstIterator.next();\n const secondResult = secondIterator.next();\n\n if ((firstResult.done) || (secondResult.done)) { break; }\n\n yield [firstResult.value, secondResult.value];\n }\n });\n}\n","import { ValueException } from \"../models/exceptions/index.js\";\nimport { zip } from \"./iterator.js\";\n\nexport function average<T extends number>(values: Iterable<T>): number;\nexport function average<T extends number>(values: Iterable<T>, weights: Iterable<number>): number;\nexport function average<T extends number>(values: Iterable<T>, weights?: Iterable<number>): number\n{\n if (weights === undefined)\n {\n let _sum = 0;\n let _index = 0;\n\n for (const value of values)\n {\n _sum += value;\n _index += 1;\n }\n\n if (_index === 0) { throw new ValueException(\"You must provide at least one value.\"); }\n\n return _sum / _index;\n }\n\n let _sum = 0;\n let _count = 0;\n let _index = 0;\n\n for (const [value, weight] of zip(values, weights))\n {\n if (weight <= 0)\n {\n throw new ValueException(`The weight for the value #${_index} must be greater than zero.`);\n }\n\n _sum += value * weight;\n _count += weight;\n _index += 1;\n }\n\n if (_index === 0) { throw new ValueException(\"You must provide at least one value and weight.\"); }\n if (_count > 0) { throw new ValueException(\"The sum of weights must be greater than zero.\"); }\n\n return _sum / _count;\n}\n\nexport function hash(value: string): number\n{\n let hashedValue = 0;\n for (let index = 0; index < value.length; index += 1)\n {\n const char = value.charCodeAt(index);\n\n hashedValue = ((hashedValue << 5) - hashedValue) + char;\n hashedValue |= 0;\n }\n\n return hashedValue;\n}\n\nexport function sum<T extends number>(values: Iterable<T>): number\n{\n let _sum = 0;\n for (const value of values) { _sum += value; }\n\n return _sum;\n}\n","export function capitalize(value: string): string\n{\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;\n}\n","export const VERSION = \"2.0.0-rc.7\";\n\nexport type { Constructor, Interval, Timeout } from \"./core/types.js\";\n\nexport { isBrowser, isNode, isWebWorker } from \"./helpers.js\";\n\nexport {\n AggregatedIterator,\n AggregatedAsyncIterator,\n Clock,\n Countdown,\n DeferredPromise,\n Exception,\n FatalErrorException,\n FileException,\n FileExistsException,\n FileNotFoundException,\n GameLoop,\n JSONStorage,\n KeyException,\n NotImplementedException,\n NetworkException,\n PermissionException,\n Publisher,\n RangeException,\n ReducedIterator,\n ReferenceException,\n RuntimeException,\n SmartIterator,\n SmartAsyncIterator,\n SmartPromise,\n Thenable,\n TimeoutException,\n TimedPromise,\n TypeException,\n ValueException\n\n} from \"./models/index.js\";\n\nexport type {\n AsyncGeneratorFunction,\n AsyncIteratorLike,\n FulfilledHandler,\n GeneratorFunction,\n Iteratee,\n IteratorLike,\n JSONArray,\n JSONObject,\n JSONValue,\n KeyedIteratee,\n KeyedReducer,\n KeyedTypeGuardIteratee,\n MaybeAsyncKeyedIteratee,\n MaybeAsyncKeyedReducer,\n MaybeAsyncKeyedTypeGuardIteratee,\n MaybeAsyncReducer,\n MaybeAsyncIteratee,\n MaybeAsyncIteratorLike,\n MaybeAsyncTypeGuardIteratee,\n MaybePromise,\n PromiseExecutor,\n PromiseRejecter,\n PromiseResolver,\n Reducer,\n RejectedHandler,\n Subscriber,\n TypeGuardIteratee\n\n} from \"./models/types.js\";\n\nexport {\n average,\n capitalize,\n chain,\n count,\n delay,\n dateDifference,\n dateRange,\n dateRound,\n TimeUnit,\n enumerate,\n hash,\n loadScript,\n nextAnimationFrame,\n Random,\n range,\n shuffle,\n sum,\n unique,\n zip\n\n} from \"./utils/index.js\";\n"],"names":["isBrowser","_a","isNode","isWebWorker","_b","Exception","message","cause","name","__publicField","error","exc","FatalErrorException","NotImplementedException","FileException","FileExistsException","FileNotFoundException","KeyException","NetworkException","PermissionException","ReferenceException","RuntimeException","EnvironmentException","TimeoutException","TypeException","ValueException","RangeException","SmartIterator","argument","value","predicate","index","result","iterator","iteratee","reducer","initialValue","accumulator","iterable","count","limit","values","AggregatedIterator","element","_ReducedIterator","key","elements","_","ReducedIterator","_AggregatedAsyncIterator","SmartAsyncIterator","indexes","finding","keys","counters","map","groups","AggregatedAsyncIterator","generator","next","_AggregatedIterator","GameLoop","callback","msIfNotBrowser","elapsedTime","JSONStorage","preferPersistence","storage","propertyName","defaultValue","propertyValue","newValue","encodedValue","persistent","_SmartPromise","executor","_onFulfilled","_onRejected","reason","promise","resolve","reject","onFulfilled","onRejected","onFinally","SmartPromise","DeferredPromise","_resolve","_reject","otherPromise","Thenable","_previousOnFulfilled","TimedPromise","timeout","_timeoutId","Publisher","event","subscriber","subscribers","args","TimeUnit","dateDifference","start","end","unit","dateRange","offset","endTime","unixTime","dateRound","date","Clock","tickStep","lastTick","Countdown","duration","remainingTime","_Random","ratio","min","max","Random","delay","milliseconds","nextAnimationFrame","loadScript","scriptUrl","scriptType","script","chain","iterables","_count","enumerate","range","step","shuffle","array","jndex","unique","zip","first","second","firstIterator","secondIterator","firstResult","secondResult","average","weights","_sum","_index","weight","hash","hashedValue","char","sum","capitalize","VERSION"],"mappings":"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"}