@planet-matrix/mobius-model 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["..\\src\\basic\\is.ts", "..\\src\\basic\\boolean.ts", "..\\src\\basic\\helper.ts", "..\\src\\basic\\string.ts", "..\\src\\basic\\number.ts", "..\\src\\basic\\bigint.ts", "..\\src\\basic\\symbol.ts", "..\\src\\basic\\array.ts", "..\\src\\basic\\object.ts", "..\\src\\basic\\function.ts", "..\\src\\basic\\temporal.ts", "..\\src\\basic\\error.ts", "..\\src\\basic\\regexp.ts", "..\\src\\basic\\promise.ts", "..\\src\\basic\\stream.ts", "..\\src\\reactor\\reactor-core\\flags.ts", "..\\src\\reactor\\reactor-core\\reactive-system.ts", "..\\src\\reactor\\reactor-core\\primitive.ts", "..\\src\\reactor\\reactor-operators\\utility.ts", "..\\src\\reactor\\reactor-operators\\convert.ts", "..\\src\\reactor\\reactor-operators\\create.ts", "..\\src\\reactor\\reactor-operators\\join.ts", "..\\src\\reactor\\reactor-operators\\branch.ts", "..\\src\\reactor\\reactor-operators\\map.ts", "..\\src\\reactor\\reactor-operators\\filter.ts"],
3
+ "sources": ["..\\src\\basic\\is.ts", "..\\src\\basic\\boolean.ts", "..\\src\\basic\\helper.ts", "..\\src\\basic\\string.ts", "..\\src\\basic\\number.ts", "..\\src\\basic\\bigint.ts", "..\\src\\basic\\symbol.ts", "..\\src\\basic\\array.ts", "..\\src\\basic\\object.ts", "..\\src\\basic\\function.ts", "..\\src\\basic\\temporal.ts", "..\\src\\basic\\error.ts", "..\\src\\basic\\regexp.ts", "..\\src\\basic\\promise.ts", "..\\src\\basic\\stream.ts", "..\\src\\basic\\enhance.ts", "..\\src\\reactor\\reactor-core\\flags.ts", "..\\src\\reactor\\reactor-core\\reactive-system.ts", "..\\src\\reactor\\reactor-core\\primitive.ts", "..\\src\\reactor\\reactor-operators\\utility.ts", "..\\src\\reactor\\reactor-operators\\convert.ts", "..\\src\\reactor\\reactor-operators\\create.ts", "..\\src\\reactor\\reactor-operators\\join.ts", "..\\src\\reactor\\reactor-operators\\branch.ts", "..\\src\\reactor\\reactor-operators\\map.ts", "..\\src\\reactor\\reactor-operators\\filter.ts", "..\\src\\encoding\\base64.ts", "..\\src\\random\\uuid.ts"],
4
4
  "sourcesContent": [
5
5
  "// oxlint-disable no-explicit-any ban-types\n\nimport type {\n AnyAsyncFunction,\n AnyAsyncGeneratorFunction,\n AnyFunction,\n AnyGeneratorFunction,\n AnySyncFunction,\n NonPrimitive,\n PlainObject,\n Primitive\n} from \"#Source/type/index.ts\"\n\n/**\n * 进行类型检测的常用手段包括:\n * - typeof: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof\n * https://tc39.es/ecma262/#sec-typeof-operator\n * - instanceof: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof\n * - toString: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString\n *\n * - `typeof` operator can operate on non-exist variable.\n */\n\n/**\n *\n */\nexport const isPrimitive = (target: unknown): target is Primitive => {\n return isString(target) || isNumber(target) || isBoolean(target) || isBigInt(target) || isSymbol(target) || isNull(target) || isUndefined(target)\n}\nexport const isNonPrimitive = (target: unknown): target is NonPrimitive => {\n return isPrimitive(target) === false\n}\nexport const isString = (target: unknown): target is string => {\n return Object.prototype.toString.call(target) === \"[object String]\"\n}\nexport const isNumber = (target: unknown): target is number => {\n return Object.prototype.toString.call(target) === \"[object Number]\" && isNaN(Number.parseFloat(String(target)))\n}\nexport const isNaN = (target: unknown): boolean => {\n return Number.isNaN(target)\n}\nexport const isFiniteNumber = (target: unknown): target is number => {\n return isNumber(target) && Number.isFinite(target)\n}\nexport const isInfiniteNumber = (target: unknown): target is number => {\n return isNumber(target) && !Number.isFinite(target)\n}\nexport const isBoolean = (target: unknown): target is boolean => {\n return Object.prototype.toString.call(target) === \"[object Boolean]\"\n}\nexport const isTrue = (target: unknown): target is true => {\n return isBoolean(target) && target === true\n}\nexport const isFalse = (target: unknown): target is false => {\n return isBoolean(target) && target === false\n}\nexport const isBigInt = (target: unknown): target is bigint => {\n return Object.prototype.toString.call(target) === \"[object BigInt]\"\n}\nexport const isSymbol = (target: unknown): target is symbol => {\n return Object.prototype.toString.call(target) === \"[object Symbol]\"\n}\nexport const isNull = (target: unknown): target is null => {\n return Object.prototype.toString.call((target)) === \"[object Null]\"\n}\nexport const isUndefined = (target: unknown): target is undefined => {\n return Object.prototype.toString.call(target) === \"[object Undefined]\"\n}\n/**\n * @see {@link https://stackoverflow.com/a/52097700}\n */\nexport const isDefined = <T>(target: T | undefined): target is T => {\n return isUndefined(target) === false\n}\nexport const isNil = (target: unknown): target is (null | undefined) => {\n return target === null || target === undefined\n}\n\n/**\n * Predicate whether the target is an Object, use `instanceof` operator to check.\n *\n * @see {@link isGeneralObject}, {@link isPlainObject}\n */\n// oxlint-disable-next-line no-wrapper-object-types\nexport const isObject = (target: unknown): target is Object => {\n // oxlint-disable-next-line no-instanceof-builtins\n return target instanceof Object\n}\n/**\n * Predicate whether the target is a general object, use `typeof` operator to check.\n *\n * A general object is an object that is:\n * - not `null`, not a `function`, not a `primitive`.\n *\n * Any other object is a general object:\n * - `Array` instance, `Map` instance, `WeakMap` instance, `Set` instance, `Date` instance, etc.\n *\n * @example\n * ```\n * typeof null // => 'object'\n * typeof [] // => 'object'\n * typeof {} // => 'object'\n * typeof { a: 1 } // => 'object'\n * typeof (new Map()) // => 'object'\n * typeof (new WeakMap()) // => 'object'\n * typeof (new Set()) // => 'object'\n * typeof (new WeakSet()) // => 'object'\n * typeof (new Date()) // => 'object'\n * typeof window // => 'object'\n * typeof document // => 'object'\n * ```\n *\n * @see {@link isObject}, {@link isPlainObject}\n */\n// oxlint-disable-next-line no-wrapper-object-types\nexport const isGeneralObject = (target: unknown): target is Object => {\n return target !== null && typeof target === \"object\"\n}\n/**\n * Predicate whether the target is a plain object.\n *\n * A plain object is an object that is:\n * - not `null`, not a `function`, not a `primitive` type,\n * - not an `Array`, not a `RegExp`, not a `Date`, not a `Map`, not a `Set`, not a `WeakMap`,\n * - not `window`, not a DOM `element`, not an `Error`,\n * - not any other customize object type.\n *\n * @see {@link isObject}, {@link isGeneralObject}\n */\nexport const isPlainObject = (target: unknown): target is PlainObject => {\n // 非 null、非 Function、非 Primitive\n if (target === null || typeof target !== \"object\") {\n return false\n }\n // 非 Array、非 Regexp、非 Date、非 Map、非 Set、非 Window、非 DOM、非 Error……\n if (Object.prototype.toString.call(target) !== \"[object Object]\") {\n return false\n }\n // 非其它自定义类实例对象,allow only plain object literal or Object.create(null)\n // oxlint-disable-next-line no-unsafe-assignment\n const proto = Object.getPrototypeOf(target)\n return proto === Object.prototype || proto === null\n}\nexport const isEmptyPlainObject = (target: unknown): target is PlainObject => {\n return isPlainObject(target) && Reflect.ownKeys(target).length === 0\n}\n\nexport function isArray<T>(target: T[]): target is T[]\nexport function isArray<T>(target: unknown): target is T[]\nexport function isArray<T>(target: unknown): target is T[] {\n return Array.isArray(target)\n}\nexport const isEmptyArray = (target: unknown): target is [] => {\n return isArray(target) && target.length === 0\n}\n\nexport function isArrayLike<T>(target: ArrayLike<T>): target is ArrayLike<T>\nexport function isArrayLike<T>(target: unknown): target is ArrayLike<T>\nexport function isArrayLike<T>(target: unknown): target is ArrayLike<T> {\n return isGeneralObject(target) && (\"length\" in target) && isNumber(target.length)\n}\n\nexport function isMap<K, V>(target: Map<K, V>): target is Map<K, V>\nexport function isMap<K, V>(target: unknown): target is Map<K, V>\nexport function isMap<K, V>(target: unknown): target is Map<K, V> {\n return Object.prototype.toString.call(target) === \"[object Map]\"\n}\n\nexport function isWeakMap<K extends object, V>(target: WeakMap<K, V>): target is WeakMap<K, V>\nexport function isWeakMap<K extends object, V>(target: unknown): target is WeakMap<K, V>\nexport function isWeakMap<K extends object, V>(target: unknown): target is WeakMap<K, V> {\n return Object.prototype.toString.call(target) === \"[object WeakMap]\"\n}\n\nexport function isSet<T>(target: Set<T>): target is Set<T>\nexport function isSet<T>(target: unknown): target is Set<T>\nexport function isSet<T>(target: unknown): target is Set<T> {\n return Object.prototype.toString.call(target) === \"[object Set]\"\n}\n\nexport function isWeakSet<T extends object>(target: WeakSet<T>): target is WeakSet<T>\nexport function isWeakSet<T extends object>(target: unknown): target is WeakSet<T>\nexport function isWeakSet<T extends object>(target: unknown): target is WeakSet<T> {\n return Object.prototype.toString.call(target) === \"[object WeakSet]\"\n}\n\nexport const isDate = (target: unknown): target is Date => {\n return Object.prototype.toString.call(target) === \"[object Date]\"\n}\n\nexport const isRegExp = (target: unknown): target is RegExp => {\n return Object.prototype.toString.call(target) === \"[object RegExp]\"\n}\n\nexport const isError = (target: unknown): target is Error => {\n return Object.prototype.toString.call(target) === \"[object Error]\"\n}\n\nexport function isPromise<T>(target: Promise<T>): target is Promise<T>\nexport function isPromise<T>(target: unknown): target is Promise<T>\nexport function isPromise<T>(target: unknown): target is Promise<T> {\n return Object.prototype.toString.call(target) === \"[object Promise]\"\n}\n\n// oxlint-disable-next-line no-unsafe-function-type\nexport const isFunction = (target: unknown): target is Function => {\n return typeof target === \"function\"\n}\nexport const isAnyFunction = (target: unknown): target is AnyFunction => {\n return isFunction(target)\n}\nexport const isSyncFunction = (target: unknown): target is AnySyncFunction => {\n return Object.prototype.toString.call(target) === \"[object Function]\"\n}\nexport const isAsyncFunction = (target: unknown): target is AnyAsyncFunction => {\n return Object.prototype.toString.call(target) === \"[object AsyncFunction]\"\n}\nexport const isGeneratorFunction = (target: unknown): target is AnyGeneratorFunction => {\n return Object.prototype.toString.call((target)) === \"[object GeneratorFunction]\"\n}\nexport const isAsyncGeneratorFunction = (target: unknown): target is AnyAsyncGeneratorFunction => {\n return Object.prototype.toString.call(target) === \"[object AsyncGeneratorFunction]\"\n}\n\n/**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterable_protocol}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator}\n */\nexport function isIterable<T>(target: Iterable<T>): target is Iterable<T>\nexport function isIterable<T>(target: unknown): target is Iterable<T>\nexport function isIterable<T>(target: unknown): target is Iterable<T> {\n // oxlint-disable-next-line no-unsafe-type-assertion no-unsafe-member-access\n return isGeneralObject(target) && typeof (target as any)[Symbol.iterator] === \"function\"\n}\n/**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator}\n */\nexport function isAsyncIterable<T>(target: AsyncIterable<T>): target is AsyncIterable<T>\nexport function isAsyncIterable<T>(target: unknown): target is AsyncIterable<T>\nexport function isAsyncIterable<T>(target: unknown): target is AsyncIterable<T> {\n // oxlint-disable-next-line no-unsafe-type-assertion no-unsafe-member-access\n return isGeneralObject(target) && typeof (target as any)[Symbol.asyncIterator] === \"function\"\n}\n/**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterator_protocol}\n */\nexport function isIterator<T, TReturn = unknown, TNext = undefined>(target: Iterator<T, TReturn, TNext>): target is Iterator<T, TReturn, TNext>\nexport function isIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is Iterator<T, TReturn, TNext>\nexport function isIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is Iterator<T, TReturn, TNext> {\n // oxlint-disable-next-line no-unsafe-type-assertion no-unsafe-member-access\n return isGeneralObject(target) && typeof (target as any).next === \"function\"\n}\nexport function isAsyncIterator<T, TReturn = unknown, TNext = undefined>(target: AsyncIterator<T, TReturn, TNext>): target is AsyncIterator<T, TReturn, TNext>\nexport function isAsyncIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is AsyncIterator<T, TReturn, TNext>\nexport function isAsyncIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is AsyncIterator<T, TReturn, TNext> {\n // oxlint-disable-next-line no-unsafe-type-assertion no-unsafe-member-access\n return isGeneralObject(target) && typeof (target as any).next === \"function\"\n}\nexport function isIterableIterator<T, TReturn = unknown, TNext = undefined>(target: IterableIterator<T>): target is IterableIterator<T, TReturn, TNext>\nexport function isIterableIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is IterableIterator<T, TReturn, TNext>\nexport function isIterableIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is IterableIterator<T> {\n return isIterator<T, TReturn, TNext>(target) && isIterable<T>(target)\n}\nexport function isAsyncIterableIterator<T, TReturn = unknown, TNext = undefined>(target: AsyncIterableIterator<T>): target is AsyncIterableIterator<T, TReturn, TNext>\nexport function isAsyncIterableIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is AsyncIterableIterator<T, TReturn, TNext>\nexport function isAsyncIterableIterator<T, TReturn = unknown, TNext = undefined>(target: unknown): target is AsyncIterableIterator<T> {\n return isAsyncIterator<T, TReturn, TNext>(target) && isAsyncIterable<T>(target)\n}\n\n/**\n * Check `target` and `Window` is both defined\n * before use the `instanceof` operator to check `target` is instanceof `Window`.\n */\nexport const isWindow = (target: unknown): target is Window => {\n return isGeneralObject(target) && isDefined(Window) && target instanceof Window\n}\n/**\n * Check `target` and `Element` is both defined\n * before use the `instanceof` operator to check `target` is instanceof `Element`.\n */\nexport const isElement = (target: unknown): target is Element => {\n return isGeneralObject(target) && isDefined(Element) && target instanceof Element\n}\n/**\n * Check `target` and `Node` is both defined\n * before use the `instanceof` operator to check `target` is instanceof `Node`.\n */\nexport const isNode = (target: unknown): target is Node => {\n return isGeneralObject(target) && isDefined(Node) && target instanceof Node\n}\n/**\n * Check `target` and `HTMLElement` is both defined\n * before use the `instanceof` operator to check `target` is instanceof `HTMLElement`.\n */\nexport const isHTMLElement = (target: unknown): target is HTMLElement => {\n return isGeneralObject(target) && isDefined(HTMLElement) && target instanceof HTMLElement\n}\n/**\n * Check `target` and `HTMLCollection` is both defined\n * before use the `instanceof` operator to check `target` is instanceof `HTMLCollection`.\n */\nexport const isHTMLCollection = (target: unknown): target is HTMLCollection => {\n return isGeneralObject(target) && isDefined(HTMLCollection) && target instanceof HTMLCollection\n}\n/**\n * Check `target` and `Document` is both defined\n * before use the `instanceof` operator to check `target` is instanceof `Document`.\n */\nexport const isDocument = (target: unknown): target is Document => {\n return isGeneralObject(target) && isDefined(Document) && target instanceof Document\n}\n/**\n * Check `target` and `EventTarget` is both defined\n * before use the `instanceof` operator to check `target` is instanceof `EventTarget`.\n *\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/API/Event}\n */\nexport const isEventTarget = (target: unknown): target is EventTarget => {\n return isGeneralObject(target) && isDefined(EventTarget) && target instanceof EventTarget\n}\n",
6
6
  "import type {\n AnyFunctionOfReturn, BooleanNot, CastBoolean\n} from \"#Source/type/index.ts\"\n\n/**\n * Convert any value to a boolean.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanFrom(1)\n * // Expect: false\n * const example2 = booleanFrom(0)\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Truthy}\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Falsy}\n */\nexport const booleanFrom = (value: unknown): boolean => Boolean(value)\n\n/**\n * Invert a boolean value.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = booleanNot(true)\n * // Expect: true\n * const example2 = booleanNot(false)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport function booleanNot(b: true): false\nexport function booleanNot(b: false): true\n// catch all overload, used in `pipe` or `compose` or likewise situations.\nexport function booleanNot(b: boolean): boolean\nexport function booleanNot(b: unknown): boolean\nexport function booleanNot(b: unknown): boolean { return !booleanFrom(b) }\n\n/**\n * Perform logical AND.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = booleanAnd(true, false)\n * // Expect: true\n * const example2 = booleanAnd(true, true)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanAnd = (x: unknown, y: unknown): boolean => booleanFrom(x) && booleanFrom(y)\n\n/**\n * Perform logical OR.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanOr(true, false)\n * // Expect: false\n * const example2 = booleanOr(false, false)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanOr = (x: unknown, y: unknown): boolean => booleanFrom(x) || booleanFrom(y)\n\n/**\n * Perform logical NAND.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanNand(true, false)\n * // Expect: false\n * const example2 = booleanNand(true, true)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanNand = (x: unknown, y: unknown): boolean => !booleanAnd(x, y)\n\n/**\n * Perform logical NOR.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = booleanNor(true, false)\n * // Expect: true\n * const example2 = booleanNor(false, false)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanNor = (x: unknown, y: unknown): boolean => !booleanOr(x, y)\n\n/**\n * Perform logical XOR.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanXor(true, false)\n * // Expect: false\n * const example2 = booleanXor(true, true)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanXor = (x: unknown, y: unknown): boolean => booleanFrom(x) !== booleanFrom(y)\n\n/**\n * Perform logical XNOR.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = booleanXnor(true, false)\n * // Expect: true\n * const example2 = booleanXnor(true, true)\n * ```\n *\n * @see {@link https://en.wikipedia.org/wiki/Logic_gate}\n */\nexport const booleanXnor = (x: unknown, y: unknown): boolean => !booleanXor(x, y)\n\nexport type BooleanInvertFunctionReturn<FN extends AnyFunctionOfReturn<boolean>> =\n // oxlint-disable-next-line no-explicit-any\n FN extends (...args: any[]) => infer R ? (...args: Parameters<FN>) => BooleanNot<CastBoolean<R>> : never\n/**\n * Create a complement function that inverts a boolean-returning function.\n *\n * @example\n * ```\n * const isEven = (value: number) => value % 2 === 0\n * const isOdd = booleanComplement(isEven)\n * // Expect: true\n * const example1 = isOdd(3)\n * // Expect: false\n * const example2 = isOdd(4)\n * ```\n */\nexport const booleanComplement = <FN extends AnyFunctionOfReturn<boolean>>(fn: FN): BooleanInvertFunctionReturn<FN> =>\n // oxlint-disable-next-line no-explicit-any no-unsafe-type-assertion no-unsafe-argument\n ((...args: any[]) => booleanNot(fn(...args))) as any as BooleanInvertFunctionReturn<FN>\n\n/**\n * Check whether the value is truthy.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanIsTruthy(\"ok\")\n * // Expect: false\n * const example2 = booleanIsTruthy(\"\")\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Truthy}\n * @see {@link booleanIsFalsy}\n */\nexport const booleanIsTruthy = (v: unknown): boolean => booleanFrom(v)\n/**\n * Check whether the value is falsy.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = booleanIsFalsy(0)\n * // Expect: false\n * const example2 = booleanIsFalsy(\"0\")\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Glossary/Falsy}\n * @see {@link booleanIsTruthy}\n */\nexport const booleanIsFalsy = (v: unknown): boolean => !booleanIsTruthy(v)\n",
@@ -10,13 +10,14 @@
10
10
  "import { isBigInt } from \"./is.ts\"\n\n/**\n * Check whether a value is zero as a bigint.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = bigintIsZero(0n)\n * // Expect: false\n * const example2 = bigintIsZero(2n)\n * ```\n */\nexport const bigintIsZero = (value: unknown): value is 0n => {\n return isBigInt(value) && value === 0n\n}\n\n/**\n * Check whether a value is a positive bigint.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = bigintIsPositive(3n)\n * // Expect: false\n * const example2 = bigintIsPositive(-1n)\n * ```\n */\nexport const bigintIsPositive = (value: unknown): value is bigint => {\n return isBigInt(value) && value > 0n\n}\n\n/**\n * Check whether a value is a negative bigint.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = bigintIsNegative(-3n)\n * // Expect: false\n * const example2 = bigintIsNegative(1n)\n * ```\n */\nexport const bigintIsNegative = (value: unknown): value is bigint => {\n return isBigInt(value) && value < 0n\n}\n\n/**\n * Get the absolute value of a bigint.\n *\n * @example\n * ```\n * // Expect: 5n\n * const example1 = bigintAbs(-5n)\n * // Expect: 2n\n * const example2 = bigintAbs(2n)\n * ```\n */\nexport const bigintAbs = (value: bigint): bigint => {\n return value < 0n ? -value : value\n}\n\n/**\n * Get the smaller of two bigint values.\n *\n * @example\n * ```\n * // Expect: 2n\n * const example1 = bigintMinOf(2n, 9n)\n * // Expect: -1n\n * const example2 = bigintMinOf(5n, -1n)\n * ```\n */\nexport const bigintMinOf = (a: bigint, b: bigint): bigint => {\n return a < b ? a : b\n}\n\n/**\n * Get the larger of two bigint values.\n *\n * @example\n * ```\n * // Expect: 9n\n * const example1 = bigintMaxOf(2n, 9n)\n * // Expect: 5n\n * const example2 = bigintMaxOf(5n, -1n)\n * ```\n */\nexport const bigintMaxOf = (a: bigint, b: bigint): bigint => {\n return a > b ? a : b\n}\n\n/**\n * Clamp a bigint between two bounds.\n *\n * @example\n * ```\n * // Expect: 5n\n * const example1 = bigintClamp(0n, 10n, 5n)\n * // Expect: 0n\n * const example2 = bigintClamp(0n, 10n, -3n)\n * ```\n */\nexport const bigintClamp = (min: bigint, max: bigint, value: bigint): bigint => {\n const minValue = bigintMinOf(min, max)\n const maxValue = bigintMaxOf(min, max)\n if (value < minValue) {\n return minValue\n }\n if (value > maxValue) {\n return maxValue\n }\n return value\n}\n",
11
11
  "import { isSymbol } from \"./is.ts\"\n\n/**\n * Create a new unique symbol with an optional description.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = typeof symbolCreateLocal(\"demo\") === \"symbol\"\n * // Expect: false\n * const example2 = symbolCreateLocal(\"demo\") === symbolCreateLocal(\"demo\")\n * ```\n */\nexport const symbolCreateLocal = (description?: string): symbol => {\n return Symbol(description)\n}\n\n/**\n * Get or create a global symbol for the given key.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = symbolCreateGlobal(\"demo\") === Symbol.for(\"demo\")\n * // Expect: true\n * const example2 = symbolCreateGlobal(\"demo\") === symbolCreateGlobal(\"demo\")\n * ```\n */\nexport const symbolCreateGlobal = (key: string): symbol => Symbol.for(key)\n\n/**\n * Get the key for a global symbol, or undefined if not global.\n *\n * @example\n * ```\n * // Expect: \"demo\"\n * const example1 = symbolGetKey(Symbol.for(\"demo\"))\n * // Expect: undefined\n * const example2 = symbolGetKey(Symbol(\"demo\"))\n * ```\n */\nexport const symbolGetKey = (value: unknown): string | undefined => {\n return isSymbol(value) ? Symbol.keyFor(value) : undefined\n}\n\n/**\n * Check whether a symbol is from the global registry.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = symbolIsGlobal(Symbol.for(\"demo\"))\n * // Expect: false\n * const example2 = symbolIsGlobal(Symbol(\"demo\"))\n * ```\n */\nexport const symbolIsGlobal = (value: unknown): value is symbol => {\n return isSymbol(value) && Symbol.keyFor(value) !== undefined\n}\n\n/**\n * Check whether a symbol is not from the global registry.\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = symbolIsLocal(Symbol.for(\"demo\"))\n * // Expect: true\n * const example2 = symbolIsLocal(Symbol(\"demo\"))\n * ```\n */\nexport const symbolIsLocal = (value: unknown): value is symbol => {\n return isSymbol(value) && Symbol.keyFor(value) === undefined\n}\n\n/**\n * Check whether a symbol has a description.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = symbolHasDescription(Symbol(\"demo\"))\n * // Expect: false\n * const example2 = symbolHasDescription(Symbol())\n * ```\n */\nexport const symbolHasDescription = (value: unknown): value is symbol => {\n return isSymbol(value) && value.description !== undefined\n}\n\n/**\n * Get the description of a symbol, or undefined for non-symbols.\n *\n * @example\n * ```\n * // Expect: \"demo\"\n * const example1 = symbolGetDescription(Symbol(\"demo\"))\n * // Expect: undefined\n * const example2 = symbolGetDescription(Symbol())\n * ```\n */\nexport const symbolGetDescription = (value: unknown): string | undefined => {\n return isSymbol(value) ? value.description : undefined\n}\n\n/**\n * Check whether a symbol is anonymous (no description).\n *\n * @example\n * ```\n * // Expect: false\n * const example1 = symbolIsAnonymous(Symbol(\"demo\"))\n * // Expect: true\n * const example2 = symbolIsAnonymous(Symbol())\n * ```\n */\nexport const symbolIsAnonymous = (value: unknown): value is symbol => {\n return isSymbol(value) && value.description === undefined\n}\n\nconst internalWellKnownSymbols = new Set<symbol>([\n Symbol.asyncIterator,\n Symbol.hasInstance,\n Symbol.isConcatSpreadable,\n Symbol.iterator,\n Symbol.match,\n Symbol.matchAll,\n Symbol.replace,\n Symbol.search,\n Symbol.species,\n Symbol.split,\n Symbol.toPrimitive,\n Symbol.toStringTag,\n Symbol.unscopables,\n])\n/**\n * Check whether a symbol is one of the well-known symbols.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = symbolIsWellKnown(Symbol.iterator)\n * // Expect: false\n * const example2 = symbolIsWellKnown(Symbol(\"iterator\"))\n * ```\n */\nexport const symbolIsWellKnown = (value: unknown): value is symbol => {\n return isSymbol(value) && internalWellKnownSymbols.has(value)\n}\n\n/**\n * Convert a symbol to its string representation.\n *\n * @example\n * ```\n * // Expect: \"Symbol(demo)\"\n * const example1 = symbolToString(Symbol(\"demo\"))\n * // Expect: undefined\n * const example2 = symbolToString(\"demo\")\n * ```\n */\nexport const symbolToString = (value: unknown): string | undefined => {\n return isSymbol(value) ? value.toString() : undefined\n}\n",
12
12
  "/**\n * Convert an iterable target into an array using spread.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arrayFromSpread(new Set([1, 2, 3]))\n * // Expect: []\n * const example2 = arrayFromSpread([])\n * ```\n */\nexport const arrayFromSpread = <T = unknown>(target: Iterable<T>): T[] => {\n return [...target]\n}\n\n/**\n * Returns the length of `targetArray`.\n *\n * @example\n * ```\n * // Expect: 3\n * const example1 = arrayLength([\"a\", \"b\", \"c\"])\n * // Expect: 0\n * const example2 = arrayLength([])\n * ```\n */\nexport const arrayLength = (targetArray: unknown[]): number => {\n return targetArray.length\n}\n\n/**\n * Returns a copy of `targetArray` in which last element has been removed.\n * New array's length is `targetArray.length - 1`.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arrayPop([1, 2, 3])\n * // Expect: []\n * const example2 = arrayPop([\"only\"])\n * ```\n */\nexport const arrayPop = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.slice(0, -1)\n}\n\n/**\n * Returns a copy of `targetArray` in which inserts the given `item` as new last item.\n * New array's length is `targetArray.length + 1`.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arrayPush(3, [1, 2])\n * // Expect: [\"a\"]\n * const example2 = arrayPush(\"a\", [])\n * ```\n */\nexport const arrayPush = <T = unknown>(item: T, targetArray: T[]): T[] => {\n return [...targetArray, item]\n}\n\n/**\n * Alias of {@link arrayPush}.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arrayAppend(2, [1])\n * // Expect: [\"x\"]\n * const example2 = arrayAppend(\"x\", [])\n * ```\n */\nexport const arrayAppend: typeof arrayPush = arrayPush\n\n/**\n * Returns a copy of `targetArray` in which inserts the given `item` as new fist item.\n * New array's length is `targetArray`'s length + 1.\n *\n * @example\n * ```\n * // Expect: [0, 1, 2]\n * const example1 = arrayUnshift(0, [1, 2])\n * // Expect: [\"a\"]\n * const example2 = arrayUnshift(\"a\", [])\n * ```\n */\nexport const arrayUnshift = <T = unknown>(item: T, targetArray: T[]): T[] => {\n return [item, ...targetArray]\n}\n\n/**\n * Alias of {@link arrayUnshift}.\n *\n * @example\n * ```\n * // Expect: [\"first\", \"second\"]\n * const example1 = arrayPrepend(\"first\", [\"second\"])\n * // Expect: [true]\n * const example2 = arrayPrepend(true, [])\n * ```\n */\nexport const arrayPrepend: typeof arrayUnshift = arrayUnshift\n\n/**\n * Returns a copy of `targetArray` in which first element has been removed.\n * New array's length is `targetArray`'s length - 1.\n *\n * @example\n * ```\n * // Expect: [2, 3]\n * const example1 = arrayShift([1, 2, 3])\n * // Expect: []\n * const example2 = arrayShift([\"only\"])\n * ```\n */\nexport const arrayShift = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.slice(1)\n}\n\n/**\n * Returns the first element of `targetArray`.\n *\n * @example\n * ```\n * // Expect: 1\n * const example1 = arrayHead([1, 2, 3])\n * // Expect: undefined\n * const example2 = arrayHead([])\n * ```\n *\n * @see {@link arrayTail}, {@link arrayLast}\n */\nexport const arrayHead = <T = unknown>(targetArray: T[]): T | undefined => {\n return targetArray[0]\n}\n\n/**\n * Returns the tail of `targetArray`.\n *\n * @example\n * ```\n * // Expect: [2, 3]\n * const example1 = arrayTail([1, 2, 3])\n * // Expect: []\n * const example2 = arrayTail([\"only\"])\n * ```\n *\n * @see {@link arrayHead}, {@link arrayInit}\n */\nexport const arrayTail = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.slice(1)\n}\n\n/**\n * Returns the init of `targetArray`.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arrayInit([1, 2, 3])\n * // Expect: []\n * const example2 = arrayInit([\"only\"])\n * ```\n *\n * @see {@link arrayLast}, {@link arrayTail}\n */\nexport const arrayInit = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.slice(0, -1)\n}\n\n/**\n * Returns the last element of `targetArray`.\n *\n * @example\n * ```\n * // Expect: 3\n * const example1 = arrayLast([1, 2, 3])\n * // Expect: undefined\n * const example2 = arrayLast([])\n * ```\n *\n * @see {@link arrayInit}, {@link arrayHead}\n */\nexport const arrayLast = <T = unknown>(targetArray: T[]): T | undefined => {\n return targetArray.at(-1)\n}\n\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [\"b\", \"c\"]\n * const example1 = arraySlice(1, 3, [\"a\", \"b\", \"c\", \"d\"])\n * // Expect: []\n * const example2 = arraySlice(2, 2, [1, 2, 3])\n * ```\n *\n * @see {@link arraySliceInit}, {@link arraySliceTail}\n */\nexport const arraySlice = <T = unknown>(\n start: number,\n end: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(start, end)\n}\n\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [3, 4]\n * const example1 = arraySliceTail(2, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arraySliceTail(1, [\"only\"])\n * ```\n *\n * @see {@link arraySlice}, {@link arraySliceTail}\n * @see {@link arrayDrop}\n */\nexport const arraySliceTail = <T = unknown>(\n start: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(start)\n}\n\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [3, 4]\n * const example1 = arrayDrop(2, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arrayDrop(-2, [1, 2])\n * ```\n *\n * @see {@link arraySliceTail}\n */\nexport const arrayDrop = <T = unknown>(\n n: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(Math.abs(Math.round(n)))\n}\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arraySliceInit(2, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arraySliceInit(0, [1, 2])\n * ```\n *\n * @see {@link arraySlice}, {@link arraySliceInit}\n */\nexport const arraySliceInit = <T = unknown>(\n end: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(0, Math.round(end))\n}\n\n/**\n * Returns a copy of a section of an array.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = arrayDropLast(2, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arrayDropLast(3, [1, 2])\n * ```\n *\n * @see {@link arraySliceInit}\n */\nexport const arrayDropLast = <T = unknown>(\n n: number,\n targetArray: T[],\n): T[] => {\n return targetArray.slice(0, -Math.abs(Math.round(n)))\n}\n\n/**\n * Returns a copy of `targetArray` with the elements between `start` (inclusive)\n * and `end` (exclusive) removed.\n *\n * @example\n * ```\n * // Expect: [\"a\", \"d\"]\n * const example1 = arrayRemove(1, 3, [\"a\", \"b\", \"c\", \"d\"])\n * // Expect: [1, 2, 3]\n * const example2 = arrayRemove(2, 2, [1, 2, 3])\n * ```\n */\nexport const arrayRemove = <T = unknown>(\n start: number, end: number, targetArray: T[]\n): T[] => {\n let internalStart = Math.abs(Math.round(start))\n let internalEnd = Math.abs(Math.round(end))\n\n if (internalEnd < internalStart) {\n [internalStart, internalEnd] = [internalEnd, internalStart]\n }\n return [...targetArray.slice(0, internalStart), ...targetArray.slice(internalEnd)]\n}\n\n/**\n * Returns a copy of `targetArray` with the element at `index` removed.\n *\n * @example\n * ```\n * // Expect: [\"a\", \"c\"]\n * const example1 = arrayRemoveIndex(1, [\"a\", \"b\", \"c\"])\n * // Expect: []\n * const example2 = arrayRemoveIndex(0, [\"only\"])\n * ```\n */\nexport const arrayRemoveIndex = <T = unknown>(\n index: number,\n targetArray: T[],\n): T[] => {\n return [...targetArray.slice(0, index), ...targetArray.slice(index + 1 === 0 ? Infinity : index + 1)]\n}\n\n/**\n * Combines two array. `appendedArray` will be appended to the end of `targetArray`.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3, 4]\n * const example1 = arrayConcat([3, 4], [1, 2])\n * // Expect: [\"a\"]\n * const example2 = arrayConcat([], [\"a\"])\n * ```\n */\nexport const arrayConcat = <T = unknown>(appendedArray: T[], targetArray: T[]): T[] => {\n return [...targetArray, ...appendedArray]\n}\n\n/**\n * Adds all the elements of an array into a string, separated by the specified\n * separator string.\n *\n * @example\n * ```\n * // Expect: \"a,b,c\"\n * const example1 = arrayJoin(\",\", [\"a\", \"b\", \"c\"])\n * // Expect: \"\"\n * const example2 = arrayJoin(\"-\", [])\n * ```\n */\nexport const arrayJoin = (separator: string, targetArray: unknown[]): string => {\n return targetArray.join(separator)\n}\n\n/**\n * Returns the first index at which a given element can be found in the array,\n * or -1 if it is not present.\n *\n * @example\n * ```\n * // Expect: 1\n * const example1 = arrayIndexOf(\"b\", [\"a\", \"b\", \"c\"])\n * // Expect: -1\n * const example2 = arrayIndexOf(9, [1, 2, 3])\n * ```\n */\nexport const arrayIndexOf = (searchElement: unknown, targetArray: unknown[]): number => {\n return targetArray.indexOf(searchElement)\n}\n\n/**\n * Returns the last index at which a given element can be found in the array,\n * or -1 if it is not present.\n *\n * @example\n * ```\n * // Expect: 2\n * const example1 = arrayLastIndexOf(\"a\", [\"a\", \"b\", \"a\"])\n * // Expect: -1\n * const example2 = arrayLastIndexOf(9, [1, 2, 3])\n * ```\n */\nexport const arrayLastIndexOf = (searchElement: unknown, targetArray: unknown[]): number => {\n return targetArray.lastIndexOf(searchElement)\n}\n\n/**\n * Predicate whether the target array includes the searchElement.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arrayIncludes(2, [1, 2, 3])\n * // Expect: false\n * const example2 = arrayIncludes(\"x\", [\"a\", \"b\"])\n * ```\n */\nexport const arrayIncludes = <T = unknown>(searchElement: T, targetArray: T[]): boolean => {\n return targetArray.includes(searchElement)\n}\n\n/**\n * Predicate whether all elements in the target array satisfy the provided testing function.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arrayEvery((item) => item > 0, [1, 2, 3])\n * // Expect: false\n * const example2 = arrayEvery((item) => item > 1, [1, 2, 3])\n * ```\n */\nexport function arrayEvery<T = unknown, S extends T = T>(\n predicate: (item: T, index: number, array: T[]) => item is S, targetArray: T[]\n): targetArray is S[]\nexport function arrayEvery<T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean, targetArray: T[]\n): boolean\nexport function arrayEvery<T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): boolean {\n return targetArray.every((item, index, array) => predicate(item, index, array))\n}\n\n/**\n * Alias of {@link arrayEvery}.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arrayAll((item) => item !== null, [1, 2])\n * // Expect: false\n * const example2 = arrayAll((item) => item === 0, [0, 1])\n * ```\n */\nexport const arrayAll: typeof arrayEvery = arrayEvery\n\n/**\n * Predicate whether at least one element in the target array satisfies the provided testing function.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arraySome((item) => item > 2, [1, 2, 3])\n * // Expect: false\n * const example2 = arraySome((item) => item < 0, [1, 2, 3])\n * ```\n */\nexport const arraySome = <T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): boolean => {\n return targetArray.some((item, index, array) => predicate(item, index, array))\n}\n\n/**\n * Alias of {@link arraySome}.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = arrayAny((item) => item === \"b\", [\"a\", \"b\"])\n * // Expect: false\n * const example2 = arrayAny((item) => item === \"x\", [\"a\", \"b\"])\n * ```\n */\nexport const arrayAny: typeof arraySome = arraySome\n\n/**\n * Applies a function to each element in the target array.\n *\n * @example\n * ```\n * const target: number[] = []\n * arrayForEach((item) => target.push(item * 2), [1, 2, 3])\n * // Expect: [2, 4, 6]\n * const example1 = target\n * ```\n */\nexport const arrayForEach = <T = unknown>(\n eachDo: (item: T, index: number, array: T[]) => void,\n targetArray: T[],\n): void => {\n targetArray.forEach((item, index, array) => {\n eachDo(item, index, array)\n })\n}\n\n/**\n * Returns a new array containing all elements of the target array that satisfy the provided testing function.\n *\n * @example\n * ```\n * // Expect: [2, 4]\n * const example1 = arrayFilter((item) => item % 2 === 0, [1, 2, 3, 4])\n * // Expect: []\n * const example2 = arrayFilter((item) => item > 0, [])\n * ```\n *\n * @see {@link arrayReject}\n */\nexport function arrayFilter<T = unknown, S extends T = T>(\n predicate: (item: T, index: number, array: T[]) => item is S, targetArray: T[]\n): S[]\nexport function arrayFilter<T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean, targetArray: T[]\n): T[]\nexport function arrayFilter<T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): T[] {\n return targetArray.filter((item, index, array) => predicate(item, index, array))\n}\n\n/**\n * Returns a new array containing all elements of the target array that do not satisfy the provided testing function.\n *\n * @example\n * ```\n * // Expect: [1, 3]\n * const example1 = arrayReject((item) => item % 2 === 0, [1, 2, 3, 4])\n * // Expect: [\"a\"]\n * const example2 = arrayReject((item) => item === \"b\", [\"a\", \"b\"])\n * ```\n *\n * @see {@link arrayFilter}\n */\nexport const arrayReject = <T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): T[] => {\n return targetArray.filter((item, index, array) => !predicate(item, index, array))\n}\n\n/**\n * Returns a tuple of two arrays: the first array contains the elements of the target array that satisfy the provided testing function, while the second array contains the elements that do not satisfy the testing function.\n *\n * @example\n * ```\n * // Expect: [[2, 4], [1, 3]]\n * const example1 = arrayPartition((item) => item % 2 === 0, [1, 2, 3, 4])\n * // Expect: [[], [\"a\"]]\n * const example2 = arrayPartition((item) => item === \"b\", [\"a\"])\n * ```\n *\n * @see {@link arrayFilter}, {@link arrayReject}\n */\nexport const arrayPartition = <T = unknown>(\n predicate: (item: T, index: number, array: T[]) => boolean,\n targetArray: T[],\n): [T[], T[]] => {\n const truthyArray: T[] = []\n const falsyArray: T[] = []\n targetArray.forEach((item, index, array) => {\n if (predicate(item, index, array)) {\n truthyArray.push(item)\n }\n else {\n falsyArray.push(item)\n }\n })\n return [truthyArray, falsyArray]\n}\n\n/**\n * Returns a new array containing the results of applying a provided function to every element in the target array.\n *\n * @example\n * ```\n * // Expect: [2, 4, 6]\n * const example1 = arrayMap((item) => item * 2, [1, 2, 3])\n * // Expect: []\n * const example2 = arrayMap((item) => item, [])\n * ```\n */\nexport const arrayMap = <T = unknown, R = unknown>(\n transformation: (item: T, index: number, array: T[]) => R,\n targetArray: T[],\n): R[] => {\n return targetArray.map((item, index, array) => transformation(item, index, array))\n}\n\n/**\n * Returns a new array with all sub-array elements concatenated into it recursively up to the specified depth.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3, 4]\n * const example1 = arrayFlat(1, [1, [2, 3], [4]])\n * // Expect: [1, 2]\n * const example2 = arrayFlat(2, [1, [[2]]])\n * ```\n *\n * @see {@link arrayFlatMap}\n */\nexport const arrayFlat = <T = unknown, D extends number = number>(\n depth: D,\n targetArray: T[],\n): Array<FlatArray<T[], D>> => {\n return targetArray.flat(depth)\n}\n\n/**\n * Returns a new array containing the results of applying a provided function to every element in the target array, and then flattening the result by one level.\n *\n * @example\n * ```\n * // Expect: [1, 1, 2, 2]\n * const example1 = arrayFlatMap((item) => [item, item], [1, 2])\n * // Expect: []\n * const example2 = arrayFlatMap((item) => [item], [])\n * ```\n *\n * @see {@link arrayMap}, {@link arrayFlat}\n */\nexport const arrayFlatMap = <T = unknown, R = unknown>(\n transformation: (item: T, index: number, array: T[]) => (R | R[]),\n targetArray: T[],\n): R[] => {\n return targetArray.flatMap((item, index, array) => transformation(item, index, array))\n}\n\n/**\n * Returns a single value that is the result of applying a provided function against an accumulator and each element in the target array (from left to right).\n *\n * @example\n * ```\n * // Expect: 6\n * const example1 = arrayReduce((acc, item) => acc + item, 0, [1, 2, 3])\n * // Expect: \"abc\"\n * const example2 = arrayReduce((acc, item) => acc + item, \"\", [\"a\", \"b\", \"c\"])\n * ```\n *\n * @see {@link arrayReduceLeft}, {@link arrayReduceRight}\n */\nexport const arrayReduce = <T = unknown, R = unknown>(\n reducer: (accumulated: R, item: T, index: number, array: T[]) => R,\n initialValue: R,\n targetArray: T[],\n): R => {\n return targetArray.reduce((accumulated, item, index, array) => reducer(accumulated, item, index, array), initialValue)\n}\n/**\n * Alias of {@link arrayReduce}.\n *\n * @example\n * ```\n * // Expect: 6\n * const example1 = arrayReduceLeft((acc, item) => acc + item, 0, [1, 2, 3])\n * // Expect: \"ab\"\n * const example2 = arrayReduceLeft((acc, item) => acc + item, \"\", [\"a\", \"b\"])\n * ```\n *\n * @see {@link arrayReduce}\n */\nexport const arrayReduceLeft: typeof arrayReduce = arrayReduce\n\n/**\n * Returns a single value that is the result of applying a provided function against an accumulator and each element in the target array (from right to left).\n *\n * @example\n * ```\n * // Expect: \"cba\"\n * const example1 = arrayReduceRight((acc, item) => acc + item, \"\", [\"a\", \"b\", \"c\"])\n * // Expect: 6\n * const example2 = arrayReduceRight((acc, item) => acc + item, 0, [1, 2, 3])\n * ```\n *\n * @see {@link arrayReduceLeft}, {@link arrayReduceRight}\n */\nexport const arrayReduceRight = <T = unknown, R = unknown>(\n reducer: (accumulated: R, item: T, index: number, array: T[]) => R,\n initialValue: R,\n targetArray: T[],\n): R => {\n return targetArray.reduceRight((accumulated, item, index, array) => reducer(accumulated, item, index, array), initialValue)\n}\n\n/**\n * Returns a new array containing only one copy of each element in the original array.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arrayUnique([1, 2, 1, 3])\n * // Expect: [\"a\"]\n * const example2 = arrayUnique([\"a\", \"a\"])\n * ```\n */\nexport const arrayUnique = <T = unknown>(targetArray: T[]): T[] => {\n return Array.from(new Set(targetArray))\n}\n\n/**\n * Returns a new array containing only one copy of each element in the original array,\n * based on the provided unique function.\n *\n * @example\n * ```\n * // Expect: [{ id: 1 }, { id: 2 }]\n * const example1 = arrayUniqueBy((item) => item.id, [{ id: 1 }, { id: 1 }, { id: 2 }])\n * // Expect: []\n * const example2 = arrayUniqueBy((item) => item, [])\n * ```\n */\nexport const arrayUniqueBy = <T = unknown>(\n uniqueFunction: (item: T) => unknown, targetArray: T[]\n): T[] => {\n const uniqueMap = new Map<unknown, T>()\n targetArray.forEach((item) => {\n const uniqueKey = uniqueFunction(item)\n if (!uniqueMap.has(uniqueKey)) {\n uniqueMap.set(uniqueKey, item)\n }\n })\n return Array.from(uniqueMap.values())\n}\n\n/**\n * Combines two arrays into one array (no duplicates) composed of the elements of each array.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arrayUnion([1, 2], [2, 3])\n * // Expect: [\"a\"]\n * const example2 = arrayUnion([\"a\"], [])\n * ```\n *\n * @see {@link arrayIntersection}\n */\nexport const arrayUnion = <T = unknown>(firstArray: T[], secondArray: T[]): T[] => {\n return arrayUnique([...firstArray, ...secondArray])\n}\n\ntype CompareArray = (arr1: unknown[], arr2: unknown[]) => unknown[]\nconst _longer: CompareArray = (arr1, arr2) => arr1.length > arr2.length ? arr1 : arr2\nconst _shorter: CompareArray = (arr1, arr2) => arr1.length > arr2.length ? arr2 : arr1\n/**\n * Combines two arrays into one array (no duplicates) composed of those elements common to both arrays.\n *\n * @example\n * ```\n * // Expect: [2]\n * const example1 = arrayIntersection([1, 2], [2, 3])\n * // Expect: []\n * const example2 = arrayIntersection([\"a\"], [\"b\"])\n * ```\n *\n * @see {@link https://ramdajs.com/docs/#intersection}\n * @see {@link arrayUnion}\n */\nexport const arrayIntersection = <T = unknown>(firstArray: T[], secondArray: T[]): T[] => {\n // reference: ramda, it is more efficient when the array length gap is large\n const lookupArr = _longer(firstArray, secondArray)\n const filteredArr = _shorter(firstArray, secondArray)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return arrayUnique(filteredArr.filter(item => lookupArr.includes(item))) as T[]\n}\n\n/**\n * Returns a new array with the elements in reverse order.\n *\n * @example\n * ```\n * // Expect: [3, 2, 1]\n * const example1 = arrayReverse([1, 2, 3])\n * // Expect: []\n * const example2 = arrayReverse([])\n * ```\n */\nexport const arrayReverse = <T = unknown>(targetArray: T[]): T[] => {\n return targetArray.toReversed()\n}\n\n/**\n * Returns a new array with the elements sorted according to the provided compare function.\n *\n * @example\n * ```\n * // Expect: [1, 2, 3]\n * const example1 = arraySort((a, b) => a - b, [3, 1, 2])\n * // Expect: [\"a\", \"b\"]\n * const example2 = arraySort((a, b) => a.localeCompare(b), [\"b\", \"a\"])\n * ```\n */\nexport const arraySort = <T = unknown>(\n compareFunction: (a: T, b: T) => number,\n targetArray: T[],\n): T[] => {\n return targetArray.toSorted(compareFunction)\n}\n\n/**\n * Shuffle the target array.\n *\n * @see {@link https://github.com/mqyqingfeng/Blog/issues/51}\n *\n * @example\n * ```\n * const example1 = shuffle([1, 2, 3])\n * const example2 = shuffle([\"a\", \"b\"])\n * // Expect: example1.length === 3\n * // Expect: example2.length === 2\n * ```\n */\nexport const shuffle = <T = unknown>(target: T[]): T[] => {\n const _target = [...target]\n for (let i = _target.length; i !== 0; i = i - 1) {\n const j = Math.floor(Math.random() * i);\n // @ts-expect-error - ignore the error\n [_target[i - 1], _target[j]] = [_target[j], _target[i - 1]]\n }\n return _target\n}\n\n/**\n * Applies a function to the value at the given index of an array,\n * returning a new copy of the array with the element at the given index\n * replaced with the result of the function application.\n *\n * @example\n * ```\n * // Expect: [1, 20, 3]\n * const example1 = arrayAdjust(1, (item) => item * 10, [1, 2, 3])\n * // Expect: [\"a\"]\n * const example2 = arrayAdjust(0, (item) => item, [\"a\"])\n * ```\n *\n * @see {@link https://ramdajs.com/docs/#adjust}\n */\nexport const arrayAdjust = <T = unknown>(\n index: number,\n transformation: (item: T) => T,\n targetArray: T[],\n): T[] => {\n const _targetArray = [...targetArray]\n // oxlint-disable-next-line no-unsafe-type-assertion\n _targetArray[index] = transformation(_targetArray[index] as T)\n return _targetArray\n}\n\n/**\n * Returns a new copy of the array with the element\n * at the provided index replaced with the given value.\n *\n * @example\n * ```\n * // Expect: [1, 9, 3]\n * const example1 = arrayUpdate(1, 9, [1, 2, 3])\n * // Expect: [\"x\"]\n * const example2 = arrayUpdate(0, \"x\", [\"a\"])\n * ```\n *\n * @see {@link arrayAdjust}\n */\nexport const arrayUpdate = <T = unknown>(\n index: number,\n newItem: T,\n targetArray: T[],\n): T[] => {\n return arrayAdjust(index, () => newItem, targetArray)\n}\n",
13
- "import type { AnyRecord } from \"../type/index.ts\"\n\n/**\n * Return a new object that includes only the specified keys from the source object.\n *\n * @example\n * ```\n * // Expect: { a: 1, c: 3 }\n * const example1 = includeFields({ a: 1, b: 2, c: 3 }, [\"a\", \"c\"])\n * // Expect: {}\n * const example2 = includeFields(null, [\"a\"])\n * ```\n */\nexport const includeFields = <T extends AnyRecord, K extends keyof T>(\n object: T | null | undefined,\n keys: K[],\n): Pick<T, K> => {\n if (object === null || object === undefined) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Pick<T, K>\n }\n const newObject: Partial<Pick<T, K>> = {} // 初始化一个部分类型的对象\n keys.forEach((key) => {\n if (key in object) {\n newObject[key] = object[key]\n }\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return newObject as Pick<T, K> // 使用正确的变量名并断言返回类型\n}\n\n/**\n * Return a new object that excludes the specified keys from the source object.\n *\n * @example\n * ```\n * // Expect: { a: 1 }\n * const example1 = excludeFields({ a: 1, b: 2 }, [\"b\"])\n * // Expect: {}\n * const example2 = excludeFields(undefined, [\"a\"])\n * ```\n */\nexport const excludeFields = <T extends AnyRecord, K extends keyof T>(\n object: T | null | undefined,\n keys: K[],\n): Omit<T, K> => {\n if (object === null || object === undefined) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Omit<T, K>\n }\n const newObject: Partial<T> = { ...object } // 创建原对象的浅拷贝\n keys.forEach((key) => {\n // oxlint-disable-next-line no-dynamic-delete\n delete newObject[key] // 删除指定的键\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return newObject as Omit<T, K> // 使用Omit类型确保返回的类型反映了被排除的键\n}\n",
13
+ "import type { AnyRecord } from \"../type/index.ts\"\nimport { isDate } from \"./is.ts\"\n\n/**\n * Return a new object that includes only the specified keys from the source object.\n *\n * @example\n * ```\n * // Expect: { a: 1, c: 3 }\n * const example1 = includeFields({ a: 1, b: 2, c: 3 }, [\"a\", \"c\"])\n * // Expect: {}\n * const example2 = includeFields(null, [\"a\"])\n * ```\n */\nexport const includeFields = <T extends AnyRecord, K extends keyof T>(\n object: T | null | undefined,\n keys: K[],\n): Pick<T, K> => {\n if (object === null || object === undefined) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Pick<T, K>\n }\n const newObject: Partial<Pick<T, K>> = {} // 初始化一个部分类型的对象\n keys.forEach((key) => {\n if (key in object) {\n newObject[key] = object[key]\n }\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return newObject as Pick<T, K> // 使用正确的变量名并断言返回类型\n}\n\n/**\n * Return a new object that excludes the specified keys from the source object.\n *\n * @example\n * ```\n * // Expect: { a: 1 }\n * const example1 = excludeFields({ a: 1, b: 2 }, [\"b\"])\n * // Expect: {}\n * const example2 = excludeFields(undefined, [\"a\"])\n * ```\n */\nexport const excludeFields = <T extends AnyRecord, K extends keyof T>(\n object: T | null | undefined,\n keys: K[],\n): Omit<T, K> => {\n if (object === null || object === undefined) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Omit<T, K>\n }\n const newObject: Partial<T> = { ...object } // 创建原对象的浅拷贝\n keys.forEach((key) => {\n // oxlint-disable-next-line no-dynamic-delete\n delete newObject[key] // 删除指定的键\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return newObject as Omit<T, K> // 使用Omit类型确保返回的类型反映了被排除的键\n}\n\n/**\n * Convert all Date fields in an object to number.\n *\n * @example\n * ```before\n * type Obj = {\n * createdAt: Date,\n * }\n * ```\n * ```after\n * type Obj = {\n * createdAt: number,\n * }\n * ```\n *\n * @example\n * ```before\n * type Obj = {\n * createdAt: Date | undefined,\n * }\n * ```\n * ```after\n * type Obj = {\n * createdAt: number | undefined,\n * }\n * ```\n *\n * @example\n * ```before\n * type Obj = {\n * createdAt: Date | null,\n * }\n * ```\n * ```after\n * type Obj = {\n * createdAt: number | null,\n * }\n * ```\n */\nexport type ObjectDateFieldsToNumber<O extends object> = {\n [K in keyof O]: O[K] extends Date\n ? number\n : (\n O[K] extends Date | undefined\n ? number | undefined\n :\n (O[K] extends Date | null\n ? number | null\n : (\n O[K] extends object\n ? ObjectDateFieldsToNumber<O[K]>\n : O[K]\n )\n )\n )\n}\n/**\n * Convert all Date fields in an object to number.\n *\n * @example\n * ```\n * const obj = { createdAt: new Date() };\n * const result = objectDateFieldsToNumber(obj);\n * // Expect: { createdAt: 1712345678901 }\n * ```\n */\nexport const objectDateFieldsToNumber = <O extends Record<string | number | symbol, unknown>>(\n obj: O\n): ObjectDateFieldsToNumber<O> => {\n // oxlint-disable-next-line guard-for-in\n for (const key in obj) {\n const value = obj[key];\n if (isDate(value)) {\n // oxlint-disable-next-line no-unsafe-type-assertion\n obj[key] = value.getTime() as O[Extract<keyof O, string>]\n }\n }\n // oxlint-disable-next-line no-unsafe-type-assertion\n return obj as ObjectDateFieldsToNumber<O>\n}\n",
14
14
  "import type {\n AnyAsyncFunction,\n AnyFunction,\n FunctionComposeAll,\n FunctionPipeAll,\n} from \"#Source/type/index.ts\"\n\nimport { asIs } from \"./helper.ts\"\nimport { isAsyncFunction, isSyncFunction } from \"./is.ts\"\n\n/**\n * Immediately invoke a function with the provided arguments.\n *\n * @example\n * ```\n * // Expect: 3\n * const example1 = functionIife((a: number, b: number) => a + b, 1, 2)\n * // Expect: \"ok\"\n * const example2 = functionIife(() => \"ok\")\n * ```\n */\nexport const functionIife = <T extends AnyFunction>(\n fn: T, ...args: Parameters<T>\n): ReturnType<T> => {\n // oxlint-disable-next-line no-unsafe-return\n return fn(...args)\n}\n\nexport type FunctionOnce<T extends AnyFunction> =\n (...args: Parameters<T>) => ReturnType<T>\n/**\n * Generate a one-off function for a given function.\n *\n * @example\n * ```\n * const onceFn = functionOnce((x) => x * 2)\n * // Will return 10\n * const result1 = onceFn(5)\n * // Will still return 10, original function will not be called again\n * const result2 = onceFn(10)\n * // If timesSubscriber is provided, it will be called with the number of calls after the second call\n * let callCount = 0\n * const onceFnWithSubscriber = functionOnce((x) => x * 2, (times) => { callCount = times })\n * onceFnWithSubscriber(5) // callCount is still 0\n * onceFnWithSubscriber(10) // callCount becomes 2\n * ```\n */\nexport const functionOnce = <T extends AnyFunction>(\n fn: T,\n timesSubscriber?: (times: number) => void,\n): FunctionOnce<T> => {\n let called = false\n let result: ReturnType<typeof fn>\n let times = 0\n return (...args) => {\n times = times + 1\n if (called === false) {\n // oxlint-disable-next-line no-unsafe-assignment\n result = fn(...args)\n called = true\n }\n if (times >= 2 && timesSubscriber !== undefined) {\n timesSubscriber(times)\n }\n // oxlint-disable-next-line no-unsafe-return\n return result\n }\n}\n\nexport type FunctionDebouncedSimple<T extends AnyFunction> =\n (...args: Parameters<T>) => void\n/**\n * Generate a simple debounced function that delays invoking\n * the original function until after a specified wait time\n * has elapsed since the last time the debounced function was called.\n *\n * @example\n * ```\n * const debouncedFn = functionDebounceSimple((x) => console.log(x), 100)\n * // Will log 5 after 100ms\n * debouncedFn(5)\n * // Will not log anything, will reset the timer\n * debouncedFn(10)\n * ```\n */\nexport const functionDebounceSimple = <T extends AnyFunction>(\n fn: T,\n ms: number\n): FunctionDebouncedSimple<T> => {\n let timer: NodeJS.Timeout\n return (...args) => {\n clearTimeout(timer)\n timer = setTimeout(() => {\n fn(...args)\n }, ms)\n }\n}\n\nexport type FunctionDebounced<T extends AnyFunction>\n = (...args: Parameters<T>) => Promise<ReturnType<T>>\n/**\n * Generate a debounced function that returns a promise resolving\n * to the result of the original function. If the debounced function is called\n * multiple times within the debounce period, it will only execute the original\n * function once, and all calls will receive the same result.\n *\n * @example\n * ```\n * const debouncedFn = debounce(async (x) => x * 2, 100)\n * // Will execute the original function after 100ms\n * const result1 = debouncedFn(5)\n * // Will not execute the original function, will receive the same result as result1\n * const result2 = debouncedFn(10)\n * // After 100ms, both result1 and result2 will resolve to 10\n * ```\n */\nexport const debounce = <T extends AnyFunction>(\n fn: T,\n ms: number\n): FunctionDebounced<T> => {\n let timer: NodeJS.Timeout\n let waiting: AnyFunction[] = []\n return async (...args) => {\n clearTimeout(timer)\n timer = setTimeout((async () => {\n // oxlint-disable-next-line no-unsafe-assignment\n const res = await fn(...args)\n waiting.forEach((resolve) => {\n resolve(res)\n })\n waiting = []\n }) as (() => void), ms)\n\n // oxlint-disable-next-line no-unsafe-return\n return await new Promise((resolve) => {\n waiting.push(resolve)\n })\n }\n}\n\nconst THROTTLE_TYPE_ERROR = new TypeError(\"Throttle: fn must be a SyncFunction or AsyncFunction\")\nexport type FunctionThrottleTimeSimple<T extends AnyFunction> =\n (...args: Parameters<T>) => void\n/**\n * Generate a simple throttled function that only invokes the original function at most\n * once per every specified milliseconds. The throttled function will execute the original\n * function immediately on the first call, and then ignore subsequent calls until the\n * specified time has elapsed.\n *\n * If `strict` is set to true, the throttled function will ensure that the window of time\n * during which the original function can be invoked is greater than the sum of the\n * specified milliseconds and the execution time of the original function.\n *\n * @example\n * ```\n * let called = 0\n * const throttled = functionThrottleTimeSimple(() => { called += 1 }, 100)\n * throttled()\n * throttled()\n * // Expect: called === 1\n * const example1 = called\n * ```\n */\nexport const functionThrottleTimeSimple = <T extends AnyFunction>(\n fn: T,\n ms: number,\n strict = false\n): FunctionThrottleTimeSimple<T> => {\n let isCalling = false\n // NOTE: 对于不同的目标函数,分别返回不同的结果,避免在每次运行时再做条件判断。\n if (isSyncFunction(fn) === true) {\n return (...args) => {\n if (isCalling === false) {\n isCalling = true\n setTimeout(() => {\n isCalling = false\n }, ms)\n fn(...args)\n }\n }\n }\n else if (isAsyncFunction(fn) === true) {\n return (...args) => {\n let isExecuted = false\n let timerExpired = false\n if (isCalling === false) {\n isCalling = true\n setTimeout(() => {\n if (strict === false) {\n isCalling = false\n }\n else {\n if (isExecuted === true) {\n isCalling = false\n }\n else {\n timerExpired = true\n }\n }\n }, ms);\n ; void (fn as AnyAsyncFunction)(...args).finally(() => {\n isExecuted = true\n if (timerExpired === true) {\n isCalling = false\n }\n })\n }\n }\n }\n else {\n throw THROTTLE_TYPE_ERROR\n }\n}\n\nexport type FunctionThrottleSimple<T extends AnyFunction> =\n (...args: Parameters<T>) => void\n/**\n * Generate a throttled function that only invokes the original function\n * when it is not currently executing.\n *\n * @example\n * ```\n * let called = 0\n * const throttled = functionThrottleSimple(() => { called += 1 })\n * throttled()\n * throttled()\n * // Expect: called === 1\n * const example1 = called\n * ```\n */\nexport const functionThrottleSimple = <T extends AnyFunction>(\n fn: T\n): FunctionThrottleSimple<T> => {\n let isCalling = false\n if (isSyncFunction(fn) === true) {\n return (...args) => {\n if (isCalling === false) {\n isCalling = true\n fn(...args)\n isCalling = false\n }\n }\n }\n else if (isAsyncFunction(fn) === true) {\n return (...args) => {\n if (isCalling === false) {\n isCalling = true;\n ; void (fn as AnyAsyncFunction)(...args).then(() => {\n isCalling = false\n })\n }\n }\n }\n else {\n throw THROTTLE_TYPE_ERROR\n }\n}\n\nexport type FunctionThrottleTime<T extends AnyFunction> =\n (...args: Parameters<T>) => Promise<ReturnType<T>>\n/**\n * Generate a throttled function that returns a promise resolving to the result\n * of the original function. The throttled function will ensure that the original\n * function is invoked at most once per every specified milliseconds.\n *\n * If `strict` is set to true, the window of time during which the original function\n * can be invoked will be greater than the sum of the specified milliseconds and\n * the execution time of the original function.\n *\n * @example\n * ```\n * const throttled = throttleTime(async (value: number) => value * 2, 100)\n * const result1 = throttled(2)\n * const result2 = throttled(3)\n * // Expect: result1 and result2 resolve to 4\n * ```\n */\nexport const throttleTime = <T extends AnyFunction>(\n fn: T,\n ms: number,\n strict = false\n): FunctionThrottleTime<T> => {\n let isCalling = false\n let waiting: AnyFunction[] = []\n return async (...args) => {\n let isExecuted = false\n let timerExpired = false\n if (isCalling === false) {\n isCalling = true\n setTimeout(() => {\n if (strict === false) {\n isCalling = false\n }\n else {\n if (isExecuted === true) {\n isCalling = false\n }\n else {\n timerExpired = true\n }\n }\n }, ms)\n // NOTE: 一般来说,如果目标函数是同步函数,节流版本也会同步执行,\n // 如果是异步函数,节流版本会异步运行,\n // 需要拿到结果的节流版本一律按照异步处理。\n void Promise.resolve(fn(...args)).then((res) => {\n // 先广播执行结果\n waiting.forEach((resolve) => {\n resolve(res)\n })\n waiting = []\n // 后重置节流状态\n isExecuted = true\n if (timerExpired === true) {\n isCalling = false\n }\n })\n }\n // oxlint-disable-next-line no-unsafe-return\n return (await new Promise((resolve) => {\n waiting.push(resolve)\n })) as ReturnType<T>\n }\n}\n\nexport type FunctionThrottle<T extends AnyFunction> =\n (...args: Parameters<T>) => Promise<ReturnType<T>>\n/**\n * Generate a throttled function that returns a promise resolving to the result\n * of the original function and coalesces concurrent calls.\n *\n * @example\n * ```\n * const throttled = functionThrottle(async () => \"ok\")\n * const result1 = throttled()\n * const result2 = throttled()\n * // Expect: result1 and result2 resolve to \"ok\"\n * ```\n */\nexport const functionThrottle = <T extends AnyFunction>(\n fn: T\n): FunctionThrottle<T> => {\n let isCalling = false\n let waiting: AnyFunction[] = []\n return async () => {\n if (isCalling === false) {\n isCalling = true\n void Promise.resolve(fn()).then((res) => {\n // 先广播执行结果\n waiting.forEach((resolve) => {\n resolve(res)\n })\n waiting = []\n // 后重置节流状态\n isCalling = false\n })\n }\n // oxlint-disable-next-line no-unsafe-return\n return (await new Promise((resolve) => {\n waiting.push(resolve)\n })) as ReturnType<T>\n }\n}\n\n/**\n * Compose functions from right to left.\n *\n * @example\n * ```\n * const addOne = (value: number) => value + 1\n * const double = (value: number) => value * 2\n * const composed = functionCompose(addOne, double)\n * // Expect: 5\n * const example1 = composed(2)\n * ```\n */\nexport const functionCompose = <Fns extends AnyFunction[]>(\n ...fns: Fns\n): FunctionComposeAll<Fns> => {\n const reversedFns = fns.toReversed()\n const initialFunction = reversedFns.shift() ?? asIs\n const composedFunction = reversedFns.reduce((g, f) => {\n // oxlint-disable-next-line no-explicit-any explicit-function-return-type\n return (...args: any[]) => {\n // oxlint-disable-next-line no-unsafe-return no-unsafe-argument\n return f(g(...args))\n }\n }, initialFunction)\n // oxlint-disable-next-line no-unsafe-type-assertion\n return composedFunction as FunctionComposeAll<Fns>\n}\n\n/**\n * Pipe functions from left to right.\n *\n * @example\n * ```\n * const addOne = (value: number) => value + 1\n * const double = (value: number) => value * 2\n * const piped = functionPipe(addOne, double)\n * // Expect: 6\n * const example1 = piped(2)\n * ```\n */\nexport const functionPipe = <Fns extends AnyFunction[]>(\n ...fns: Fns\n): FunctionPipeAll<Fns> => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return functionCompose(...fns.toReversed()) as FunctionPipeAll<Fns>\n}\n\nexport type FunctionMemorized<T extends AnyFunction> =\n (...args: Parameters<T>) => ReturnType<T>\n// oxlint-disable-next-line no-explicit-any\nconst defaultMemorizeHasher = (...args: any[]): string => JSON.stringify(args)\n/**\n * Generate a memoized function that caches results by arguments.\n *\n * @example\n * ```\n * let calls = 0\n * const sum = (a: number, b: number) => {\n * calls += 1\n * return a + b\n * }\n * const memoized = functionMemorize(sum)\n * // Expect: 3\n * const example1 = memoized(1, 2)\n * // Expect: 3\n * const example2 = memoized(1, 2)\n * // Expect: calls === 1\n * const example3 = calls\n * ```\n */\nexport const functionMemorize = <T extends AnyFunction>(\n fn: T,\n hashFunction?: (...args: Parameters<T>) => unknown\n): FunctionMemorized<T> => {\n const cache = new Map()\n const hasher = hashFunction ?? defaultMemorizeHasher\n return (...args) => {\n const key = hasher(...args)\n if (cache.has(key)) {\n // oxlint-disable-next-line no-unsafe-return\n return cache.get(key)\n }\n // oxlint-disable-next-line no-unsafe-assignment\n const result = fn(...args)\n cache.set(key, result)\n // oxlint-disable-next-line no-unsafe-return\n return result\n }\n}\n",
15
15
  "import { isDate } from \"./is.ts\"\n\n/**\n * Check whether a date is outdated (in the past).\n */\nexport const temporalIsOutdated = (target: unknown): boolean => {\n return isDate(target) && (new Date(target).getTime() < Date.now())\n}\n\n/**\n * Format a timestamp to a YYYY-MM-DD string.\n *\n * @example\n * ```\n * // Expect: \"1970-01-01\"\n * const example1 = temporalFormatToYYYYMMDD(0)\n * // Expect: \"2000/01/02\"\n * const example2 = temporalFormatToYYYYMMDD(946771200000, \"/\")\n * ```\n */\nexport const temporalFormatToYYYYMMDD = (timestamp: number, separator = \"-\"): string => {\n const date = new Date(timestamp)\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n return `${year}${separator}${month}${separator}${day}`\n}\n\n/**\n * Format a timestamp to a hh:mm:ss string.\n *\n * @example\n * ```\n * // Expect: \"00:00:00\"\n * const example1 = temporalFormatTohhmmss(0)\n * // Expect: \"12:34:56\"\n * const example2 = temporalFormatTohhmmss(45296000)\n * ```\n */\nexport const temporalFormatTohhmmss = (timestamp: number, separator = \":\"): string => {\n const date = new Date(timestamp)\n const hours = String(date.getHours()).padStart(2, \"0\")\n const minutes = String(date.getMinutes()).padStart(2, \"0\")\n const seconds = String(date.getSeconds()).padStart(2, \"0\")\n return `${hours}${separator}${minutes}${separator}${seconds}`\n}\n\n/**\n * Format a timestamp to a YYYY-MM-DD hh:mm:ss string.\n *\n * @example\n * ```\n * // Expect: \"1970-01-01 00:00:00\"\n * const example1 = temporalFormatToYYYYMMDDhhmmss(0)\n * // Expect: \"2000-01-02 00:00:00\"\n * const example2 = temporalFormatToYYYYMMDDhhmmss(946771200000)\n * ```\n */\nexport const temporalFormatToYYYYMMDDhhmmss = (timestamp: number): string => {\n return `${temporalFormatToYYYYMMDD(timestamp)} ${temporalFormatTohhmmss(timestamp)}`\n}\n\n/**\n * Format a timestamp to a relative time string (e.g., \"刚刚\", \"5 分钟前\").\n *\n * @example\n * ```\n * // Expect: \"刚刚\"\n * const originalNow = Date.now\n * Date.now = () => 3_600_000\n * const example1 = temporalFormatToRelativeTime(3_600_000)\n * // Expect: \"1 小时前\"\n * const example2 = temporalFormatToRelativeTime(0)\n * Date.now = originalNow\n * ```\n */\nexport const temporalFormatToRelativeTime = (timestamp: number): string => {\n const now = Date.now()\n const diffInSeconds = Math.floor((now - timestamp) / 1_000)\n\n if (diffInSeconds < 60) {\n return \"刚刚\"\n }\n else if (diffInSeconds < 3_600) {\n const minutes = Math.floor(diffInSeconds / 60)\n return `${minutes} 分钟前`\n }\n else if (diffInSeconds < 86_400) {\n const hours = Math.floor(diffInSeconds / 3_600)\n return `${hours} 小时前`\n }\n else if (diffInSeconds < 172_800) {\n return \"昨天\"\n }\n else if (diffInSeconds < 604_800) {\n return \"一周内\"\n }\n else {\n // 格式化为 YYYY-MM-DD hh:ss\n return temporalFormatToYYYYMMDDhhmmss(timestamp)\n }\n}\n\nexport interface TemporalFormatToWechatRelativeTimeOptions {\n timestamp: number\n alwaysShowTime?: boolean | undefined\n}\n/**\n * Format a timestamp to a WeChat-style relative time string.\n *\n * @example\n * ```\n * // Expect: \"70/01/01\"\n * const example1 = temporalFormatToWechatRelativeTime({ timestamp: 0 })\n * // Expect: \"70/01/01 00:00\"\n * const example2 = temporalFormatToWechatRelativeTime({ timestamp: 0, alwaysShowTime: true })\n * ```\n */\nexport const temporalFormatToWechatRelativeTime = (\n options: TemporalFormatToWechatRelativeTimeOptions\n): string => {\n const {\n timestamp,\n alwaysShowTime = false,\n } = options\n\n const now = new Date()\n const targetDate = new Date(timestamp)\n\n const padZero = (num: number): string => num.toString().padStart(2, \"0\")\n\n const isSameDay = (date1: Date, date2: Date): boolean => {\n return date1.getFullYear() === date2.getFullYear()\n && date1.getMonth() === date2.getMonth()\n && date1.getDate() === date2.getDate()\n }\n\n const isYesterday = (date1: Date, date2: Date): boolean => {\n const yesterday = new Date(date1)\n yesterday.setDate(date1.getDate() - 1)\n return isSameDay(yesterday, date2)\n }\n\n const getWeekDayName = (date: Date): string => {\n const weekdays = [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"]\n return weekdays[date.getDay()]!\n }\n\n const isSameWeek = (date1: Date, date2: Date): boolean => {\n const startOfWeek = (date: Date): Date => {\n const result = new Date(date)\n const day = result.getDay()\n const diff = result.getDate() - day + (day === 0 ? -6 : 1)\n result.setDate(diff)\n return new Date(result.getFullYear(), result.getMonth(), result.getDate())\n }\n\n return startOfWeek(date1).getTime() === startOfWeek(date2).getTime()\n }\n\n const date = `${padZero(targetDate.getFullYear() % 100)}/${padZero(targetDate.getMonth() + 1)}/${padZero(targetDate.getDate())}`\n const time = `${padZero(targetDate.getHours())}:${padZero(targetDate.getMinutes())}`\n\n if (isSameDay(now, targetDate)) {\n return time\n }\n else if (isYesterday(now, targetDate)) {\n return alwaysShowTime ? `昨天 ${time}` : \"昨天\"\n }\n else if (isSameWeek(now, targetDate)) {\n return alwaysShowTime ? `${getWeekDayName(targetDate)} ${time}` : getWeekDayName(targetDate)\n }\n else {\n return alwaysShowTime ? `${date} ${time}` : date\n }\n}\n\ntype InternalUnitsDict = Record<string, string>\nconst INTERNAL_UNITS_DICT: InternalUnitsDict = {\n year: \"年\",\n month: \"月\",\n week: \"周\",\n day: \"天\",\n hour: \"小时\",\n minute: \"分钟\",\n second: \"秒\",\n millisecond: \"毫秒\",\n}\ntype InternalUnitsMilliDict = Record<string, number>\nconst INTERNAL_UNITS_MILLI_DICT: InternalUnitsMilliDict = {\n year: 31_557_600_000,\n month: 2_629_800_000,\n week: 604_800_000,\n day: 86_400_000,\n hour: 3_600_000,\n minute: 60_000,\n second: 1_000,\n millisecond: 1,\n}\n/**\n * Convert a timestamp to a human-readable relative time string in Chinese.\n *\n * @example\n * ```\n * // Expect: \"刚刚\"\n * const originalNow = Date.now\n * Date.now = () => 3_600_000\n * const example1 = temporalHumanize(3_600_000)\n * // Expect: \"1 小时前\"\n * const example2 = temporalHumanize(0)\n * Date.now = originalNow\n * ```\n */\nexport const temporalHumanize = (timestamp: number): string => {\n let res = \"\"\n const milliseconds = Date.now() - timestamp\n for (const key in INTERNAL_UNITS_MILLI_DICT) {\n if (milliseconds >= INTERNAL_UNITS_MILLI_DICT[key]!) {\n res = `${Math.floor(milliseconds / INTERNAL_UNITS_MILLI_DICT[key]!)} ${INTERNAL_UNITS_DICT[key]}前`\n break\n }\n }\n return res !== \"\" ? res : \"刚刚\"\n}\n",
16
16
  "import { isError } from \"./is.ts\"\n\nconst internalErrorMessages = new Set([\n \"network error\", // Chrome\n \"Failed to fetch\", // Chrome\n \"NetworkError when attempting to fetch resource.\", // Firefox\n \"The Internet connection appears to be offline.\", // Safari 16\n \"Load failed\", // Safari 17+\n \"Network request failed\", // `cross-fetch`\n \"fetch failed\", // Undici (Node.js)\n \"terminated\", // Undici (Node.js)\n])\n\n/**\n * Checks if an error is a network error.\n *\n * @see {@link https://github.com/sindresorhus/is-network-error}\n */\nexport const errorIsNetworkError = (error: unknown): error is Error => {\n if (error === null || error === undefined) {\n return false\n }\n\n if (isError(error) === false) {\n return false\n }\n\n if (error.name !== \"TypeError\" || typeof error.message !== \"string\") {\n return false\n }\n\n // We do an extra check for Safari 17+ as it has a very generic error message.\n // Network errors in Safari have no stack.\n if (error.message === \"Load failed\") {\n return error.stack === undefined\n }\n\n return internalErrorMessages.has(error.message)\n}\n\n/**\n * Stringifies an exception into a readable format.\n */\nexport const errorStringifyException = (exception: unknown): string => {\n if (isError(exception)) {\n return `${exception.name}: ${exception.message}`\n }\n else {\n return `${String(exception)}`\n }\n}\n",
17
17
  "/**\n * Checks if a string is a valid email address.\n */\nexport const regexpIsEmail = (value: string): boolean => {\n const emailRegex = /^[\\w.%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$/i\n return emailRegex.test(value)\n}\n",
18
18
  "import { isPlainObject } from \"./is.ts\"\n\n/**\n * Chain a promise with a fulfillment callback and return the transformed result.\n *\n * @example\n * ```\n * // Expect: 6\n * const example1 = await promiseThen((value: number) => value * 2, Promise.resolve(3))\n * // Expect: \"ok!\"\n * const example2 = await promiseThen((value: string) => `${value}!`, Promise.resolve(\"ok\"))\n * ```\n */\nexport const promiseThen = async <V, R>(\n doSomething: (value: V) => R | PromiseLike<R>,\n target: Promise<V>,\n): Promise<R> => {\n return await target.then(doSomething)\n}\n\n/**\n * Handle a rejected promise and convert it to a resolved fallback value.\n *\n * @example\n * ```\n * // Expect: \"fallback\"\n * const example1 = await promiseCatch(() => \"fallback\", Promise.reject(new Error(\"x\")))\n * // Expect: 3\n * const example2 = await promiseCatch(() => 0, Promise.resolve(3))\n * ```\n */\nexport const promiseCatch = async <V, R>(\n doSomething: (reason: unknown) => R | PromiseLike<R>,\n target: Promise<V>,\n): Promise<V | R> => {\n return await target.catch(doSomething)\n}\n\n/**\n * Run a callback after a promise settles and keep the original resolved value.\n *\n * @example\n * ```\n * let cleaned = false\n * // Expect: 10\n * const example1 = await promiseFinally(() => { cleaned = true }, Promise.resolve(10))\n * // Expect: true\n * const example2 = cleaned\n * ```\n */\nexport const promiseFinally = async <V>(\n doSomething: () => void,\n target: Promise<V>,\n): Promise<V> => {\n return await target.finally(doSomething)\n}\n\nconst INTERNAL_PROMISE_FAIL_RESULT_TYPE: symbol = Symbol(\"fail\")\nexport interface PromiseFailResult {\n __type__: typeof INTERNAL_PROMISE_FAIL_RESULT_TYPE\n reason: unknown\n}\nexport interface PromiseIndexedFailResult extends PromiseFailResult {\n index: number\n}\nexport const promiseConstructFailResult = (reason: unknown): PromiseFailResult => {\n return { __type__: INTERNAL_PROMISE_FAIL_RESULT_TYPE, reason }\n}\n/**\n * Predicate whether the target is a promise fail result.\n */\nexport const isPromiseFailResult = (target: unknown): target is PromiseFailResult => {\n return isPlainObject(target) && target[\"__type__\"] === INTERNAL_PROMISE_FAIL_RESULT_TYPE\n}\n/**\n * Designed to use as `onrejected` callback of `Promise.catch`\n * to return a standard `PromiseFailResult`.\n */\nexport const promiseCatchToFailResult = (reason: unknown): PromiseFailResult => {\n return { __type__: INTERNAL_PROMISE_FAIL_RESULT_TYPE, reason }\n}\n\n/**\n * Giving an array, filter non-`PromiseFailResult` items.\n */\nexport const promiseFilterSuccessResults = <V>(\n results: Array<V | PromiseFailResult>,\n): V[] => {\n const filtered = results.filter(result => {\n return isPromiseFailResult(result) === false\n })\n // oxlint-disable-next-line no-unsafe-type-assertion\n return filtered as V[]\n}\n/**\n * Giving a array, filter `PromiseFailResult` items, with extra `index` property\n * which indicate the index of the item in the original array.\n */\nexport const promiseFilterFailResults = <V>(\n results: Array<V | PromiseFailResult>,\n): PromiseIndexedFailResult[] => {\n const filtered = results.reduce<PromiseIndexedFailResult[]>((\n accumulatedResults, currentResult, index\n ) => {\n if (isPromiseFailResult(currentResult)) {\n accumulatedResults.push({ ...currentResult, index })\n }\n return accumulatedResults\n }, [])\n return filtered\n}\n\ninterface PromiseQueueFirstPromiseMakerContext<S = unknown> {\n index: number\n hasPreviousResult: false\n state: S\n}\ninterface PromiseQueueRestPromiseMakerContext<V, S = unknown> {\n index: number\n hasPreviousResult: true\n previousResult: V | PromiseFailResult\n state: S\n}\ntype PromiseQueueFirstPromiseMaker<T, S = unknown> = (context: PromiseQueueFirstPromiseMakerContext<S>) => Promise<T>\ntype PromiseQueueRestPromiseMaker<T, S = unknown> = (context: PromiseQueueRestPromiseMakerContext<T, S>) => Promise<T>\ntype PromiseQueuePromiseMakers<T, S = unknown> = [\n PromiseQueueFirstPromiseMaker<T, S>,\n ...PromiseQueueRestPromiseMaker<T, S>[]\n]\nexport interface PromiseQueueOptions {\n /**\n * @default 0\n */\n breakTime?: number\n}\n/**\n * Execute promise makers in sequence, passing the previous result to the next maker.\n *\n * @example\n * ```\n * // Expect: [1, 2]\n * const example1 = await promiseQueue<number>([\n * async () => 1,\n * async ({ previousResult }) => (isPromiseFailResult(previousResult) ? 0 : previousResult + 1),\n * ])\n * ```\n */\nexport const promiseQueue = async <T, S = unknown>(\n promiseMakers: PromiseQueuePromiseMakers<T, S>,\n options?: PromiseQueueOptions | undefined,\n): Promise<Array<T | PromiseFailResult>> => {\n const { breakTime = 0 } = options ?? {}\n const results: Array<T | PromiseFailResult> = []\n\n let context: PromiseQueueFirstPromiseMakerContext<S> | PromiseQueueRestPromiseMakerContext<T, S> = {\n index: 0,\n hasPreviousResult: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n state: undefined as unknown as S\n }\n\n const [firstPromiseMaker, ...restPromiseMakers] = promiseMakers\n const lastPromise = restPromiseMakers.reduce(async (\n accumulatedPromise, currentPromiseMaker, index\n ) => {\n return await accumulatedPromise\n .catch(promiseCatchToFailResult)\n .then(async (result) => {\n results.push(result)\n return await new Promise((resolve) => {\n setTimeout(() => {\n context = {\n ...context,\n index: index + 1,\n hasPreviousResult: true,\n previousResult: result\n }\n resolve(currentPromiseMaker(context))\n }, breakTime)\n })\n })\n }, firstPromiseMaker(context))\n\n await lastPromise\n .catch(promiseCatchToFailResult)\n .then((result) => {\n results.push(result)\n })\n\n return results\n}\n\ninterface PromiseRetryFirstPromiseMakerContext<S = unknown> {\n time: number\n hasPreviousResult: false\n state: S\n}\ninterface PromiseRetryRestPromiseMakerContext<T, S = unknown> {\n time: number\n hasPreviousResult: true\n previousResult: T | PromiseFailResult\n state: S\n}\ntype PromiseRetryPromiseMaker<T, S = unknown> = (\n context: PromiseRetryFirstPromiseMakerContext<S> | PromiseRetryRestPromiseMakerContext<T, S>\n) => Promise<T>\nexport interface PromiseRetryOptions {\n /**\n * @default 0\n */\n breakTime?: number\n /**\n * @default Infinity\n */\n maxTryTimes?: number\n}\n/**\n * Retry while the predicate indicates the result is not acceptable.\n *\n * @example\n * ```\n * let counter = 0\n * // Expect: 3\n * const example1 = await promiseRetryWhile(\n * (value) => value < 3,\n * async () => {\n * counter = counter + 1\n * return counter\n * },\n * )\n * ```\n *\n * @see {@link promiseRetryUntil}\n */\nexport const promiseRetryWhile = async <T, S = unknown>(\n predicate: (value: T) => boolean | Promise<boolean>,\n promiseMaker: PromiseRetryPromiseMaker<T, S>,\n options?: PromiseRetryOptions | undefined,\n): Promise<T | PromiseFailResult> => {\n const {\n breakTime = 0,\n maxTryTimes = Infinity,\n } = options ?? {}\n\n if (maxTryTimes < 1) {\n throw new Error(\"`maxTryTimes` must be greater than 0.\")\n }\n\n let time = 1\n // oxlint-disable-next-line no-accumulating-spread\n let context: PromiseRetryFirstPromiseMakerContext<S> | PromiseRetryRestPromiseMakerContext<T, S> = {\n time,\n hasPreviousResult: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n state: undefined as unknown as S\n }\n let result = await promiseMaker(context).catch(promiseCatchToFailResult)\n\n while (\n (isPromiseFailResult(result) || (await predicate(result)))\n && time < maxTryTimes\n ) {\n time = time + 1\n // oxlint-disable-next-line no-loop-func\n result = await new Promise<T | PromiseFailResult>((resolve) => {\n setTimeout(() => {\n context = {\n ...context,\n time,\n hasPreviousResult: true,\n previousResult: result,\n }\n resolve(promiseMaker(context))\n }, breakTime)\n }).catch(promiseCatchToFailResult)\n }\n\n return result\n}\n\n/**\n * Retry until the predicate returns true for the current result.\n *\n * @example\n * ```\n * let counter = 0\n * // Expect: 2\n * const example1 = await promiseRetryUntil(\n * (value) => value >= 2,\n * async () => {\n * counter = counter + 1\n * return counter\n * },\n * )\n * ```\n *\n * @see {@link promiseRetryWhile}\n */\nexport const promiseRetryUntil = async <T, S = unknown>(\n predicate: (value: T, time: number) => boolean | Promise<boolean>,\n promiseMaker: PromiseRetryPromiseMaker<T, S>,\n options?: PromiseRetryOptions | undefined,\n): Promise<T | PromiseFailResult> => {\n const {\n breakTime = 0,\n maxTryTimes = Infinity,\n } = options ?? {}\n\n if (maxTryTimes < 1) {\n throw new Error(\"`maxTryTimes` must be greater than 0.\")\n }\n\n let time = 1\n // oxlint-disable-next-line no-accumulating-spread\n let context: PromiseRetryFirstPromiseMakerContext<S> | PromiseRetryRestPromiseMakerContext<T, S> = {\n time,\n hasPreviousResult: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n state: undefined as unknown as S\n }\n let result = await promiseMaker(context).catch(promiseCatchToFailResult)\n\n while (\n (isPromiseFailResult(result) || !(await predicate(result, time)))\n && time < maxTryTimes\n ) {\n time = time + 1\n // oxlint-disable-next-line no-loop-func\n result = await new Promise<T | PromiseFailResult>((resolve) => {\n setTimeout(() => {\n context = {\n ...context,\n time,\n hasPreviousResult: true,\n previousResult: result\n }\n resolve(promiseMaker(context))\n }, breakTime)\n }).catch(promiseCatchToFailResult)\n }\n\n return result\n}\n\n/**\n * Start periodic asynchronous execution and return a function to stop it.\n *\n * @example\n * ```\n * const records: number[] = []\n * const stop = promiseInterval(10, async (time) => {\n * records.push(time)\n * return time\n * })\n * // Later: stop()\n * // Expect: typeof stop === \"function\"\n * const example1 = typeof stop === \"function\"\n * ```\n */\nexport const promiseInterval = <T>(\n interval: number,\n promiseMaker: (time: number) => Promise<T>,\n): (() => void) => {\n let time = 1\n\n const intervalID = setInterval(() => {\n void promiseMaker(time)\n time = time + 1\n }, interval)\n\n return () => {\n clearInterval(intervalID)\n }\n}\n\ninterface PromiseForeverFirstPromiseMakerContext<S = unknown> {\n time: number\n hasPreviousResult: false\n state: S\n}\ninterface PromiseForeverRestPromiseMakerContext<T, S = unknown> {\n time: number\n hasPreviousResult: true\n previousResult: T | PromiseFailResult\n state: S\n}\ntype PromiseForeverPromiseMaker<T, S = unknown> = (\n context: PromiseForeverFirstPromiseMakerContext<S> | PromiseForeverRestPromiseMakerContext<T, S>\n) => Promise<T>\nexport interface PromiseForeverOptions {\n /**\n * @default 0\n */\n breakTime?: number | undefined\n onRejected?: ((time: number, result: PromiseFailResult) => void) | undefined\n}\n/**\n * Continuously execute an async maker forever with optional delay and rejection hook.\n *\n * @example\n * ```\n * let times = 0\n * promiseForever(async () => {\n * times = times + 1\n * return times\n * }, { breakTime: 0 })\n * // Expect: no return value\n * const example1 = promiseForever(async () => 1)\n * ```\n */\nexport const promiseForever = <T, S = unknown>(\n promiseMaker: PromiseForeverPromiseMaker<T, S>,\n options?: PromiseForeverOptions | undefined,\n): void => {\n const {\n breakTime = 0,\n onRejected,\n } = options ?? {}\n\n let time = 1\n let context: PromiseForeverFirstPromiseMakerContext<S> | PromiseForeverRestPromiseMakerContext<T, S> = {\n time,\n hasPreviousResult: false,\n // oxlint-disable-next-line no-unsafe-type-assertion\n state: undefined as unknown as S\n }\n\n const handlePromise = (result: T | PromiseFailResult): void => {\n time = time + 1\n setTimeout(() => {\n context = {\n ...context,\n time,\n hasPreviousResult: true,\n previousResult: result\n }\n runPromise(context)\n }, breakTime)\n }\n const runPromise = (\n context: PromiseForeverFirstPromiseMakerContext<S> | PromiseForeverRestPromiseMakerContext<T, S>\n ): void => {\n void promiseMaker(context)\n // oxlint-disable-next-line prefer-await-to-callbacks\n .catch((error: unknown) => {\n const failedResult = promiseCatchToFailResult(error)\n if (onRejected !== undefined) {\n try {\n onRejected(time, failedResult)\n }\n catch {\n // omit exceptions from execution of `onRejected`\n }\n }\n else {\n console.log(\"❌ [promiseForever] unexcepted error occured:\", failedResult)\n }\n return failedResult\n })\n .then(result => handlePromise(result))\n }\n\n runPromise(context)\n}\n",
19
19
  "import type { ReadableStreamController, ReadableStreamReadResult } from \"node:stream/web\"\n\nimport { ReadableStream } from \"node:stream/web\"\n\n/**\n * 从数组创建一个 ReadableStream。\n */\nexport const streamFromArray = <T>(values: T[]): ReadableStream<T> => {\n const stream = new ReadableStream<T>({\n start(controller): void {\n for (const value of values) {\n controller.enqueue(value)\n }\n controller.close()\n },\n })\n return stream\n}\n\nexport interface StreamConsumeInSyncMacroTaskOptions<T> {\n readableStream: ReadableStream<T>\n onValue?: ((chunk: T) => (void | Promise<void>)) | undefined\n onDone?: (() => (void | Promise<void>)) | undefined\n onError?: ((error: Error) => (void | Promise<void>)) | undefined\n}\n/**\n * 在同步宏任务中完成 ReadableStream 的消费。\n */\nexport const streamConsumeInSyncMacroTask = async <T>(\n options: StreamConsumeInSyncMacroTaskOptions<T>,\n): Promise<void> => {\n const { readableStream, onValue, onDone, onError } = options\n\n try {\n for await (const chunk of readableStream) {\n await onValue?.(chunk)\n }\n await onDone?.()\n }\n catch (exception) {\n console.error(`Error reading stream: ${String(exception)}`)\n await onError?.(new Error(`Error reading stream: ${String(exception)}`))\n }\n}\n\nexport interface StreamConsumeInAsyncMacroTaskOptions<T> {\n readableStream: ReadableStream<T>\n onValue?: ((chunk: T) => (void | Promise<void>)) | undefined\n onDone?: (() => (void | Promise<void>)) | undefined\n onError?: ((error: Error) => (void | Promise<void>)) | undefined\n}\n/**\n * 在异步宏任务中完成 ReadableStream 的消费。\n */\nexport const streamConsumeInAsyncMacroTask = <T>(\n options: StreamConsumeInAsyncMacroTaskOptions<T>,\n): void => {\n const { readableStream, onValue, onDone, onError } = options\n\n const reader = readableStream.getReader()\n const read = (): void => {\n setTimeout(() => {\n void reader.read()\n .then(async (chunk) => {\n const { done, value } = chunk\n if (done === true) {\n await onDone?.()\n return\n }\n await onValue?.(value)\n read()\n })\n .catch(async (reason: unknown) => {\n await onError?.(new Error(String(reason)))\n })\n }, 0)\n }\n read()\n}\n\nexport interface StreamTransformInAsyncMacroTaskOptions<T, U> {\n readableStream?: ReadableStream<T> | undefined\n reader?: ReadableStreamDefaultReader<T> | undefined\n onChunk?: ((chunk: ReadableStreamReadResult<T>, controller: ReadableStreamDefaultController<U>) => (void | Promise<void>)) | undefined\n onError?: ((error: Error) => (void | Error | Promise<void | Error>)) | undefined\n}\n/**\n * 在宏任务队列中完成 ReadableStream 到另一个 ReadableStream 的转换。\n */\nexport const streamTransformInAsyncMacroTask = <T, U>(\n options: StreamTransformInAsyncMacroTaskOptions<T, U>,\n): ReadableStream<U> => {\n const { readableStream, reader, onChunk, onError } = options\n\n if (reader === undefined && readableStream === undefined) {\n throw new Error(\"Either readableStream or reader must be provided\")\n }\n\n const preparedReader = reader ?? readableStream!.getReader()\n const stream = new ReadableStream<U>({\n start(controller): void {\n const read = (): void => {\n setTimeout(() => {\n void preparedReader.read()\n .then(async (chunk) => {\n let shouldContinue = true\n const proxyController: ReadableStreamController<U> = {\n // oxlint-disable-next-line no-misused-spread\n ...controller,\n enqueue: (chunk: U): void => {\n controller.enqueue(chunk)\n shouldContinue = true\n },\n close: (): void => {\n controller.close()\n shouldContinue = false\n },\n error: (error: Error): void => {\n controller.error(error)\n shouldContinue = false\n },\n }\n await onChunk?.(chunk, proxyController)\n if (shouldContinue === true) {\n read()\n }\n })\n .catch(async (reason: unknown) => {\n const error = new Error(String(reason))\n const refinedError = await onError?.(error)\n controller.error(refinedError ?? error)\n })\n }, 0)\n }\n read()\n },\n })\n\n return stream\n}\n",
20
+ "/**\n * @see {@link https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt#%E5%9C%A8_json_%E4%B8%AD%E4%BD%BF%E7%94%A8}\n */\nexport const enhanceBigInt = (): void => {\n // @ts-expect-error - extend BigInt toJSON\n // oxlint-disable-next-line no-extend-native\n BigInt.prototype.toJSON = function toJSON(): number {\n return Number(this.toString())\n }\n}\n",
20
21
  "export const FLAG_DICT = {\n /**\n * 当前节点没有任何特性。\n */\n None: 0,\n /**\n * 当前节点的值是可变的。值的变化可以通过此节点继续传递。\n */\n Mutable: 1,\n /**\n * 当前节点的值可能发生了变化,待确定。\n */\n Pending: 2,\n /**\n * 当前节点的值发生了变化。\n */\n Dirty: 4,\n /**\n * 当前节点正在进行观察。当上游节点的值发生变化时应该通知当前节点。\n */\n Watching: 8,\n\n /**\n * 当前节点正在进行依赖收集。\n *\n * 目前只考虑到以下用途:\n *\n * 1. 用于防止在某节点依赖收集过程中依赖发生变化导致该节点重复运行。\n * ```\n * const count = signal(0);\n * effect(() => {\n * count(count() + 1);\n * })\n * ```\n */\n Tracking: 16,\n /**\n * 当前节点正在进行依赖收集,且正在尝试复用现存连接。\n */\n TrackingReusing: 32,\n} as const;\n\nexport const hasMutable = (flags: number): boolean => {\n return (flags & FLAG_DICT.Mutable) !== 0;\n}\nexport const setMutable = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Mutable : (flags | FLAG_DICT.Mutable);\n}\nexport const unsetMutable = (flags: number): number => {\n return flags & ~FLAG_DICT.Mutable;\n}\nexport const toggleMutable = (flags: number): number => {\n return flags ^ FLAG_DICT.Mutable;\n}\nexport const hasDirty = (flags: number): boolean => {\n return (flags & FLAG_DICT.Dirty) !== 0;\n}\nexport const setDirty = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Dirty : (flags | FLAG_DICT.Dirty);\n}\nexport const unsetDirty = (flags: number): number => {\n return flags & ~FLAG_DICT.Dirty;\n}\nexport const toggleDirty = (flags: number): number => {\n return flags ^ FLAG_DICT.Dirty;\n}\nexport const hasPending = (flags: number): boolean => {\n return (flags & FLAG_DICT.Pending) !== 0;\n}\nexport const setPending = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Pending : (flags | FLAG_DICT.Pending);\n}\nexport const unsetPending = (flags: number): number => {\n return flags & ~FLAG_DICT.Pending;\n}\nexport const togglePending = (flags: number): number => {\n return flags ^ FLAG_DICT.Pending;\n}\nexport const hasWatching = (flags: number): boolean => {\n return (flags & FLAG_DICT.Watching) !== 0;\n}\nexport const setWatching = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Watching : (flags | FLAG_DICT.Watching);\n}\nexport const unsetWatching = (flags: number): number => {\n return flags & ~FLAG_DICT.Watching;\n}\nexport const toggleWatching = (flags: number): number => {\n return flags ^ FLAG_DICT.Watching;\n}\nexport const hasTracking = (flags: number): boolean => {\n return (flags & FLAG_DICT.Tracking) !== 0;\n}\nexport const setTracking = (flags?: number | undefined): number => {\n return flags === undefined ? FLAG_DICT.Tracking : (flags | FLAG_DICT.Tracking);\n}\nexport const unsetTracking = (flags: number): number => {\n return flags & ~FLAG_DICT.Tracking;\n}\nexport const toggleTracking = (flags: number): number => {\n return flags ^ FLAG_DICT.Tracking;\n}\nexport const hasTrackingReusing = (flags: number): boolean => {\n return (flags & FLAG_DICT.TrackingReusing) !== 0;\n}\nexport const setTrackingReusing = (flags?: number): number => {\n return flags === undefined ? FLAG_DICT.TrackingReusing : (flags | FLAG_DICT.TrackingReusing);\n}\nexport const unsetTrackingReusing = (flags: number): number => {\n return flags & ~FLAG_DICT.TrackingReusing;\n}\nexport const toggleTrackingReusing = (flags: number): number => {\n return flags ^ FLAG_DICT.TrackingReusing;\n}\n\nexport class Flags {\n private flags: number;\n\n constructor() {\n this.flags = FLAG_DICT.None;\n }\n\n static clone(flags: Flags): Flags {\n const newFlags = new Flags();\n newFlags.set(flags.get());\n return newFlags;\n }\n\n get(): number {\n return this.flags;\n }\n\n set(flags: number): this {\n this.flags = flags;\n return this;\n }\n\n clear(): this {\n this.flags = FLAG_DICT.None;\n return this;\n }\n\n hasMutable(): boolean {\n return hasMutable(this.flags);\n }\n setMutable(): this {\n this.flags = setMutable(this.flags);\n return this;\n }\n unsetMutable(): this {\n this.flags = unsetMutable(this.flags);\n return this;\n }\n toggleMutable(): this {\n this.flags = toggleMutable(this.flags);\n return this;\n }\n\n hasDirty(): boolean {\n return hasDirty(this.flags);\n }\n setDirty(): this {\n this.flags = setDirty(this.flags);\n return this;\n }\n unsetDirty(): this {\n this.flags = unsetDirty(this.flags);\n return this;\n }\n toggleDirty(): this {\n this.flags = toggleDirty(this.flags);\n return this;\n }\n\n hasPending(): boolean {\n return hasPending(this.flags);\n }\n setPending(): this {\n this.flags = setPending(this.flags);\n return this;\n }\n unsetPending(): this {\n this.flags = unsetPending(this.flags);\n return this;\n }\n togglePending(): this {\n this.flags = togglePending(this.flags);\n return this;\n }\n\n hasWatching(): boolean {\n return hasWatching(this.flags);\n }\n setWatching(): this {\n this.flags = setWatching(this.flags);\n return this;\n }\n unsetWatching(): this {\n this.flags = unsetWatching(this.flags);\n return this;\n }\n toggleWatching(): this {\n this.flags = toggleWatching(this.flags);\n return this;\n }\n\n hasTracking(): boolean {\n return hasTracking(this.flags);\n }\n setTracking(): this {\n this.flags = setTracking(this.flags);\n return this;\n }\n unsetTracking(): this {\n this.flags = unsetTracking(this.flags);\n return this;\n }\n toggleTracking(): this {\n this.flags = toggleTracking(this.flags);\n return this;\n }\n\n hasTrackingReusing(): boolean {\n return hasTrackingReusing(this.flags);\n }\n setTrackingReusing(): this {\n this.flags = setTrackingReusing(this.flags);\n return this;\n }\n unsetTrackingReusing(): this {\n this.flags = unsetTrackingReusing(this.flags);\n return this;\n }\n toggleTrackingReusing(): this {\n this.flags = toggleTrackingReusing(this.flags);\n return this;\n }\n\n toString(): string {\n if (this.flags === FLAG_DICT.None) {\n return 'Flags(None)';\n }\n\n const activeFlags: string[] = [];\n\n if (this.hasMutable()) {\n activeFlags.push('Mutable')\n };\n if (this.hasPending()) {\n activeFlags.push('Pending')\n };\n if (this.hasDirty()) {\n activeFlags.push('Dirty')\n };\n if (this.hasWatching()) {\n activeFlags.push('Watching')\n };\n if (this.hasTracking()) {\n activeFlags.push('Tracking')\n };\n if (this.hasTrackingReusing()) {\n activeFlags.push('TrackingReusing')\n };\n\n return `Flags(${activeFlags.join(' | ')})`;\n }\n}\n\nexport const flags = (flags?: number | undefined): Flags => {\n const f = new Flags();\n if (flags !== undefined) {\n f.set(flags);\n }\n return f;\n}\n",
21
22
  "import type { Flags } from './flags.ts'\n\nexport interface Node {\n /**\n * 当前节点的上游连接链中的第一个连接。\n */\n headDepLink?: Link | undefined;\n /**\n * 当前节点的上游连接链中的最后一个连接。\n */\n tailDepLink?: Link | undefined;\n\n /**\n * 当前节点的下游连接链中的第一个连接。\n */\n headSubLink?: Link | undefined;\n /**\n * 当前节点的下游连接链中的最后一个连接。\n */\n tailSubLink?: Link | undefined;\n\n /**\n * 当前节点的标记。\n */\n flags: Flags;\n}\n/**\n * 连接用于表示某个节点(下游节点)依赖了某个节点(上游节点)。\n *\n * 多个连接连在一起形成连接链,连接链只有两种情况:\n *\n * 1. 下游连接链:链中所有连接的上游节点相同,通过该链可以找到该上游节点的所有下游节点。\n * 2. 上游连接链:链中所有连接的下游节点相同,通过该链可以找到该下游节点的所有上游节点。\n */\nexport interface Link {\n /**\n * 连接中的上游节点。\n */\n dep: Node;\n /**\n * 连接中的上游节点的下游连接链中的上一个连接。(上一个下游连接)\n */\n prevSubLink?: Link | undefined;\n /**\n * 连接中的上游节点的下游连接链中的下一个连接。(下一个下游连接)\n */\n nextSubLink?: Link | undefined;\n\n /**\n * 连接中的下游节点。\n */\n sub: Node;\n /**\n * 连接中的下游节点的上游连接链中的上一个连接。(上一个上游连接)\n */\n prevDepLink?: Link | undefined;\n /**\n * 连接中的下游节点的上游连接链中的下一个连接。(下一个上游连接)\n */\n nextDepLink?: Link | undefined;\n}\n\nexport interface CreateReactiveSystemOptions {\n /**\n * 当节点的上游节点发生变化时此回调会执行。\n */\n onDepChanged?: (sub: Node) => void;\n /**\n * 当节点的下游节点发生变化时此回调会执行。\n */\n onSubChanged?: (dep: Node) => void;\n /**\n * 当节点拥有第一个上游节点时此回调会执行。\n */\n onHasDep?: (sub: Node, dep: Node) => void;\n /**\n * 当节点不再拥有任何上游节点时此回调会执行。\n */\n onNoDep?: (sub: Node, dep: Node) => void;\n /**\n * 当节点拥有第一个下游节点时此回调会执行。\n */\n onHasSub?: (dep: Node, sub: Node) => void;\n /**\n * 当节点不再拥有任何下游节点时此回调会执行。\n */\n onNoSub?: (dep: Node, sub: Node) => void;\n\n /**\n * 当节点的值需要更新时此回调会执行,返回值表示更新前后值是否变化。\n */\n update(sub: Node): boolean;\n /**\n * 当节点的上游节点的值发生变化后此回调会执行。\n *\n * 注意:只有包含 Watching 标记的节点会触发此方法。\n */\n notify(node: Node): void;\n}\nexport interface ReactiveSystem {\n /**\n * 获取节点的上游连接。\n */\n getDepLinksOfNode(node: Node): Link[];\n /**\n * 获取节点的下游连接。\n */\n getSubLinksOfNode(node: Node): Link[];\n /**\n * 获取节点的上游节点。\n */\n getDepsOfNode(node: Node): Node[];\n /**\n * 获取节点的下游节点。\n */\n getSubsOfNode(node: Node): Node[];\n /**\n * 判断连接是否是节点的上游连接。\n */\n isDepLinkOfNode(link: Link, node: Node): boolean;\n /**\n * 判断连接是否是节点的下游连接。\n */\n isSubLinkOfNode(link: Link, node: Node): boolean;\n /**\n * 判断节点是否是目标节点的上游节点。\n */\n isDepOfNode(node: Node, targetNode: Node): boolean;\n /**\n * 判断节点是否是目标节点的下游节点。\n */\n isSubOfNode(node: Node, targetNode: Node): boolean;\n /**\n * 获取两个节点之间的连接(从上游节点的下游连接链中查找)。\n */\n getLinkBetweenFromDep(dep: Node, sub: Node): Link | undefined;\n /**\n * 获取两个节点之间的连接(从下游节点的上游连接链中查找)。\n */\n getLinkBetweenFromSub(dep: Node, sub: Node): Link | undefined;\n /**\n * 判断两个节点之间是否存在连接(从上游节点的下游连接链中查找)。\n */\n hasLinkBetweenFromDep(dep: Node, sub: Node): boolean;\n /**\n * 判断两个节点之间是否存在连接(从下游节点的上游连接链中查找)。\n */\n hasLinkBetweenFromSub(dep: Node, sub: Node): boolean;\n /**\n * 为两个节点建立连接。\n */\n addLinkBetween(dep: Node, sub: Node): Link;\n /**\n * 为两个节点移除连接(从上游节点的下游连接链中查找)。\n */\n removeLinkBetweenFromDep(dep: Node, sub: Node): void;\n /**\n * 为两个节点移除连接(从下游节点的上游连接链中查找)。\n */\n removeLinkBetweenFromSub(dep: Node, sub: Node): void;\n /**\n * 移除连接。\n */\n removeLink(link: Link): void;\n /**\n * 为节点移除所有上游连接。\n */\n removeAllDepLinksOfNode(node: Node): Node[];\n /**\n * 为节点移除所有下游连接。\n */\n removeAllSubLinksOfNode(node: Node): Node[];\n\n /**\n * 获取当前正在进行依赖收集的节点。\n */\n getActiveNodeAsSub(): Node | undefined;\n /**\n * 设置当前正在进行依赖收集的节点。\n */\n setActiveNodeAsSub(nodeAsSub: Node | undefined): void;\n /**\n * 设置当前正在进行依赖收集的节点为空。\n */\n setNoActiveNodeAsSub(): undefined;\n /**\n * 重置当前正在进行依赖收集的节点。\n */\n resetActiveNodeAsSub(): void;\n /**\n * 将指定节点作为当前正在进行依赖收集的节点执行指定函数。\n */\n withActiveNodeAsSub<T>(nodeAsSub: Node | undefined, fn: () => T): T;\n /**\n * 以无当前正在进行依赖收集的节点的状态执行指定函数。\n */\n withoutActiveNodeAsSub<T>(fn: () => T): T;\n /**\n * 断言当前没有正在进行依赖收集的节点。\n */\n assertWithoutActiveNodeAsSub(): void;\n /**\n * 开始对节点(作为下游节点)进行依赖收集。\n */\n startTracking(node: Node): void;\n /**\n * 结束对节点(作为下游节点)进行依赖收集。\n */\n endTracking(node: Node): void;\n /**\n * 对节点(作为下游节点)进行依赖收集。\n */\n withTracking<T>(node: Node, fn: () => T): T;\n /**\n * 以无当前正在进行依赖收集的节点的状态执行指定函数。\n */\n withoutTracking<T>(fn: () => T): T;\n /**\n * 断言当前没有正在进行依赖收集的节点。\n */\n assertWithoutTracking(): void;\n /**\n * 为两个节点建立连接(依赖收集优化版)。\n */\n addLinkBetweenOptimizedForTracking(dep: Node, sub: Node): Link;\n /**\n * 将节点作为当前正在进行依赖收集的节点的上游节点。\n */\n track(node: Node): void;\n /**\n * 将节点作为当前正在进行依赖收集的节点的上游节点。\n */\n trackNearestMutableOrWatching(node: Node): void;\n\n /**\n * 当节点的值发生变化后,调用此方法更新直接下游节点的标记。\n */\n shallowPropagate(node: Node): void;\n /**\n * 当节点的值发生变化后,调用此方法更新所有下游节点的标记。\n */\n deeeeepPropagate(node: Node): void;\n /**\n * 解决节点的 Pending 标记。\n */\n resolvePending(node: Node): void;\n}\nexport const createReactiveSystem = (options: CreateReactiveSystemOptions): ReactiveSystem => {\n const {\n onDepChanged,\n onSubChanged,\n onHasDep,\n onNoDep,\n onHasSub,\n onNoSub,\n update,\n notify\n } = options;\n\n /**\n * 获取目标节点的所有上游连接。\n *\n * 依赖收集过程中会尝试复用现存连接,该机制会导致在未完全完成依赖收集前,连接链中可能出现\n * 未经验证的连接。此方法只会返回经过验证的连接。\n */\n const getDepLinksOfNode = (node: Node): Link[] => {\n const depLinks: Link[] = [];\n let currentDepLink = node.headDepLink;\n const tailDepLink = node.tailDepLink;\n while (currentDepLink !== undefined) {\n depLinks.push(currentDepLink);\n const isValidLastDepLink = currentDepLink === tailDepLink;\n if (isValidLastDepLink === true) {\n break;\n } else {\n currentDepLink = currentDepLink.nextDepLink;\n }\n }\n return depLinks;\n }\n\n /**\n * 获取目标节点的所有下游连接。\n *\n * 依赖收集过程中会尝试复用现存连接,该机制会导致在未完全完成依赖收集前,连接链中可能出现\n * 未经验证的连接。此方法只会返回经过验证的连接。\n */\n const getSubLinksOfNode = (node: Node): Link[] => {\n const subLinks: Link[] = [];\n let currentSubLink = node.headSubLink;\n const tailSubLink = node.tailSubLink;\n while (currentSubLink !== undefined) {\n subLinks.push(currentSubLink);\n const isValidLastSubLink = currentSubLink === tailSubLink;\n if (isValidLastSubLink === true) {\n break;\n } else {\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n return subLinks;\n }\n\n const getDepsOfNode = (node: Node): Node[] => {\n const depLinks = getDepLinksOfNode(node);\n const deps = depLinks.map(link => link.dep);\n return deps;\n }\n\n const getSubsOfNode = (node: Node): Node[] => {\n const subLinks = getSubLinksOfNode(node);\n const subs = subLinks.map(link => link.sub);\n return subs;\n }\n\n const isDepLinkOfNode = (link: Link, node: Node): boolean => {\n let currentDepLink = node.headDepLink;\n const tailDepLink = node.tailDepLink;\n while (currentDepLink !== undefined) {\n if (currentDepLink === link) {\n return true;\n }\n const isValidLastDepLink = currentDepLink === tailDepLink;\n if (isValidLastDepLink === true) {\n break;\n } else {\n currentDepLink = currentDepLink.nextDepLink;\n }\n }\n return false;\n }\n\n const isSubLinkOfNode = (link: Link, node: Node): boolean => {\n let currentSubLink = node.headSubLink;\n const tailSubLink = node.tailSubLink;\n while (currentSubLink !== undefined) {\n if (currentSubLink === link) {\n return true;\n }\n const isValidLastSubLink = currentSubLink === tailSubLink;\n if (isValidLastSubLink === true) {\n break;\n } else {\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n return false;\n }\n\n const isDepOfNode = (node: Node, targetNode: Node): boolean => {\n let currentDepLink = targetNode.headDepLink;\n const tailDepLink = targetNode.tailDepLink;\n while (currentDepLink !== undefined) {\n if (currentDepLink.dep === node) {\n return true;\n }\n const isValidLastDepLink = currentDepLink === tailDepLink;\n if (isValidLastDepLink === true) {\n break;\n } else {\n currentDepLink = currentDepLink.nextDepLink;\n }\n }\n return false;\n }\n\n const isSubOfNode = (node: Node, targetNode: Node): boolean => {\n let currentSubLink = targetNode.headSubLink;\n const tailSubLink = targetNode.tailSubLink;\n while (currentSubLink !== undefined) {\n if (currentSubLink.sub === node) {\n return true;\n }\n const isValidLastSubLink = currentSubLink === tailSubLink;\n if (isValidLastSubLink === true) {\n break;\n } else {\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n return false;\n }\n\n const getLinkBetweenFromDep = (dep: Node, sub: Node): Link | undefined => {\n let currentSubLink = dep.headSubLink;\n const tailSubLink = dep.tailSubLink;\n while (currentSubLink !== undefined) {\n if (currentSubLink.sub === sub) {\n return currentSubLink;\n }\n const isValidLastSubLink = currentSubLink === tailSubLink;\n if (isValidLastSubLink === true) {\n break;\n } else {\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n return undefined;\n }\n\n const getLinkBetweenFromSub = (dep: Node, sub: Node): Link | undefined => {\n let currentDepLink = sub.headDepLink;\n const tailDepLink = sub.tailDepLink;\n while (currentDepLink !== undefined) {\n if (currentDepLink.dep === dep) {\n return currentDepLink;\n }\n const isValidLastDepLink = currentDepLink === tailDepLink;\n if (isValidLastDepLink === true) {\n break;\n } else {\n currentDepLink = currentDepLink.nextDepLink;\n }\n }\n return undefined;\n }\n\n const hasLinkBetweenFromDep = (dep: Node, sub: Node): boolean => {\n const link = getLinkBetweenFromDep(dep, sub);\n return link !== undefined;\n }\n\n const hasLinkBetweenFromSub = (dep: Node, sub: Node): boolean => {\n const link = getLinkBetweenFromSub(dep, sub);\n return link !== undefined;\n }\n\n const addLinkBetween = (dep: Node, sub: Node): Link => {\n /**\n * 检查是否存在重复连接。\n */\n const existLink = getLinkBetweenFromSub(dep, sub);\n if (existLink !== undefined) {\n return existLink;\n }\n\n /**\n * 建立新连接。\n */\n const newLink: Link = {\n dep,\n prevSubLink: undefined,\n nextSubLink: undefined,\n\n sub,\n prevDepLink: undefined,\n nextDepLink: undefined,\n };\n\n const tailDepLinkOfSub = sub.tailDepLink;\n if (tailDepLinkOfSub !== undefined) {\n tailDepLinkOfSub.nextDepLink = newLink;\n newLink.prevDepLink = tailDepLinkOfSub;\n } else {\n sub.headDepLink = newLink;\n }\n sub.tailDepLink = newLink;\n\n const tailSubLinkOfDep = dep.tailSubLink;\n if (tailSubLinkOfDep !== undefined) {\n tailSubLinkOfDep.nextSubLink = newLink;\n newLink.prevSubLink = tailSubLinkOfDep;\n } else {\n dep.headSubLink = newLink;\n }\n dep.tailSubLink = newLink;\n\n /**\n * 连接全部更新完成之后,触发回调,优先通知上游节点。\n */\n onSubChanged?.(dep);\n const isFirstSub = tailSubLinkOfDep === undefined;\n if (isFirstSub === true) {\n onHasSub?.(dep, sub);\n }\n onDepChanged?.(sub);\n const isFirstDep = tailDepLinkOfSub === undefined;\n if (isFirstDep === true) {\n onHasDep?.(sub, dep);\n }\n\n return newLink;\n }\n\n const removeLinkBetweenFromDep = (dep: Node, sub: Node): void => {\n const linkFromDep = getLinkBetweenFromDep(dep, sub);\n if (linkFromDep !== undefined) {\n removeLink(linkFromDep);\n }\n }\n\n const removeLinkBetweenFromSub = (dep: Node, sub: Node): void => {\n const linkFromSub = getLinkBetweenFromSub(dep, sub);\n if (linkFromSub !== undefined) {\n removeLink(linkFromSub);\n }\n }\n\n const removeLink = (link: Link): void => {\n const prevDepLink = link.prevDepLink;\n const dep = link.dep;\n const nextDepLink = link.nextDepLink;\n const prevSubLink = link.prevSubLink;\n const sub = link.sub;\n const nextSubLink = link.nextSubLink;\n\n /**\n * 处理上游连接链。\n */\n\n if (nextDepLink !== undefined) {\n // 如果当前连接的下一个连接存在,则将当前连接的下一个连接的上一个连接指向当前连接的上一个连接\n nextDepLink.prevDepLink = prevDepLink;\n } else {\n // 如果当前连接的下一个连接不存在,则将当前连接的上一个连接作为最后一个连接\n sub.tailDepLink = prevDepLink;\n }\n if (prevDepLink !== undefined) {\n // 如果当前连接的上一个连接存在,则将当前连接的上一个连接的下一个连接指向当前连接的下一个连接\n prevDepLink.nextDepLink = nextDepLink;\n } else {\n // 如果当前连接的上一个连接不存在,则将当前连接的下一个连接作为第一个连接\n sub.headDepLink = nextDepLink;\n }\n\n /**\n * 处理下游连接链。\n */\n\n if (nextSubLink !== undefined) {\n // 如果当前连接的下一个连接存在,则将当前连接的下一个连接的上一个连接指向当前连接的上一个连接\n nextSubLink.prevSubLink = prevSubLink;\n } else {\n // 如果当前连接的下一个连接不存在,则将当前连接的上一个连接作为最后一个连接\n dep.tailSubLink = prevSubLink;\n }\n if (prevSubLink !== undefined) {\n // 如果当前连接的上一个连接存在,则将当前连接的上一个连接的下一个连接指向当前连接的下一个连接\n prevSubLink.nextSubLink = nextSubLink;\n } else {\n // 如果当前连接的上一个连接不存在,则将当前连接的下一个连接作为第一个连接\n dep.headSubLink = nextSubLink;\n }\n\n /**\n * 连接全部更新完成之后,触发回调,优先通知上游节点。\n */\n onSubChanged?.(dep);\n if (dep.headSubLink === undefined && dep.tailSubLink === undefined) {\n onNoSub?.(dep, sub);\n }\n onDepChanged?.(sub);\n if (sub.headDepLink === undefined && sub.tailDepLink === undefined) {\n onNoDep?.(sub, dep);\n }\n\n /**\n * 彻底断引用,防止内存泄漏。\n */\n link.prevDepLink = undefined;\n // oxlint-disable-next-line no-unsafe-type-assertion\n link.dep = undefined as unknown as Node; // type cast\n link.nextDepLink = undefined;\n link.prevSubLink = undefined;\n // oxlint-disable-next-line no-unsafe-type-assertion\n link.sub = undefined as unknown as Node; // type cast\n link.nextSubLink = undefined;\n }\n\n const removeAllDepLinksOfNode = (node: Node): Node[] => {\n const depNodes = [];\n let currentDepLink = node.headDepLink;\n while (currentDepLink !== undefined) {\n depNodes.push(currentDepLink.dep);\n const nextDepLink = currentDepLink.nextDepLink;\n removeLink(currentDepLink);\n currentDepLink = nextDepLink;\n }\n return depNodes;\n }\n\n const removeAllSubLinksOfNode = (node: Node): Node[] => {\n const subNodes = [];\n let currentSubLink = node.headSubLink;\n while (currentSubLink !== undefined) {\n subNodes.push(currentSubLink.sub);\n const nextSubLink = currentSubLink.nextSubLink;\n removeLink(currentSubLink);\n currentSubLink = nextSubLink;\n }\n return subNodes;\n }\n\n let prevActiveNodeAsSubStack: Array<Node | undefined> = [];\n let activeNodeAsSub: Node | undefined = undefined;\n const getActiveNodeAsSub = (): Node | undefined => {\n return activeNodeAsSub;\n }\n const setActiveNodeAsSub = (nodeAsSub: Node | undefined): Node | undefined => {\n prevActiveNodeAsSubStack.push(activeNodeAsSub);\n activeNodeAsSub = nodeAsSub;\n return activeNodeAsSub;\n }\n const setNoActiveNodeAsSub = (): undefined => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return setActiveNodeAsSub(undefined) as undefined;\n }\n const resetActiveNodeAsSub = (): Node | undefined => {\n activeNodeAsSub = prevActiveNodeAsSubStack.pop();\n return activeNodeAsSub;\n }\n const withActiveNodeAsSub = <T>(nodeAsSub: Node | undefined, fn: () => T): T => {\n setActiveNodeAsSub(nodeAsSub);\n try {\n return fn();\n } finally {\n resetActiveNodeAsSub();\n }\n }\n const withoutActiveNodeAsSub = <T>(fn: () => T): T => {\n return withActiveNodeAsSub(undefined, fn);\n }\n const assertWithoutActiveNodeAsSub = (): void => {\n const currentActiveNodeAsSub = getActiveNodeAsSub();\n if (currentActiveNodeAsSub !== undefined) {\n throw new Error(`Expected no active node as sub, but got one.`);\n }\n }\n\n const startTracking = (nodeAsSub: Node): void => {\n setActiveNodeAsSub(nodeAsSub);\n\n const flags = nodeAsSub.flags;\n flags.unsetPending().unsetDirty().setTracking();\n }\n const endTracking = (nodeAsSub: Node): void => {\n const flags = nodeAsSub.flags;\n if (flags.hasTrackingReusing() === true) {\n const firstRedundantDepLink = nodeAsSub?.tailDepLink?.nextDepLink;\n if (firstRedundantDepLink !== undefined) {\n let toRemove: Link | undefined = firstRedundantDepLink;\n while (toRemove !== undefined) {\n const nextToRemove: Link | undefined = toRemove.nextDepLink;\n removeLink(toRemove);\n toRemove = nextToRemove;\n }\n }\n }\n flags.unsetTrackingReusing().unsetTracking();\n\n resetActiveNodeAsSub();\n }\n const withTracking = <T>(node: Node, fn: () => T): T => {\n startTracking(node);\n try {\n return fn();\n } finally {\n endTracking(node);\n }\n }\n const withoutTracking = <T>(fn: () => T): T => {\n return withoutActiveNodeAsSub(() => {\n return fn();\n });\n }\n const assertWithoutTracking = (): void => {\n try {\n assertWithoutActiveNodeAsSub();\n } catch {\n throw new Error(`Expected no active node as sub for tracking, but got one.`);\n }\n }\n /**\n * 依赖收集的目标是:在完成一次依赖收集之后,对于所有在依赖收集执行过程中被访问过的节点(上游节点),\n * 都与进行依赖收集的节点(下游节点)建立且仅建立一个连接。\n */\n const addLinkBetweenOptimizedForTracking = (dep: Node, sub: Node): Link => {\n let existingDepLinkToCompare: Link | undefined;\n\n const subFlags = sub.flags;\n if (subFlags.hasTracking() === true && subFlags.hasTrackingReusing() === false) {\n subFlags.setTrackingReusing();\n sub.tailDepLink = sub.headDepLink;\n existingDepLinkToCompare = sub.tailDepLink;\n } else {\n existingDepLinkToCompare = sub.tailDepLink?.nextDepLink;\n }\n\n /**\n * 检查是否可以复用现存连接。\n */\n\n if (existingDepLinkToCompare !== undefined && existingDepLinkToCompare.dep === dep) {\n // 如果可以,则复用该连接\n sub.tailDepLink = existingDepLinkToCompare;\n // 触发回调\n onDepChanged?.(sub);\n return existingDepLinkToCompare;\n } else {\n // 否则,建立新连接\n const newLink = addLinkBetween(dep, sub);\n return newLink;\n }\n }\n const track = (node: Node): void => {\n let targetSub = getActiveNodeAsSub();\n if (targetSub !== undefined) {\n addLinkBetweenOptimizedForTracking(node, targetSub);\n }\n }\n const trackNearestMutableOrWatching = (node: Node): void => {\n let targetSub = getActiveNodeAsSub();\n while (targetSub !== undefined) {\n const flags = targetSub.flags;\n if (flags.hasMutable() === true || flags.hasWatching() === true) {\n addLinkBetweenOptimizedForTracking(node, targetSub);\n break;\n }\n targetSub = targetSub.headSubLink?.sub;\n }\n }\n\n const shallowPropagate = (node: Node): void => {\n // 从头到尾遍历目标节点下游连接链中的所有下游节点,更新其标记。\n\n let currentSubLink: Link | undefined = node.headSubLink;\n while (currentSubLink !== undefined) {\n const sub = currentSubLink.sub;\n const flags = sub.flags;\n let isChangeToDirty = false;\n\n if (flags.hasPending() === true && flags.hasDirty() === false) {\n // 如果包含 Pending 标记,且不包含 Dirty 标记,为其添加 Dirty 标记,移除 Pending 标记\n flags.setDirty().unsetPending();\n isChangeToDirty = true;\n } else {\n // 如果是其它情况,则处理下一个连接\n currentSubLink = currentSubLink.nextSubLink;\n continue;\n }\n\n if (isChangeToDirty === true) {\n // 如果检查过程中被标记为 Dirty,则酌情触发 notify 回调\n const shouldNotify = flags.hasWatching() === true && flags.hasTracking() === false;\n if (shouldNotify === true) {\n notify(sub);\n }\n }\n\n // 当前连接处理完成,处理下一个连接\n currentSubLink = currentSubLink.nextSubLink;\n }\n }\n\n interface InternalStack<T> {\n value: T;\n prev: InternalStack<T> | undefined;\n }\n\n const deeeeepPropagate = (node: Node): void => {\n let currentSubLink = node.headSubLink;\n let nextSubLink = currentSubLink?.nextSubLink;\n let unhandledSubLinkStack: InternalStack<Link | undefined> | undefined = undefined;\n\n while (currentSubLink !== undefined) {\n const sub = currentSubLink.sub;\n\n let flags = sub.flags;\n let shouldNotify = flags.hasWatching();\n let shouldDownward = flags.hasMutable();\n\n if (flags.hasTracking() === false && flags.hasDirty() === false && flags.hasPending() === false) {\n /**\n * 进入此分支的 flags:\n * 1. 不包含 Tracking 标记。\n * 2. 不包含 Dirty 标记或 Pending 标记。\n *\n * 说明:上游节点的变更首次传递到该节点。\n *\n * 此时,添加 Pending 标记,根据其它标记决定是否需要 Notify,根据其它标记决定是否需要 Downward。\n */\n flags.setPending();\n shouldNotify = shouldNotify;\n shouldDownward = shouldDownward;\n } else if (flags.hasTracking() === false) {\n /**\n * 进入此分支的 flags:\n * 1. 不包含 Tracking 标记。\n * 2. 包含 Dirty 标记或 Pending 标记。\n *\n * 说明:上游节点的变更已经传递到该节点。\n *\n * 此时,什么都不做,不需要修改标记,不需要 Notify,不需要 Downward。\n */\n flags = flags;\n shouldNotify = false;\n shouldDownward = false;\n } else if (flags.hasDirty() === false && flags.hasPending() === false) {\n /**\n * 进入此分支的 flags:\n * 1. 包含 Tracking 标记。\n * 2. 不包含 Dirty 标记或 Pending 标记。\n *\n * 说明:上游节点的变更首次传递到该节点,且该节点正在进行依赖收集。\n *\n * 此时,添加 Pending 标记,不需要 Notify,根据其它标记决定是否需要 Downward。\n */\n flags.setPending();\n shouldNotify = false;\n shouldDownward = shouldDownward;\n } else {\n /**\n * 进入此分支的 flags:\n * 1. 包含 Tracking 标记。\n * 2. 包含 Dirty 标记或 Pending 标记。\n *\n * 说明:上游节点的变更已经传递到该节点,且该节点正在进行依赖收集。\n *\n * 此时,不需要修改标记,不需要 Notify,不需要 Downward。\n */\n flags = flags;\n shouldNotify = false;\n shouldDownward = false;\n }\n\n if (shouldNotify === true) {\n notify(sub);\n }\n\n if (shouldDownward === true) {\n const headSubLinkOfSub = sub.headSubLink;\n if (headSubLinkOfSub !== undefined) {\n currentSubLink = headSubLinkOfSub;\n const nextSubLinkOfSub = headSubLinkOfSub.nextSubLink;\n if (nextSubLinkOfSub !== undefined) {\n unhandledSubLinkStack = { value: nextSubLink, prev: unhandledSubLinkStack };\n nextSubLink = nextSubLinkOfSub;\n }\n continue;\n }\n }\n\n currentSubLink = nextSubLink\n if (currentSubLink !== undefined) {\n nextSubLink = currentSubLink.nextSubLink;\n continue;\n }\n\n if (unhandledSubLinkStack !== undefined) {\n currentSubLink = unhandledSubLinkStack.value;\n unhandledSubLinkStack = unhandledSubLinkStack.prev;\n if (currentSubLink !== undefined) {\n nextSubLink = currentSubLink.nextSubLink;\n }\n }\n }\n }\n\n const resolvePending = (node: Node): void => {\n let currentDepLink = node.headDepLink;\n let unhandledDepLinkStack: InternalStack<Link> | undefined = undefined;\n\n while (currentDepLink !== undefined) {\n const currentSub: Node = currentDepLink.sub;\n const currentDep: Node = currentDepLink.dep;\n const subFlags = currentSub.flags;\n const depFlags = currentDep.flags;\n\n if (depFlags.hasMutable() === true && depFlags.hasDirty() === true) {\n /**\n * 当前下游节点不包含 Dirty 标记,当前上游节点包含 Dirty 标记。\n *\n * 更新当前上游节点,若值有变化,则将状态向直接下游节点传播。\n */\n const valueChanged = update(currentDep);\n if (valueChanged === true) {\n shallowPropagate(currentDep);\n }\n } else if (depFlags.hasMutable() === true && depFlags.hasPending() === true) {\n /**\n * 当前下游节点不包含 Dirty 标记,当前上游节点包含 Pending 标记。\n *\n * 继续检查当前上游节点的上游节点。\n */\n unhandledDepLinkStack = { value: currentDepLink, prev: unhandledDepLinkStack };\n currentDepLink = currentDep.headDepLink;\n continue;\n }\n\n if (subFlags.hasPending() === true) {\n const nextDepLink = currentDepLink.nextDepLink;\n if (nextDepLink !== undefined) {\n currentDepLink = nextDepLink;\n continue;\n }\n }\n\n if (unhandledDepLinkStack !== undefined) {\n currentDepLink = unhandledDepLinkStack.value;\n unhandledDepLinkStack = unhandledDepLinkStack.prev;\n\n /**\n * 当一个连接先被存起来,后续又被取出来处理时,说明其所有上游节点都已经处理完成,\n * 因此可以将其 Pending 标记移除。\n */\n currentDepLink.dep.flags.unsetPending();\n } else {\n /**\n * 所有连接都处理完成,可以安全移除当前连接的下游节点的 Pending 标记。\n */\n currentDepLink.sub.flags.unsetPending();\n break;\n }\n }\n }\n\n return {\n getDepLinksOfNode,\n getSubLinksOfNode,\n getDepsOfNode,\n getSubsOfNode,\n isDepLinkOfNode,\n isSubLinkOfNode,\n isDepOfNode,\n isSubOfNode,\n getLinkBetweenFromDep,\n getLinkBetweenFromSub,\n hasLinkBetweenFromDep,\n hasLinkBetweenFromSub,\n addLinkBetween,\n removeLinkBetweenFromDep,\n removeLinkBetweenFromSub,\n removeLink,\n removeAllDepLinksOfNode,\n removeAllSubLinksOfNode,\n\n getActiveNodeAsSub,\n setActiveNodeAsSub,\n setNoActiveNodeAsSub,\n resetActiveNodeAsSub,\n withActiveNodeAsSub,\n withoutActiveNodeAsSub,\n assertWithoutActiveNodeAsSub,\n startTracking,\n endTracking,\n withTracking,\n withoutTracking,\n assertWithoutTracking,\n addLinkBetweenOptimizedForTracking,\n track,\n trackNearestMutableOrWatching,\n\n shallowPropagate,\n deeeeepPropagate,\n resolvePending,\n };\n}\n",
22
23
  "import type { Flags } from \"./flags.ts\"\nimport { createReactiveSystem } from \"./reactive-system.ts\"\nimport { flags } from \"./flags.ts\"\nimport type { Link, Node, ReactiveSystem } from \"./reactive-system.ts\"\n\nexport interface BaseReactorOptions {\n name?: string | undefined;\n\n onDepChanged?: (() => void) | undefined;\n onSubChanged?: (() => void) | undefined;\n onHasDep?: ((dep: BaseReactor) => void) | undefined;\n onNoDep?: ((dep: BaseReactor) => void) | undefined;\n onHasSub?: ((sub: BaseReactor) => void) | undefined;\n onNoSub?: ((sub: BaseReactor) => void) | undefined;\n\n onDispose?: (() => void) | undefined;\n}\nexport abstract class BaseReactor<V = unknown> implements Node {\n headDepLink?: Link | undefined;\n tailDepLink?: Link | undefined;\n headSubLink?: Link | undefined\n tailSubLink?: Link | undefined\n flags: Flags;\n\n protected value: V;\n\n protected _name: string | undefined;\n\n protected _onDepChanged?: (() => void) | undefined;\n protected _onSubChanged?: (() => void) | undefined;\n protected _onHasDep?: ((dep: BaseReactor) => void) | undefined;\n protected _onNoDep?: ((dep: BaseReactor) => void) | undefined;\n protected _onHasSub?: ((sub: BaseReactor) => void) | undefined;\n protected _onNoSub?: ((sub: BaseReactor) => void) | undefined;\n\n protected _onDispose?: (() => void) | undefined;\n\n constructor(options: BaseReactorOptions) {\n this.flags = flags();\n\n // undefined 可能是使用者期待的合法值,因此这里使用 VOID 占位\n // oxlint-disable-next-line no-unsafe-type-assertion\n this.value = VOID as V;\n\n this._name = options.name;\n\n this._onDepChanged = options.onDepChanged;\n this._onSubChanged = options.onSubChanged;\n this._onHasDep = options.onHasDep;\n this._onNoDep = options.onNoDep;\n this._onHasSub = options.onHasSub;\n this._onNoSub = options.onNoSub;\n\n this._onDispose = options.onDispose;\n }\n\n getName(): string | undefined {\n return this._name;\n }\n\n setName(name: string | undefined): void {\n this._name = name;\n }\n\n abstract trackThis(): void;\n\n /**\n * Reactor 在运行过程中状态可能会发生变化,此方法用于将状态重置。比如:\n * 在错误发生时调用。\n */\n abstract reset(): void;\n\n /**\n * 删除当前 Reactor 与其它 Reactor 之间的所有连接,将状态重置,删除有必要删除的资源,\n * 目标是使当前 Reactor 可以被安全地丢弃而不会引起内存泄漏。\n */\n abstract dispose(): void;\n\n triggerOnDepChanged(): void {\n this._onDepChanged?.();\n };\n\n triggerOnSubChanged(): void {\n this._onSubChanged?.();\n };\n\n triggerOnHasDep(dep: BaseReactor): void {\n this._onHasDep?.(dep);\n };\n\n triggerOnNoDep(dep: BaseReactor): void {\n this._onNoDep?.(dep);\n };\n\n triggerOnHasSub(sub: BaseReactor): void {\n this._onHasSub?.(sub);\n };\n\n triggerOnNoSub(sub: BaseReactor): void {\n this._onNoSub?.(sub);\n this.dispose();\n };\n\n triggerOnDispose(): void {\n this._onDispose?.();\n }\n}\n\nconst VOID = Symbol(\"void\") as unknown;\nconst isVoid = <T>(value: T): boolean => {\n return value === VOID;\n}\n\nlet queue: Effect[] = [];\nconst flush = (): void => {\n const tempFlushQueue = queue;\n queue = [];\n try {\n while (tempFlushQueue.length !== 0) {\n const effect = tempFlushQueue.shift()!;\n effect.run();\n }\n } catch {\n while (tempFlushQueue.length !== 0) {\n const effect = tempFlushQueue.shift()!;\n effect.reset();\n }\n }\n}\n\nlet batchDepth = 0;\nexport const flushBatch = (): void => {\n if (batchDepth === 0) {\n flush();\n }\n}\nexport const startBatch = (): void => {\n batchDepth = batchDepth + 1;\n}\nexport const endBatch = (): void => {\n batchDepth = batchDepth - 1;\n if (batchDepth < 0) {\n throw new Error(\"endBatch called without matching startBatch\");\n }\n flushBatch();\n}\nexport const batch = (fn: () => void): void => {\n startBatch();\n try {\n fn();\n } finally {\n endBatch();\n }\n}\n\nexport const reactiveSystem: ReactiveSystem = createReactiveSystem({\n onDepChanged: (sub: Node) => {\n if (sub instanceof BaseReactor) {\n return sub.triggerOnDepChanged();\n }\n },\n onSubChanged: (dep: Node) => {\n if (dep instanceof BaseReactor) {\n return dep.triggerOnSubChanged();\n }\n },\n onHasDep: (sub: Node, dep: Node) => {\n if (sub instanceof BaseReactor && dep instanceof BaseReactor) {\n return sub.triggerOnHasDep(dep);\n }\n },\n onNoDep: (sub: Node, dep: Node) => {\n if (sub instanceof BaseReactor && dep instanceof BaseReactor) {\n return sub.triggerOnNoDep(dep);\n }\n },\n onHasSub: (dep: Node, sub: Node) => {\n if (dep instanceof BaseReactor && sub instanceof BaseReactor) {\n return dep.triggerOnHasSub(sub);\n }\n },\n onNoSub: (dep: Node, sub: Node) => {\n if (dep instanceof BaseReactor && sub instanceof BaseReactor) {\n return dep.triggerOnNoSub(sub);\n }\n },\n\n update(node: Signal | Derived | Computed) {\n return node.update();\n },\n notify(node: Effect) {\n const nodes = []\n let currentNode: Effect | undefined = node\n while (currentNode !== undefined) {\n if (currentNode.flags.hasWatching() === false) {\n break\n }\n currentNode.notify();\n nodes.push(currentNode);\n const nextNode: Node | undefined = currentNode?.headSubLink?.sub\n currentNode = nextNode instanceof Effect ? nextNode : undefined\n }\n queue.push(...nodes.toReversed());\n },\n});\nconst {\n removeAllDepLinksOfNode,\n removeAllSubLinksOfNode,\n\n withTracking,\n track,\n trackNearestMutableOrWatching,\n\n shallowPropagate,\n deeeeepPropagate,\n resolvePending,\n} = reactiveSystem\n\nconst defaultIsEqual = <V>(oldValue: V, newValue: V): boolean => {\n return Object.is(oldValue, newValue);\n}\n\nexport interface BaseSignalValueGetterContext { }\nexport interface InitializingSignalValueGetterContext extends BaseSignalValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingSignalValueGetterContext<V> extends BaseSignalValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type SignalValueGetterContext<V> =\n | InitializingSignalValueGetterContext\n | UpdatingSignalValueGetterContext<V>;\nexport type SignalValueInitializer<V> = (context: InitializingSignalValueGetterContext) => V;\nexport type SignalValueUpdater<V> = (context: UpdatingSignalValueGetterContext<V>) => V;\nexport type SignalValueGetter<V> = (context: SignalValueGetterContext<V>) => V;\nexport interface SignalOptions<V> extends BaseReactorOptions {\n isEqual?: ((oldValue: V, newValue: V) => boolean) | undefined;\n}\n/**\n * Signal 的值只有在被获取的时候才会更新。\n */\nexport class Signal<V = unknown> extends BaseReactor<V> {\n private isEqual: (oldValue: V, newValue: V) => boolean;\n\n private valueGetter: SignalValueGetter<V>;\n\n constructor(valueInitializer: SignalValueInitializer<V>, options: SignalOptions<V>) {\n super(options);\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.isEqual = options.isEqual ?? defaultIsEqual;\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n this.valueGetter = valueInitializer as SignalValueGetter<V>;\n }\n\n private getInitialFlags(): Flags {\n // 值在创建时尚未计算,因此初始时添加 Dirty 标记\n return flags().setMutable().setDirty();\n }\n\n trackThis(): void {\n trackNearestMutableOrWatching(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n\n private internalGet(options: { shouldTrack: boolean }): V {\n const { shouldTrack } = options;\n if (shouldTrack === true) {\n this.trackThis();\n }\n\n let valueChanged = false\n\n // 如果包含 Dirty 标记,则进行更新\n const shouldUpdate = this.flags.hasDirty();\n if (shouldUpdate === true) {\n valueChanged = this.update()\n }\n\n // 如果值变化,则通知下游(仅通知直接下游)\n if (valueChanged === true) {\n shallowPropagate(this);\n }\n\n return this.value;\n }\n\n get(): V {\n return this.internalGet({ shouldTrack: true });\n }\n\n getWithoutTrack(): V {\n return this.internalGet({ shouldTrack: false });\n }\n\n private internalSet(options: { valueUpdater: SignalValueUpdater<V> }): void {\n const { valueUpdater } = options;\n\n // 将新值暂存起来,等用到的时候再执行更新\n // oxlint-disable-next-line no-unsafe-type-assertion\n this.valueGetter = valueUpdater as SignalValueGetter<V>;\n // 为当前节点添加 Dirty 标记\n this.flags.setDirty();\n\n // 更新所有下游节点的标记\n deeeeepPropagate(this);\n\n // 执行更新队列\n flushBatch();\n }\n\n set(value: V): void {\n return this.internalSet({ valueUpdater: () => value });\n }\n\n setWithoutCalculate(valueUpdater: SignalValueUpdater<V>): void {\n return this.internalSet({ valueUpdater });\n }\n\n /**\n * 返回值表示更新前后值是否变化。\n */\n update(): boolean {\n this.flags.unsetDirty();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const newValue = this.valueGetter({ isInitializingRun: true });\n this.value = newValue;\n\n return true;\n } else {\n const oldValue = this.value;\n const newValue = this.valueGetter({ isInitializingRun: false, previousValue: oldValue });\n this.value = newValue;\n\n const valueChanged = this.isEqual(oldValue, newValue) === false\n return valueChanged;\n }\n }\n}\n\nexport interface BaseDerivedValueGetterContext { }\nexport interface InitializingSignalValueGetterContext extends BaseDerivedValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingDerivedValueGetterContext<V> extends BaseDerivedValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type DerivedValueGetterContext<V> =\n | InitializingSignalValueGetterContext\n | UpdatingDerivedValueGetterContext<V>;\nexport type DerivedValueUpdater<V> = (context: UpdatingDerivedValueGetterContext<V>) => V;\nexport type DerivedValueGetter<V> = (context: DerivedValueGetterContext<V>) => V;\nexport interface DerivedOptions<V> extends BaseReactorOptions {\n isEqual?: ((oldValue: V, newValue: V) => boolean) | undefined;\n}\n/**\n * Derived 的值只有在被获取的时候才会更新。\n * Derived 的值只有在上游节点的值发生变化时才会更新。\n * Derived 的下游节点全部解除连接时会自动与所有上游节点解除连接,并回到初始状态。\n */\nexport class Derived<V = unknown> extends BaseReactor<V> {\n private isEqual: (oldValue: V, newValue: V) => boolean;\n\n private valueGetter: DerivedValueGetter<V>;\n private manualValueGetter: DerivedValueGetter<V> | undefined;\n\n constructor(valueGetter: DerivedValueGetter<V>, options: DerivedOptions<V>) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.isEqual = options.isEqual ?? defaultIsEqual;\n\n this.valueGetter = valueGetter;\n this.manualValueGetter = undefined;\n }\n\n private getInitialFlags(): Flags {\n // 值在创建时尚未计算,因此初始时添加 Dirty 标记\n return flags().setMutable().setDirty();\n }\n\n trackThis(): void {\n trackNearestMutableOrWatching(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n\n private internalGet(options: { shouldTrack: boolean }): V {\n const { shouldTrack } = options;\n if (shouldTrack === true) {\n this.trackThis();\n }\n\n let valueChanged = false;\n\n // 如果包含 Pending 标记,则进行解决\n const shouldResolve = this.flags.hasPending();\n if (shouldResolve === true) {\n resolvePending(this);\n }\n\n // 如果包含 Dirty 标记,则进行更新\n const shouldUpdate = this.flags.hasDirty();\n if (shouldUpdate === true) {\n valueChanged = this.update()\n }\n\n // 如果值变化,则通知下游(仅通知直接下游)\n if (valueChanged === true) {\n shallowPropagate(this);\n }\n\n return this.value;\n }\n\n get(): V {\n return this.internalGet({ shouldTrack: true });\n }\n\n getWithoutTrack(): V {\n return this.internalGet({ shouldTrack: false });\n }\n\n private internalSet(options: { valueUpdater: DerivedValueUpdater<V> }): void {\n const { valueUpdater } = options;\n\n // 将新值暂存起来,等用到的时候再执行更新\n // oxlint-disable-next-line no-unsafe-type-assertion\n this.manualValueGetter = valueUpdater as DerivedValueGetter<V>;\n // 为当前节点添加 Dirty 标记\n this.flags.setDirty();\n\n // 更新所有下游节点的标记\n deeeeepPropagate(this);\n\n // 执行更新队列\n flushBatch();\n }\n\n set(value: V): void {\n return this.internalSet({ valueUpdater: () => value });\n }\n\n setWithoutCalculate(valueUpdater: DerivedValueUpdater<V>): void {\n return this.internalSet({ valueUpdater });\n }\n\n /**\n * 返回值表示更新前后值是否变化。\n */\n private manualUpdate(): boolean {\n const manualValueGetter = this.manualValueGetter;\n if (manualValueGetter === undefined) {\n throw new Error(\"Derived: manualValueGetter is undefined.\");\n }\n this.manualValueGetter = undefined;\n\n this.flags.unsetDirty();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const newValue = manualValueGetter({ isInitializingRun: true });\n this.value = newValue;\n\n return true;\n } else {\n const oldValue = this.value;\n const newValue = manualValueGetter({ isInitializingRun: false, previousValue: oldValue });\n this.value = newValue;\n\n const valueChanged = this.isEqual(oldValue, newValue) === false\n return valueChanged;\n }\n }\n\n /**\n * 返回值表示更新前后值是否变化。\n */\n update(): boolean {\n if (this.manualValueGetter !== undefined) {\n return this.manualUpdate();\n }\n\n const result = withTracking(this, () => {\n this.flags.unsetDirty();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const newValue = this.valueGetter({ isInitializingRun: true });\n this.value = newValue;\n\n return true;\n } else {\n const oldValue = this.value;\n const newValue = this.valueGetter({ isInitializingRun: false, previousValue: oldValue });\n this.value = newValue;\n\n const valueChanged = this.isEqual(oldValue, newValue) === false\n return valueChanged;\n }\n\n })\n return result;\n }\n}\n\nexport interface BaseComputedValueGetterContext { }\nexport interface InitializingComputedValueGetterContext extends BaseComputedValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingComputedValueGetterContext<V> extends BaseComputedValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type ComputedValueGetterContext<V> =\n | InitializingComputedValueGetterContext\n | UpdatingComputedValueGetterContext<V>;\nexport type ComputedValueGetter<V> = (context: ComputedValueGetterContext<V>) => V;\nexport interface ComputedOptions<V> extends BaseReactorOptions {\n isEqual?: ((oldValue: V, newValue: V) => boolean) | undefined;\n}\n/**\n * Computed 的值只有在被获取的时候才会更新。\n * Computed 的值只有在上游节点的值发生变化时才会更新。\n * Computed 的下游节点全部解除连接时会自动与所有上游节点解除连接,并回到初始状态。\n */\nexport class Computed<V = unknown> extends BaseReactor<V> {\n private isEqual: (oldValue: V, newValue: V) => boolean;\n\n private valueGetter: ComputedValueGetter<V>;\n\n constructor(valueGetter: ComputedValueGetter<V>, options: ComputedOptions<V>) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.isEqual = options.isEqual ?? defaultIsEqual;\n\n this.valueGetter = valueGetter;\n }\n\n private getInitialFlags(): Flags {\n // 值在创建时尚未计算,因此初始时添加 Dirty 标记\n return flags().setMutable().setDirty();\n }\n\n trackThis(): void {\n trackNearestMutableOrWatching(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n\n private internalGet(options: { shouldTrack: boolean }): V {\n const { shouldTrack } = options;\n if (shouldTrack === true) {\n this.trackThis();\n }\n\n let valueChanged = false;\n\n // 如果包含 Pending 标记,则进行解决\n const shouldResolve = this.flags.hasPending();\n if (shouldResolve === true) {\n resolvePending(this);\n }\n\n // 如果包含 Dirty 标记,则进行更新\n const shouldUpdate = this.flags.hasDirty();\n if (shouldUpdate === true) {\n valueChanged = this.update()\n }\n\n // 如果值变化,则通知下游(仅通知直接下游)\n if (valueChanged === true) {\n shallowPropagate(this);\n }\n\n return this.value;\n }\n\n get(): V {\n return this.internalGet({ shouldTrack: true });\n }\n\n getWithoutTrack(): V {\n return this.internalGet({ shouldTrack: false });\n }\n\n /**\n * 返回值表示更新前后值是否变化。\n */\n update(): boolean {\n const result = withTracking(this, () => {\n this.flags.unsetDirty();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const newValue = this.valueGetter({ isInitializingRun: true });\n this.value = newValue;\n return true;\n } else {\n const oldValue = this.value;\n const newValue = this.valueGetter({ isInitializingRun: false, previousValue: oldValue });\n this.value = newValue;\n\n const valueChanged = this.isEqual(oldValue, newValue) === false\n return valueChanged;\n }\n\n })\n return result;\n }\n}\n\n\nexport type CleanupFn = () => void;\nexport interface BaseEffectValueGetterContext {\n setCleanup: (cleanup: CleanupFn) => void;\n}\nexport interface InitializingEffectValueGetterContext extends BaseEffectValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingEffectValueGetterContext<V> extends BaseEffectValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type EffectValueGetterContext<V> =\n | InitializingEffectValueGetterContext\n | UpdatingEffectValueGetterContext<V>;\nexport type EffectValueGetter<V> = (context: EffectValueGetterContext<V>) => V;\nexport interface EffectOptions extends BaseReactorOptions {\n}\n/**\n * Effect 会在创建时立即执行一次传入的函数。\n * Effect 会在每次上游节点的值发生变化时重新执行传入的函数。\n * Effect 在任意时刻最多只能一个待运行。\n * Effect 可以与 Effect 建立连接。\n * 作为上游节点的 Effect 在没有下游节点时会自动与所有上游节点解除连接,并将标记清空。\n */\nexport class Effect<V = void> extends BaseReactor<V> {\n private valueGetter: EffectValueGetter<V>;\n private cleanupFn: CleanupFn | undefined;\n\n constructor(valueGetter: EffectValueGetter<V>, options: EffectOptions) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.valueGetter = valueGetter;\n this.cleanupFn = undefined;\n\n this.trackThis();\n this.runWithTracking();\n }\n\n private getInitialFlags(): Flags {\n // 在创建完成后即进入观察状态,因此初始时添加 Watching 标记\n return flags().setWatching();\n }\n\n trackThis(): void {\n track(this);\n }\n\n private cleanup(): void {\n this.cleanupFn?.();\n this.cleanupFn = undefined;\n }\n\n private runWithTracking(): V {\n const result = withTracking(this, () => {\n this.cleanup();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const context: EffectValueGetterContext<V> = {\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n isInitializingRun,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value;\n } else {\n const context: EffectValueGetterContext<V> = {\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n isInitializingRun,\n previousValue: this.value,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value;\n }\n })\n\n return result;\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n this.cleanup();\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n\n notify(): void {\n this.flags.unsetWatching();\n }\n\n run(): void {\n // 如果包含 Pending 标记,则进行解决\n const shouldResolve = this.flags.hasPending();\n if (shouldResolve === true) {\n resolvePending(this);\n }\n\n // order matters:\n // - 需要在 resolvePending 之后,因为:resolvePending 时可能触发 shallowPropagate,\n // 进而触发 notify,notify 只会作用于包含 Watching 标记的节点。\n // - 需要在 runWithTracking 之前,因为:Signal 只会 track 包含 Watching 标记的 Effect。\n this.flags.setWatching();\n\n // 如果包含 Dirty 标记,则进行更新\n const shouldRun = this.flags.hasDirty();\n if (shouldRun === true) {\n this.runWithTracking();\n }\n }\n}\n\nexport interface BaseEffectScopeValueGetterContext extends BaseEffectValueGetterContext { }\nexport interface InitializingEffectScopeValueGetterContext\n extends BaseEffectScopeValueGetterContext, InitializingEffectValueGetterContext { }\nexport interface UpdatingEffectScopeValueGetterContext<V>\n extends BaseEffectScopeValueGetterContext, UpdatingEffectValueGetterContext<V> {\n}\nexport type EffectScopeValueGetterContext<V> =\n | InitializingEffectScopeValueGetterContext\n | UpdatingEffectScopeValueGetterContext<V>;\nexport type EffectScopeValueGetter<V> = (context: EffectScopeValueGetterContext<V>) => V;\nexport interface EffectScopeOptions extends BaseReactorOptions {\n}\nexport class EffectScope<V = void> extends BaseReactor<V> {\n private valueGetter: EffectScopeValueGetter<V>;\n private cleanupFn: CleanupFn | void;\n\n constructor(valueGetter: EffectScopeValueGetter<V>, options: EffectScopeOptions) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.valueGetter = valueGetter;\n this.cleanupFn = undefined;\n\n this.trackThis();\n this.runWithTracking();\n }\n\n private getInitialFlags(): Flags {\n // 只负责管理作用域,不需要添加任何标记\n return flags();\n }\n\n private cleanup(): void {\n this.cleanupFn?.();\n this.cleanupFn = undefined;\n }\n\n private runWithTracking(): V {\n const result = withTracking(this, () => {\n this.cleanup();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const context: EffectScopeValueGetterContext<V> = {\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n isInitializingRun,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value;\n } else {\n const context: EffectScopeValueGetterContext<V> = {\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n isInitializingRun,\n previousValue: this.value,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value;\n }\n })\n\n return result;\n }\n\n trackThis(): void {\n track(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n this.cleanup();\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n}\n\nexport interface BaseTriggerValueGetterContext {\n setCleanup: (cleanup: CleanupFn) => void;\n}\nexport interface InitializingTriggerValueGetterContext extends BaseTriggerValueGetterContext {\n isInitializingRun: true;\n}\nexport interface UpdatingTriggerValueGetterContext<V> extends BaseTriggerValueGetterContext {\n isInitializingRun: false;\n previousValue: V;\n}\nexport type TriggerValueGetterContext<V> =\n | InitializingTriggerValueGetterContext\n | UpdatingTriggerValueGetterContext<V>\nexport type TriggerValueGetter<V> = (context: TriggerValueGetterContext<V>) => V;\nexport interface TriggerOptions extends BaseReactorOptions {\n}\nexport class Trigger<V = void> extends BaseReactor<V> {\n private valueGetter: TriggerValueGetter<V>;\n private cleanupFn: CleanupFn | void;\n\n constructor(valueGetter: TriggerValueGetter<V>, options: TriggerOptions) {\n super(options);\n this.headDepLink = undefined;\n this.tailDepLink = undefined;\n this.headSubLink = undefined;\n this.tailSubLink = undefined;\n this.flags = this.getInitialFlags();\n\n this.valueGetter = valueGetter;\n this.cleanupFn = undefined;\n\n this.runWithTracking();\n }\n\n private getInitialFlags(): Flags {\n return flags().setWatching();\n }\n\n private cleanup(): void {\n this.cleanupFn?.();\n this.cleanupFn = undefined;\n }\n\n private runWithTracking(): V {\n // 以依赖收集的方式获取目标 Signals\n const result = withTracking(this, () => {\n this.cleanup();\n\n const isInitializingRun = isVoid(this.value) === true;\n\n if (isInitializingRun === true) {\n const context: TriggerValueGetterContext<V> = {\n isInitializingRun,\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value\n } else {\n const context: TriggerValueGetterContext<V> = {\n isInitializingRun,\n setCleanup: (cleanup) => {\n this.cleanupFn = cleanup;\n },\n previousValue: this.value,\n }\n const value = this.valueGetter(context);\n this.value = value;\n return value\n }\n\n })\n\n // 移除目标 Singals 与当前 Signal 之间的连接,并触发更新机制\n const targetDeps = removeAllDepLinksOfNode(this);\n targetDeps.forEach(dep => {\n deeeeepPropagate(dep);\n shallowPropagate(dep);\n })\n\n // 执行更新队列\n flushBatch();\n\n this.dispose();\n\n return result;\n }\n\n trackThis(): void {\n track(this);\n }\n\n reset(): void {\n this.flags = this.getInitialFlags();\n }\n\n dispose(): void {\n this.cleanup();\n removeAllDepLinksOfNode(this);\n removeAllSubLinksOfNode(this);\n this.reset();\n this.triggerOnDispose();\n }\n}\n\nexport const isReactor = (target: unknown): target is BaseReactor => {\n return target instanceof BaseReactor;\n}\n\nexport const isSignal = <V>(target: unknown): target is Signal<V> => {\n return target instanceof Signal;\n}\nexport const signal = <V>(valueInitializer: SignalValueInitializer<V>, options?: SignalOptions<V>): Signal<V> => {\n return new Signal(valueInitializer, options ?? {});\n}\nexport const isDerived = <V>(target: unknown): target is Derived<V> => {\n return target instanceof Derived;\n}\nexport const derived = <V>(valueGetter: DerivedValueGetter<V>, options?: DerivedOptions<V>): Derived<V> => {\n return new Derived(valueGetter, options ?? {});\n}\nexport const isComputed = <V>(target: unknown): target is Computed<V> => {\n return target instanceof Computed;\n}\nexport const computed = <V>(valueGetter: ComputedValueGetter<V>, options?: ComputedOptions<V>): Computed<V> => {\n return new Computed(valueGetter, options ?? {});\n}\nexport const isEffect = <V>(target: unknown): target is Effect<V> => {\n return target instanceof Effect;\n}\nexport const effect = <V>(valueGetter: EffectValueGetter<V>, options?: EffectOptions): Effect<V> => {\n return new Effect(valueGetter, options ?? {});\n}\nexport const isEffectScope = <V>(target: unknown): target is EffectScope<V> => {\n return target instanceof EffectScope;\n}\nexport const effectScope = <V>(valueGetter: EffectScopeValueGetter<V>, options?: EffectScopeOptions): EffectScope<V> => {\n return new EffectScope(valueGetter, options ?? {});\n}\nexport const isTrigger = <V>(target: unknown): target is Trigger<V> => {\n return target instanceof Trigger;\n}\nexport const trigger = <V>(valueGetter: TriggerValueGetter<V>, options?: TriggerOptions): Trigger<V> => {\n return new Trigger(valueGetter, options ?? {});\n}\n\nexport type ValueReactor<V = unknown> = Signal<V> | Derived<V> | Computed<V>;\nexport type ActionReactor<V = unknown> = Effect<V> | EffectScope<V> | Trigger<V>;\nexport const isValueReactor = <V>(target: unknown): target is ValueReactor<V> => {\n return isSignal(target) || isDerived(target) || isComputed(target);\n}\nexport const isActionReactor = <V>(target: unknown): target is ActionReactor<V> => {\n return isEffect(target) || isEffectScope(target) || isTrigger(target);\n}\n\n// oxlint-disable-next-line no-explicit-any\nexport type AnyReactor = BaseReactor<any>\n// oxlint-disable-next-line no-explicit-any\nexport type AnyValueReactor = ValueReactor<any>\n// oxlint-disable-next-line no-explicit-any\nexport type AnyActionReactor = ActionReactor<any>\n\nexport type ValueOfReactor<R extends AnyReactor> = R extends BaseReactor<infer V> ? V : never;\nexport type ValueOfValueReactor<R extends AnyValueReactor> = R extends ValueReactor<infer V> ? V : never;\nexport type ValueOfActionReactor<R extends AnyActionReactor> = R extends ActionReactor<infer V> ? V : never;\n",
@@ -26,9 +27,11 @@
26
27
  "import type { AnyValueReactorArray, AnyValueReactorObject, GetValuesInArray, GetValuesInObject } from \"./utility.ts\"\nimport type { Effect, Signal, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer, getValuesInArray, getValuesInObject } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport type CombineLatestArray<T extends AnyValueReactorArray> = Signal<GetValuesInArray<T>>;\nexport interface CombineLatestArrayOptions<T extends AnyValueReactorArray> {\n target: T;\n}\n/**\n * Combines multiple ValueReactors into a Signal that emits the latest values\n * from each ValueReactor whenever any of them updates.\n */\nexport const combineLatestArray = <T extends AnyValueReactorArray>(\n options: CombineLatestArrayOptions<T>\n): CombineLatestArray<T> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<GetValuesInArray<T>>(), {\n onDispose: () => {\n e.dispose()\n }\n })\n\n const e = effect(() => {\n result.set(getValuesInArray({ target }))\n })\n\n return result\n}\n\nexport type CombineLatestObject<T extends AnyValueReactorObject> = Signal<GetValuesInObject<T>>;\nexport interface CombineLatestObjectOptions<T extends AnyValueReactorObject> {\n target: T;\n}\n/**\n * Combines multiple ValueReactors in an object into a Signal that emits the latest values\n * from each ValueReactor whenever any of them updates.\n */\nexport const combineLatestObject = <T extends AnyValueReactorObject>(\n options: CombineLatestObjectOptions<T>\n): CombineLatestObject<T> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<GetValuesInObject<T>>(), {\n onDispose: () => {\n e.dispose()\n }\n })\n\n const e = effect(() => {\n result.set(getValuesInObject({ target }))\n })\n\n return result\n}\n\nexport type MergeArray<T extends AnyValueReactorArray> = Signal<GetValuesInArray<T>[number]>;\nexport interface MergeArrayOptions<T extends AnyValueReactorArray> {\n target: T;\n}\n/**\n * Merges multiple ValueReactors into a Signal that emits values\n * from any of the ValueReactors as they update.\n */\nexport const mergeArray = <T extends AnyValueReactorArray>(\n options: MergeArrayOptions<T>\n): MergeArray<T> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<GetValuesInArray<T>[number]>(), {\n onDispose: () => {\n for (const e of effects) {\n e.dispose()\n }\n }\n });\n\n const effects: Effect[] = [];\n for (const valueReactor of target) {\n const e = effect(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = valueReactor.get() as GetValuesInArray<T>[number];\n result.set(value)\n })\n effects.push(e)\n }\n\n return result\n}\n\nexport interface WithLatestFromOptions<T, U> {\n target: ValueReactor<T>;\n other: ValueReactor<U>;\n}\n/**\n * Combines two ValueReactors into a Signal that emits the latest values\n * from the source ValueReactor along with the latest value from the other ValueReactor.\n */\nexport const withLatestFrom = <T, U>(\n options: WithLatestFromOptions<T, U>\n): Signal<[T, U]> => {\n const { target, other } = options;\n\n const result = signal(castValueInitializer<[T, U]>(), {\n onDispose: () => {\n eTarget.dispose()\n eOther.dispose()\n }\n })\n\n let lastOther = other.get()\n const eOther = effect(() => {\n const b = other.get()\n lastOther = b\n })\n const eTarget = effect(() => {\n const a = target.get()\n result.set([a, lastOther])\n })\n\n return result\n}\n\nexport interface ZipOptions<VA, VB> {\n a: ValueReactor<VA>;\n b: ValueReactor<VB>;\n}\n/**\n * Zips two ValueReactors into a Signal that emits pairs of values.\n * Each time both ValueReactors have new values, a new pair is emitted.\n */\nexport const zip = <VA, VB>(\n options: ZipOptions<VA, VB>\n): Signal<[VA, VB]> => {\n const valueReactorA = options.a;\n const valueReactorB = options.b;\n\n let lastA = valueReactorA.getWithoutTrack()\n let lastB = valueReactorB.getWithoutTrack()\n\n const result = signal<[VA, VB]>(() => [lastA, lastB], {\n onDispose: () => {\n e.dispose()\n }\n })\n\n const queueA: VA[] = []\n const queueB: VB[] = []\n\n const e = effect(() => {\n const a = valueReactorA.get()\n const b = valueReactorB.get()\n\n if (a !== lastA) {\n queueA.push(a)\n lastA = a\n }\n if (b !== lastB) {\n queueB.push(b)\n lastB = b\n }\n\n if (queueA.length !== 0 && queueB.length !== 0) {\n const va = queueA.shift()\n const vb = queueB.shift()\n // oxlint-disable-next-line no-unsafe-type-assertion\n result.set([va, vb] as [VA, VB])\n }\n })\n\n return result\n}\n",
27
28
  "import type { Signal, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport interface CloneOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Creates a Signal that mirrors the value of the target ValueReactor.\n */\nexport const clone = <V>(\n options: CloneOptions<V>\n): Signal<V> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n result.set(value)\n })\n\n return result\n}\n\nexport interface PartitionOptions<V> {\n target: ValueReactor<V>;\n predicate: (value: V) => boolean;\n}\n/**\n * Partitions values from a ValueReactor into two Signals based on a predicate function.\n * The first Signal emits values that satisfy the predicate, while the second Signal\n * emits values that do not satisfy the predicate.\n */\nexport const partition = <V>(\n options: PartitionOptions<V>\n): [Signal<V | undefined>, Signal<V | undefined>] => {\n const { target, predicate } = options;\n\n const trueSignal = signal(castValueInitializer<V | undefined>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n const falseSignal = signal(castValueInitializer<V | undefined>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (predicate(value) === true) {\n trueSignal.set(value)\n } else {\n falseSignal.set(value)\n }\n })\n\n return [trueSignal, falseSignal]\n}\n",
28
29
  "import type { AnyValueReactor, Signal, ValueOfValueReactor, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport interface TapOptions<R extends AnyValueReactor> {\n target: R;\n tapper?: ((value: ValueOfValueReactor<R>) => void) | undefined;\n}\n/**\n * Taps into the value changes of a ValueReactor without modifying its value.\n */\nexport const tap = <R extends AnyValueReactor>(\n options: TapOptions<R>\n): R => {\n const { target, tapper = (value: ValueOfValueReactor<R>): void => console.log(value) } = options;\n\n effect(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n const value = target.get() as ValueOfValueReactor<R>\n tapper(value)\n })\n\n return target\n}\n\nexport interface WithHistoryOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Creates a signal that maintains a history of values from a ValueReactor.\n * The history is stored in an array, with each new value appended to the end.\n *\n * Note: This implementation does not limit the size of the history array. Use\n * with caution to avoid excessive memory usage.\n */\nexport const withHistory = <V>(\n options: WithHistoryOptions<V>\n): Signal<V[]> => {\n const { target } = options;\n\n const result = signal(castValueInitializer<V[]>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const history: V[] = []\n const eTarget = effect(() => {\n history.push(target.get())\n result.set([...history])\n })\n\n return result\n}\n\nexport interface BufferByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array\n * when the number of buffered values reaches the specified count.\n */\nexport const bufferByCount = <V>(\n options: BufferByCountOptions<V>\n): Signal<V[]> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"bufferByCount operator requires count to be greater than 0\")\n }\n\n const result = signal<V[]>(() => [], {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const bufferedValues: V[] = []\n const eTarget = effect(() => {\n bufferedValues.push(target.get())\n if (bufferedValues.length >= count) {\n result.set([...bufferedValues])\n bufferedValues.length = 0\n }\n })\n\n return result\n}\n\nexport interface BufferByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array\n * at specified time intervals.\n */\nexport const bufferByTime = <V>(\n options: BufferByTimeOptions<V>\n): Signal<V[]> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"bufferByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<V[]>(() => [], {\n onDispose: () => {\n eTarget.dispose()\n clearInterval(intervalId)\n }\n })\n\n const bufferedValues: V[] = []\n const eTarget = effect(() => {\n bufferedValues.push(target.get())\n })\n\n const intervalId = setInterval(() => {\n result.set([...bufferedValues])\n bufferedValues.length = 0\n }, time)\n\n return result\n}\n\nexport interface BufferByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array when the trigger ValueReactor changes.\n */\nexport const bufferByTrigger = <VTarget, VTrigger>(\n options: BufferByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget[]> => {\n const { target, trigger } = options;\n\n const result = signal(castValueInitializer<VTarget[]>(), {\n onDispose: () => {\n eTarget.dispose()\n eTrigger.dispose()\n }\n })\n\n const bufferedValues: VTarget[] = []\n const eTarget = effect(() => {\n bufferedValues.push(target.get())\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set([...bufferedValues])\n bufferedValues.length = 0\n })\n\n return result\n}\n\nexport interface BufferByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array\n * when the open ValueReactor emits a value, and stops buffering\n * when the close ValueReactor emits a value.\n */\nexport const bufferByToggle = <VTarget, VOpen, VClose>(\n options: BufferByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget[]> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget[]>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n const bufferedValues: VTarget[] = []\n let buffering = false\n\n const eOpen = effect(() => {\n open.get()\n buffering = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (buffering === true) {\n bufferedValues.push(value)\n }\n })\n\n const eClose = effect(() => {\n close.get()\n if (buffering === true) {\n result.set([...bufferedValues])\n bufferedValues.length = 0\n buffering = false\n }\n })\n\n return result\n}\n\nexport interface BufferByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Buffers values from a ValueReactor and emits them as an array\n * when the ValueReactor returned by the `dynamic` function emits a value.\n * The `dynamic` function is called each time the buffer is emitted\n * to get a new ValueReactor for the next buffer.\n */\nexport const bufferByDynamic = <VTarget, VDynamic>(\n options: BufferByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget[]> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget[]>(), {\n onDispose: () => {\n eTarget.dispose()\n eDynamic.dispose()\n }\n })\n\n const bufferedValues: VTarget[] = []\n const eTarget = effect(() => {\n const value = target.get()\n bufferedValues.push(value)\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n const eDynamic = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n result.set([...bufferedValues])\n bufferedValues.length = 0\n })\n\n return result\n}\n\nexport interface GroupToArrayByOptions<V, K> {\n target: ValueReactor<V>;\n keyGetter: (value: V) => K;\n}\n/**\n * Groups values from a ValueReactor into an array of arrays based on a key\n * extracted by the keyGetter function.\n */\nexport const groupToArrayBy = <V, K>(\n options: GroupToArrayByOptions<V, K>\n): Signal<V[][]> => {\n const { target, keyGetter } = options;\n\n const result = signal<V[][]>(() => [], {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const groups = new Map<K, V[]>()\n const eTarget = effect(() => {\n const value = target.get()\n const key = keyGetter(value)\n if (groups.has(key) === false) {\n groups.set(key, [])\n result.set([...groups.values()])\n }\n const groupedArray = groups.get(key)!\n groupedArray.push(value)\n })\n\n return result\n}\n\nexport interface GroupToObjectByOptions<V, K extends string | number | symbol> {\n target: ValueReactor<V>;\n keyGetter: (value: V) => K;\n}\n/**\n * Groups values from a ValueReactor into an object where each key maps to an array\n * of values corresponding to that key.\n */\nexport const groupToObjectBy = <V, K extends string | number | symbol>(\n options: GroupToObjectByOptions<V, K>\n): Signal<Record<K, V[]>> => {\n const { target, keyGetter } = options;\n\n const result = signal<Record<K, V[]>>(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Record<K, V[]>\n }, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const groups = new Map<K, V[]>()\n const eTarget = effect(() => {\n const value = target.get()\n const key = keyGetter(value)\n if (groups.has(key) === false) {\n groups.set(key, [])\n // oxlint-disable-next-line no-unsafe-type-assertion\n result.set(Object.fromEntries(groups.entries()) as Record<K, V[]>)\n }\n const groupedArray = groups.get(key)!\n groupedArray.push(value)\n })\n\n return result\n}\n\n/**\n * Groups values from a ValueReactor into an array of Signals based on a key\n * extracted by the keyGetter function.\n */\nexport const groupToSignalArrayBy = <V, K>(\n target: ValueReactor<V>, keyGetter: (value: V) => K\n): Signal<Array<Signal<V[]>>> => {\n const result = signal<Array<Signal<V[]>>>(() => [], {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const groups = new Map<K, Signal<V[]>>()\n const eTarget = effect(() => {\n const value = target.get()\n const key = keyGetter(value)\n if (groups.has(key) === false) {\n const newGroup = signal<V[]>(() => [])\n groups.set(key, newGroup)\n result.set([...groups.values()])\n }\n const groupedSignal = groups.get(key)!\n const currentArray = groupedSignal.get()\n groupedSignal.set([...currentArray, value])\n })\n\n return result\n}\n\nexport interface GroupToSignalObjectByOptions<V, K extends string | number | symbol> {\n target: ValueReactor<V>;\n keyGetter: (value: V) => K;\n}\n/**\n * Groups values from a ValueReactor into a Signal of an object where each key maps to a Signal\n * of an array of values corresponding to that key.\n */\nexport const groupToSignalObjectBy = <V, K extends string | number | symbol>(\n options: GroupToSignalObjectByOptions<V, K>\n): Signal<Record<K, Signal<V[]>>> => {\n const { target, keyGetter } = options;\n\n const result = signal<Record<K, Signal<V[]>>>(() => {\n // oxlint-disable-next-line no-unsafe-type-assertion\n return {} as Record<K, Signal<V[]>>\n }, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const groups = new Map<K, Signal<V[]>>()\n const eTarget = effect(() => {\n const value = target.get()\n const key = keyGetter(value)\n if (groups.has(key) === false) {\n const newGroup = signal<V[]>(() => [])\n groups.set(key, newGroup)\n // oxlint-disable-next-line no-unsafe-type-assertion\n result.set(Object.fromEntries(groups.entries()) as Record<K, Signal<V[]>>)\n }\n const groupedSignal = groups.get(key)!\n const currentArray = groupedSignal.get()\n groupedSignal.set([...currentArray, value])\n })\n\n return result\n}\n\nexport interface MapOptions<VTarget, VMapped> {\n target: ValueReactor<VTarget>;\n mapper: (value: VTarget) => VMapped;\n}\n/**\n * Maps values from a ValueReactor using the provided mapper function and\n * emits the mapped values as a new Signal.\n */\nexport const map = <VTarget, VMapped>(\n options: MapOptions<VTarget, VMapped>\n): Signal<VMapped> => {\n const { target, mapper } = options;\n\n const result = signal(castValueInitializer<VMapped>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n const newValue = mapper(value)\n result.set(newValue)\n })\n\n return result\n}\n\nexport interface ContextualMapInitializingMapperContext<VTarget> {\n isInitializingRun: true;\n targetValue: VTarget\n}\nexport interface ContextualMapUpdatingMapperContext<VTarget, VMapped> {\n isInitializingRun: false;\n targetValue: VTarget\n previousMappedValue: VMapped\n}\nexport type ContextualMapMapperContextOf<VTarget, VMapped> =\n | ContextualMapInitializingMapperContext<VTarget>\n | ContextualMapUpdatingMapperContext<VTarget, VMapped>;\n\nexport interface ContextualMapOptions<VTarget, VMapped> {\n target: ValueReactor<VTarget>;\n mapper: (context: ContextualMapMapperContextOf<VTarget, VMapped>) => VMapped;\n}\n/**\n * Maps values from a ValueReactor using the provided contextual mapper function and\n * emits the mapped values as a new Signal.\n */\nexport const contextualMap = <VTarget, VMapped>(\n options: ContextualMapOptions<VTarget, VMapped>\n): Signal<VMapped> => {\n const { target, mapper } = options;\n\n const result = signal(castValueInitializer<VMapped>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect((context) => {\n const targetValue = target.get()\n const { isInitializingRun } = context\n if (isInitializingRun === true) {\n const newValue = mapper({\n isInitializingRun,\n targetValue\n })\n result.set(newValue)\n } else {\n const previousMappedValue = result.getWithoutTrack()\n const newValue = mapper({\n isInitializingRun,\n targetValue,\n previousMappedValue\n })\n result.set(newValue)\n }\n })\n\n return result\n}\n\nexport interface MergeMapOptions<VTarget, VMapped> {\n target: ValueReactor<VTarget>;\n mapper: (value: VTarget) => ValueReactor<VMapped>;\n}\n/**\n * Maps each value from a ValueReactor<T> to a ValueReactor<R> using the provided `mapper`,\n * subscribes to every mapped reactor, and merges their emitted values into a single `Signal<R>`.\n */\nexport const mergeMap = <VTarget, VMapped>(\n options: MergeMapOptions<VTarget, VMapped>\n): Signal<VMapped> => {\n const { target, mapper } = options;\n\n const result = signal(castValueInitializer<VMapped>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n const currentMappedReactor = mapper(value);\n\n effect(() => {\n const mappedValue = currentMappedReactor.get()\n result.set(mappedValue)\n })\n })\n\n return result\n}\n\nexport interface SwitchMapOptions<VTarget, VMapped> {\n target: ValueReactor<VTarget>;\n mapper: (value: VTarget) => ValueReactor<VMapped>;\n}\n/**\n * Maps each value from a ValueReactor<T> to a ValueReactor<R> using the provided `mapper`,\n * subscribes only to the latest mapped reactor, and emits its values as a `Signal<R>`.\n */\nexport const switchMap = <VTarget, VMapped>(\n options: SwitchMapOptions<VTarget, VMapped>\n): Signal<VMapped> => {\n const { target, mapper } = options;\n\n const result = signal(castValueInitializer<VMapped>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let lastMappedReactor: ValueReactor<VMapped> | undefined = undefined\n\n const eTarget = effect(() => {\n const value = target.get()\n lastMappedReactor?.dispose()\n lastMappedReactor = mapper(value);\n effect(() => {\n const mappedValue = lastMappedReactor!.get()\n result.set(mappedValue)\n })\n })\n\n return result\n}\n\nexport interface ScanOptions<VTarget, VAccumulated> {\n target: ValueReactor<VTarget>;\n accumulator: (acc: VAccumulated, value: VTarget) => VAccumulated;\n seed: VAccumulated;\n}\n/**\n * Accumulates values from a ValueReactor using the provided accumulator function\n * and emits the accumulated value as a Signal.\n */\nexport const scan = <VTarget, VAccumulated>(\n options: ScanOptions<VTarget, VAccumulated>\n): Signal<VAccumulated> => {\n const { target, accumulator, seed } = options;\n\n const result = signal(() => seed, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n const newValue = accumulator(result.getWithoutTrack(), value)\n result.set(newValue)\n })\n\n return result\n}\n\nexport interface PairwiseOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Emits the previous and current values from a ValueReactor as a tuple.\n * The first emitted tuple will have `undefined` as the previous value.\n */\nexport const pairwise = <V>(\n options: PairwiseOptions<V>\n): Signal<[V | undefined, V]> => {\n const { target } = options;\n\n const result = signal<[V | undefined, V]>(() => [undefined, target.get()], {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let previousValue: V | undefined = undefined\n const eTarget = effect(() => {\n const currentValue = target.get()\n result.set([previousValue, currentValue])\n previousValue = currentValue\n })\n\n return result\n}\n",
29
- "import type { Signal, SignalValueInitializer, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport interface CurrentOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Returns a Signal that holds the current value of the target ValueReactor.\n */\nexport const current = <V>(\n options: CurrentOptions<V>\n): Signal<V> => {\n const { target } = options;\n\n const result = signal<V>(() => {\n return target.get()\n })\n\n return result\n}\n\nexport interface NextOptions<V> {\n target: ValueReactor<V>;\n valueInitializer: SignalValueInitializer<V>\n}\n/**\n * Returns a Signal that holds the next value of the target ValueReactor\n * after the initial value.\n *\n * The Signal will update its value only once, upon the next change of\n * the target ValueReactor, and then it will not update anymore.\n */\nexport const next = <V>(\n options: NextOptions<V>\n): Signal<V> => {\n const { target, valueInitializer } = options;\n\n const result = signal(valueInitializer, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect((context) => {\n const { isInitializingRun } = context\n\n const value = target.get()\n if (isInitializingRun === false) {\n result.set(value)\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface FilterInitializingFalsyValueGetterContext<V> {\n isInitializingRun: true;\n targetValue: V\n}\nexport interface FilterUpdatingFalsyValueGetterContext<V> {\n isInitializingRun: false;\n targetValue: V\n previousValue: V\n}\nexport type FilterFalsyValueGetterContextOf<V> =\n | FilterInitializingFalsyValueGetterContext<V>\n | FilterUpdatingFalsyValueGetterContext<V>\nexport interface FilterOptions<V> {\n target: ValueReactor<V>;\n truthyPredicate: (value: V) => boolean;\n falsyValueGetter: (context: FilterFalsyValueGetterContextOf<V>) => V;\n}\n/**\n * Returns a Signal that only updates its value from the target\n * ValueReactor when the predicate function returns true.\n */\nexport const filter = <V>(\n options: FilterOptions<V>\n): Signal<V> => {\n const { target, truthyPredicate, falsyValueGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect((context) => {\n const value = target.get()\n if (truthyPredicate(value) === true) {\n result.set(value)\n } else {\n const { isInitializingRun } = context\n if (isInitializingRun === true) {\n const fallbackValue = falsyValueGetter({\n isInitializingRun,\n targetValue: value\n })\n result.set(fallbackValue)\n } else {\n const fallbackValue = falsyValueGetter({\n isInitializingRun,\n targetValue: value,\n previousValue: result.getWithoutTrack()\n })\n result.set(fallbackValue)\n }\n }\n })\n\n return result\n}\n\nexport interface AuditByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after every specified count of emissions.\n */\nexport const auditByCount = <V>(\n options: AuditByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"auditByCount operator requires count to be greater than 0\")\n }\n\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n result.set(latestValue)\n emissionCount = 0\n }\n }\n })\n\n return result\n}\n\nexport interface AuditByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at specified time intervals.\n */\nexport const auditByTime = <V>(\n options: AuditByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"auditByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<V>(() => target.getWithoutTrack(), {\n onDispose: () => {\n clearInterval(intervalId)\n }\n })\n\n const intervalId = setInterval(() => {\n result.set(target.getWithoutTrack())\n }, time)\n\n return result\n}\n\nexport interface AuditByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that only updates its value when the trigger\n * ValueReactor emits a value, using the latest value from the target\n * ValueReactor.\n */\nexport const auditByTrigger = <VTarget, VTrigger>(\n options: AuditByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface AuditByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if auditing was started by the open ValueReactor.\n */\nexport const auditByToggle = <VTarget, VOpen, VClose>(\n options: AuditByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let auditValue: VTarget | undefined = undefined\n let auditing = false\n\n const eOpen = effect(() => {\n open.get()\n auditing = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (auditing === true) {\n auditValue = value\n }\n })\n\n const eClose = effect(() => {\n close.get()\n if (auditing === true) {\n if (auditValue !== undefined) {\n result.set(auditValue)\n }\n auditing = false\n auditValue = undefined\n }\n })\n\n return result\n}\n\nexport interface AuditByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next audit period.\n */\nexport const auditByDynamic = <VTarget, VDynamic>(\n options: AuditByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eDynamic.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n const eDynamic = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n result.set(targetValue)\n })\n\n return result\n}\n\nexport interface DebounceByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after the specified count of emissions\n * without being updated.\n */\nexport const debounceByCount = <V>(\n options: DebounceByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"debounceByCount operator requires count to be greater than 0\")\n }\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n result.set(latestValue)\n emissionCount = 0\n }\n }\n })\n\n return result\n}\n\nexport interface DebounceByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after the specified time in milliseconds\n * has passed since the last update.\n */\nexport const debounceByTime = <V>(\n options: DebounceByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"debounceTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n clearTimeout(timeoutId)\n }\n })\n\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n clearTimeout(timeoutId)\n timeoutId = setTimeout(() => {\n result.set(latestValue)\n timeoutId = undefined\n }, time)\n }\n })\n\n return result\n}\n\nexport interface DebounceByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor whenever the trigger ValueReactor\n * emits a value.\n */\nexport const debounceByTrigger = <VTarget, VTrigger>(\n options: DebounceByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface DebounceByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if debouncing was started by the open ValueReactor.\n */\nexport const debounceByToggle = <VTarget, VOpen, VClose>(\n options: DebounceByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let debounceValue: VTarget | undefined = undefined\n let debouncing = false\n\n const eOpen = effect(() => {\n open.get()\n debouncing = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (debouncing === true) {\n debounceValue = value\n }\n })\n\n const eClose = effect(() => {\n close.get()\n if (debouncing === true) {\n if (debounceValue !== undefined) {\n result.set(debounceValue)\n }\n debouncing = false\n debounceValue = undefined\n }\n })\n\n return result\n}\n\nexport interface DebounceByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next debounce period.\n */\nexport const debounceByDynamic = <VTarget, VDynamic>(\n options: DebounceByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eDynamic.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n const eDynamic = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n result.set(targetValue)\n })\n\n return result\n}\n\nexport interface ThrottleByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once every specified count of emissions.\n */\nexport const throttleByCount = <V>(\n options: ThrottleByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"throttleByCount operator requires count to be greater than 0\")\n }\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (emissionCount === 0) {\n result.set(latestValue)\n }\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n emissionCount = 0\n }\n })\n\n return result\n}\n\nexport interface ThrottleByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once every specified time in milliseconds.\n */\nexport const throttleByTime = <V>(\n options: ThrottleByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"throttleByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let canEmit = true\n const eTarget = effect(() => {\n const latestValue = target.get()\n\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n setTimeout(() => {\n canEmit = true\n }, time)\n }\n })\n\n return result\n}\n\nexport interface ThrottleByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once whenever the trigger\n * ValueReactor emits.\n */\nexport const throttleByTrigger = <VTarget, VTrigger>(\n options: ThrottleByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n eTarget.dispose()\n }\n })\n\n let canEmit = false\n const eTrigger = effect(() => {\n trigger.get()\n canEmit = true\n })\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n }\n })\n\n return result\n}\n\nexport interface ThrottleByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if throttling was started by the open ValueReactor.\n */\nexport const throttleByToggle = <VTarget, VOpen, VClose>(\n options: ThrottleByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let throttling = false\n\n const eOpen = effect(() => {\n open.get()\n throttling = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (throttling === true) {\n result.set(value)\n throttling = false\n }\n })\n\n const eClose = effect(() => {\n close.get()\n throttling = false\n })\n\n return result\n}\n\nexport interface ThrottleByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next throttle period.\n */\nexport const throttleByDynamic = <VTarget, VDynamic>(\n options: ThrottleByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n eTarget.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n let canEmit = true\n const eTrigger = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n canEmit = true\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n }\n })\n\n return result\n}\n\nexport interface DistinctOptions<V, K> {\n target: ValueReactor<V>;\n keyGetter?: (value: V) => K;\n}\n/**\n * Returns a Signal that only updates its value with unique values\n * from the target ValueReactor, determined by the key returned from\n * the keyGetter function.\n */\nexport const distinct = <V, K>(\n options: DistinctOptions<V, K>\n): Signal<V> => {\n const { target, keyGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const preparedKeyGetter = keyGetter ?? ((value: V): K => (value as unknown) as K)\n\n const keySet = new Set<K>()\n const eTarget = effect(() => {\n const newValue = target.get()\n const key = preparedKeyGetter(newValue);\n if (keySet.has(key) === false) {\n result.set(newValue)\n keySet.add(key)\n }\n })\n\n return result\n}\n\nexport interface DistinctUntilChangedOptions<V, K> {\n target: ValueReactor<V>;\n keyGetter?: (value: V) => K;\n}\n/**\n * Returns a Signal that only updates its value when the key returned\n * from the keyGetter function changes between emissions.\n */\nexport const distinctUntilChanged = <V, K>(\n options: DistinctUntilChangedOptions<V, K>\n): Signal<V> => {\n const { target, keyGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const preparedKeyGetter = keyGetter ?? ((value: V): K => (value as unknown) as K)\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n let lastKey: K = Symbol(\"initial-key-for-distinct-until-changed\") as unknown as K\n const eTarget = effect(() => {\n const newValue = target.get()\n const key = preparedKeyGetter(newValue);\n if (key !== lastKey) {\n result.set(newValue)\n lastKey = key\n }\n })\n\n return result\n}\n\nexport interface TakeByPredicateOptions<V> {\n target: ValueReactor<V>;\n predicate: (value: V) => boolean;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only while the predicate function\n * returns true.\n */\nexport const takeByPredicate = <V>(\n options: TakeByPredicateOptions<V>\n): Signal<V> => {\n const { target, predicate } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (predicate(latestValue) === true) {\n result.set(latestValue)\n } else {\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface TakeByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only for the first `count` emissions.\n */\nexport const takeByCount = <V>(\n options: TakeByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"takeByCount operator requires count to be greater than 0\")\n }\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let takenCount = 0\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (takenCount < count) {\n result.set(latestValue)\n takenCount = takenCount + 1\n }\n if (takenCount >= count) {\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface TakeByTimeOptions<T> {\n target: ValueReactor<T>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only for the specified time in milliseconds.\n */\nexport const takeByTime = <T>(\n options: TakeByTimeOptions<T>\n): Signal<T> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"takeByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<T>(castValueInitializer<T>(), {\n onDispose: () => {\n eTarget.dispose()\n clearTimeout(timeoutId)\n }\n })\n\n const timeoutId = setTimeout(() => {\n eTarget.dispose()\n }, time)\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n result.set(latestValue)\n })\n\n return result\n}\n\nexport interface TakeByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor whenever the trigger ValueReactor emits a value.\n */\nexport const takeByTrigger = <VTarget, VTrigger>(\n options: TakeByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface TakeByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if taking was started by the open ValueReactor.\n */\nexport const takeByToggle = <VTarget, VOpen, VClose>(\n options: TakeByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let taking = false\n\n const eOpen = effect(() => {\n open.get()\n taking = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (taking === true) {\n result.set(value)\n }\n })\n\n const eClose = effect(() => {\n close.get()\n taking = false\n })\n\n return result\n}\n\nexport interface TakeUntilTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor until the trigger ValueReactor emits a value.\n */\nexport const takeUntilTrigger = <VTarget, VTrigger>(\n options: TakeUntilTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eTrigger.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n result.set(latestValue)\n })\n\n const eTrigger = effect((context) => {\n trigger.get()\n if (context.isInitializingRun === false) {\n eTarget.dispose()\n eTrigger.dispose()\n }\n })\n\n return result\n}\n"
30
+ "import type { Signal, SignalValueInitializer, ValueReactor } from \"../reactor-core/index.ts\"\n\nimport { castValueInitializer } from \"./utility.ts\"\nimport { effect, signal } from \"../reactor-core/index.ts\"\n\nexport interface CurrentOptions<V> {\n target: ValueReactor<V>;\n}\n/**\n * Returns a Signal that holds the current value of the target ValueReactor.\n */\nexport const current = <V>(\n options: CurrentOptions<V>\n): Signal<V> => {\n const { target } = options;\n\n const result = signal<V>(() => {\n return target.get()\n })\n\n return result\n}\n\nexport interface NextOptions<V> {\n target: ValueReactor<V>;\n valueInitializer: SignalValueInitializer<V>\n}\n/**\n * Returns a Signal that holds the next value of the target ValueReactor\n * after the initial value.\n *\n * The Signal will update its value only once, upon the next change of\n * the target ValueReactor, and then it will not update anymore.\n */\nexport const next = <V>(\n options: NextOptions<V>\n): Signal<V> => {\n const { target, valueInitializer } = options;\n\n const result = signal(valueInitializer, {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect((context) => {\n const { isInitializingRun } = context\n\n const value = target.get()\n if (isInitializingRun === false) {\n result.set(value)\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface FilterInitializingFalsyValueGetterContext<V> {\n isInitializingRun: true;\n targetValue: V\n}\nexport interface FilterUpdatingFalsyValueGetterContext<V> {\n isInitializingRun: false;\n targetValue: V\n previousValue: V\n}\nexport type FilterFalsyValueGetterContextOf<V> =\n | FilterInitializingFalsyValueGetterContext<V>\n | FilterUpdatingFalsyValueGetterContext<V>\nexport interface FilterOptions<V> {\n target: ValueReactor<V>;\n truthyPredicate: (value: V) => boolean;\n falsyValueGetter: (context: FilterFalsyValueGetterContextOf<V>) => V;\n}\n/**\n * Returns a Signal that only updates its value from the target\n * ValueReactor when the predicate function returns true.\n */\nexport const filter = <V>(\n options: FilterOptions<V>\n): Signal<V> => {\n const { target, truthyPredicate, falsyValueGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect((context) => {\n const value = target.get()\n if (truthyPredicate(value) === true) {\n result.set(value)\n } else {\n const { isInitializingRun } = context\n if (isInitializingRun === true) {\n const fallbackValue = falsyValueGetter({\n isInitializingRun,\n targetValue: value\n })\n result.set(fallbackValue)\n } else {\n const fallbackValue = falsyValueGetter({\n isInitializingRun,\n targetValue: value,\n previousValue: result.getWithoutTrack()\n })\n result.set(fallbackValue)\n }\n }\n })\n\n return result\n}\n\nexport interface AuditByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after every specified count of emissions.\n */\nexport const auditByCount = <V>(\n options: AuditByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"auditByCount operator requires count to be greater than 0\")\n }\n\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n result.set(latestValue)\n emissionCount = 0\n }\n }\n })\n\n return result\n}\n\nexport interface AuditByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at specified time intervals.\n */\nexport const auditByTime = <V>(\n options: AuditByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"auditByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<V>(() => target.getWithoutTrack(), {\n onDispose: () => {\n clearInterval(intervalId)\n }\n })\n\n const intervalId = setInterval(() => {\n result.set(target.getWithoutTrack())\n }, time)\n\n return result\n}\n\nexport interface AuditByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that only updates its value when the trigger\n * ValueReactor emits a value, using the latest value from the target\n * ValueReactor.\n */\nexport const auditByTrigger = <VTarget, VTrigger>(\n options: AuditByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface AuditByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if auditing was started by the open ValueReactor.\n */\nexport const auditByToggle = <VTarget, VOpen, VClose>(\n options: AuditByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let auditValue: VTarget | undefined = undefined\n let auditing = false\n\n const eOpen = effect(() => {\n open.get()\n auditing = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (auditing === true) {\n auditValue = value\n }\n })\n\n const eClose = effect(() => {\n close.get()\n if (auditing === true) {\n if (auditValue !== undefined) {\n result.set(auditValue)\n }\n auditing = false\n auditValue = undefined\n }\n })\n\n return result\n}\n\nexport interface AuditByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next audit period.\n */\nexport const auditByDynamic = <VTarget, VDynamic>(\n options: AuditByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eDynamic.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n const eDynamic = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n result.set(targetValue)\n })\n\n return result\n}\n\nexport interface DebounceByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after the specified count of emissions\n * without being updated.\n */\nexport const debounceByCount = <V>(\n options: DebounceByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"debounceByCount operator requires count to be greater than 0\")\n }\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n result.set(latestValue)\n emissionCount = 0\n }\n }\n })\n\n return result\n}\n\nexport interface DebounceByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor after the specified time in milliseconds\n * has passed since the last update.\n */\nexport const debounceByTime = <V>(\n options: DebounceByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"debounceTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n clearTimeout(timeoutId)\n }\n })\n\n const eTarget = effect((context) => {\n const latestValue = target.get()\n\n if (context.isInitializingRun === true) {\n result.set(latestValue)\n } else {\n clearTimeout(timeoutId)\n timeoutId = setTimeout(() => {\n result.set(latestValue)\n timeoutId = undefined\n }, time)\n }\n })\n\n return result\n}\n\nexport interface DebounceByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor whenever the trigger ValueReactor\n * emits a value.\n */\nexport const debounceByTrigger = <VTarget, VTrigger>(\n options: DebounceByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface DebounceByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if debouncing was started by the open ValueReactor.\n */\nexport const debounceByToggle = <VTarget, VOpen, VClose>(\n options: DebounceByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let debounceValue: VTarget | undefined = undefined\n let debouncing = false\n\n const eOpen = effect(() => {\n open.get()\n debouncing = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (debouncing === true) {\n debounceValue = value\n }\n })\n\n const eClose = effect(() => {\n close.get()\n if (debouncing === true) {\n if (debounceValue !== undefined) {\n result.set(debounceValue)\n }\n debouncing = false\n debounceValue = undefined\n }\n })\n\n return result\n}\n\nexport interface DebounceByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next debounce period.\n */\nexport const debounceByDynamic = <VTarget, VDynamic>(\n options: DebounceByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eDynamic.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n const eDynamic = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n result.set(targetValue)\n })\n\n return result\n}\n\nexport interface ThrottleByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once every specified count of emissions.\n */\nexport const throttleByCount = <V>(\n options: ThrottleByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"throttleByCount operator requires count to be greater than 0\")\n }\n\n const result = signal(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let emissionCount = 0\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (emissionCount === 0) {\n result.set(latestValue)\n }\n emissionCount = emissionCount + 1\n if (emissionCount >= count) {\n emissionCount = 0\n }\n })\n\n return result\n}\n\nexport interface ThrottleByTimeOptions<V> {\n target: ValueReactor<V>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once every specified time in milliseconds.\n */\nexport const throttleByTime = <V>(\n options: ThrottleByTimeOptions<V>\n): Signal<V> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"throttleByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let canEmit = true\n const eTarget = effect(() => {\n const latestValue = target.get()\n\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n setTimeout(() => {\n canEmit = true\n }, time)\n }\n })\n\n return result\n}\n\nexport interface ThrottleByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor at most once whenever the trigger\n * ValueReactor emits.\n */\nexport const throttleByTrigger = <VTarget, VTrigger>(\n options: ThrottleByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n eTarget.dispose()\n }\n })\n\n let canEmit = false\n const eTrigger = effect(() => {\n trigger.get()\n canEmit = true\n })\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n }\n })\n\n return result\n}\n\nexport interface ThrottleByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if throttling was started by the open ValueReactor.\n */\nexport const throttleByToggle = <VTarget, VOpen, VClose>(\n options: ThrottleByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let throttling = false\n\n const eOpen = effect(() => {\n open.get()\n throttling = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (throttling === true) {\n result.set(value)\n throttling = false\n }\n })\n\n const eClose = effect(() => {\n close.get()\n throttling = false\n })\n\n return result\n}\n\nexport interface ThrottleByDynamicOptions<VTarget, VDynamic> {\n target: ValueReactor<VTarget>;\n dynamic: (value: VTarget) => ValueReactor<VDynamic>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the ValueReactor returned by the `dynamic`\n * function emits. The `dynamic` function is called each time after emitting\n * to get a new ValueReactor for the next throttle period.\n */\nexport const throttleByDynamic = <VTarget, VDynamic>(\n options: ThrottleByDynamicOptions<VTarget, VDynamic>\n): Signal<VTarget> => {\n const { target, dynamic } = options;\n\n const result = signal(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n eTarget.dispose()\n }\n })\n\n let trigger: ValueReactor<VDynamic> | undefined = undefined\n let canEmit = true\n const eTrigger = effect(() => {\n trigger?.dispose()\n const targetValue = target.getWithoutTrack()\n trigger = dynamic(targetValue)\n trigger.get()\n canEmit = true\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (canEmit === true) {\n result.set(latestValue)\n canEmit = false\n }\n })\n\n return result\n}\n\nexport interface DistinctOptions<V, K> {\n target: ValueReactor<V>;\n keyGetter?: (value: V) => K;\n}\n/**\n * Returns a Signal that only updates its value with unique values\n * from the target ValueReactor, determined by the key returned from\n * the keyGetter function.\n */\nexport const distinct = <V, K>(\n options: DistinctOptions<V, K>\n): Signal<V> => {\n const { target, keyGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const preparedKeyGetter = keyGetter ?? ((value: V): K => (value as unknown) as K)\n\n const keySet = new Set<K>()\n const eTarget = effect(() => {\n const newValue = target.get()\n const key = preparedKeyGetter(newValue);\n if (keySet.has(key) === false) {\n result.set(newValue)\n keySet.add(key)\n }\n })\n\n return result\n}\n\nexport interface DistinctUntilChangedOptions<V, K> {\n target: ValueReactor<V>;\n keyGetter?: (value: V) => K;\n}\n/**\n * Returns a Signal that only updates its value when the key returned\n * from the keyGetter function changes between emissions.\n */\nexport const distinctUntilChanged = <V, K>(\n options: DistinctUntilChangedOptions<V, K>\n): Signal<V> => {\n const { target, keyGetter } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n const preparedKeyGetter = keyGetter ?? ((value: V): K => (value as unknown) as K)\n\n // oxlint-disable-next-line no-unsafe-type-assertion\n let lastKey: K = Symbol(\"initial-key-for-distinct-until-changed\") as unknown as K\n const eTarget = effect(() => {\n const newValue = target.get()\n const key = preparedKeyGetter(newValue);\n if (key !== lastKey) {\n result.set(newValue)\n lastKey = key\n }\n })\n\n return result\n}\n\nexport interface TakeByPredicateOptions<V> {\n target: ValueReactor<V>;\n predicate: (value: V) => boolean;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only while the predicate function\n * returns true.\n */\nexport const takeByPredicate = <V>(\n options: TakeByPredicateOptions<V>\n): Signal<V> => {\n const { target, predicate } = options;\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (predicate(latestValue) === true) {\n result.set(latestValue)\n } else {\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface TakeByCountOptions<V> {\n target: ValueReactor<V>;\n count: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only for the first `count` emissions.\n */\nexport const takeByCount = <V>(\n options: TakeByCountOptions<V>\n): Signal<V> => {\n const { target, count } = options;\n\n if (count <= 0) {\n throw new Error(\"takeByCount operator requires count to be greater than 0\")\n }\n\n const result = signal<V>(castValueInitializer<V>(), {\n onDispose: () => {\n eTarget.dispose()\n }\n })\n\n let takenCount = 0\n const eTarget = effect(() => {\n const latestValue = target.get()\n if (takenCount < count) {\n result.set(latestValue)\n takenCount = takenCount + 1\n }\n if (takenCount >= count) {\n eTarget.dispose()\n }\n })\n\n return result\n}\n\nexport interface TakeByTimeOptions<T> {\n target: ValueReactor<T>;\n time: number;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor, but only for the specified time in milliseconds.\n */\nexport const takeByTime = <T>(\n options: TakeByTimeOptions<T>\n): Signal<T> => {\n const { target, time } = options;\n\n if (time <= 0) {\n throw new Error(\"takeByTime operator requires timeInMilliseconds to be greater than 0\")\n }\n\n const result = signal<T>(castValueInitializer<T>(), {\n onDispose: () => {\n eTarget.dispose()\n clearTimeout(timeoutId)\n }\n })\n\n const timeoutId = setTimeout(() => {\n eTarget.dispose()\n }, time)\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n result.set(latestValue)\n })\n\n return result\n}\n\nexport interface TakeByTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor whenever the trigger ValueReactor emits a value.\n */\nexport const takeByTrigger = <VTarget, VTrigger>(\n options: TakeByTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTrigger.dispose()\n }\n })\n\n const eTrigger = effect(() => {\n trigger.get()\n result.set(target.getWithoutTrack())\n })\n\n return result\n}\n\nexport interface TakeByToggleOptions<VTarget, VOpen, VClose> {\n target: ValueReactor<VTarget>;\n open: ValueReactor<VOpen>;\n close: ValueReactor<VClose>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor when the close ValueReactor emits, but only\n * if taking was started by the open ValueReactor.\n */\nexport const takeByToggle = <VTarget, VOpen, VClose>(\n options: TakeByToggleOptions<VTarget, VOpen, VClose>\n): Signal<VTarget> => {\n const { target, open, close } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eOpen.dispose()\n eClose.dispose()\n }\n })\n\n let taking = false\n\n const eOpen = effect(() => {\n open.get()\n taking = true\n })\n\n const eTarget = effect(() => {\n const value = target.get()\n if (taking === true) {\n result.set(value)\n }\n })\n\n const eClose = effect(() => {\n close.get()\n taking = false\n })\n\n return result\n}\n\nexport interface TakeUntilTriggerOptions<VTarget, VTrigger> {\n target: ValueReactor<VTarget>;\n trigger: ValueReactor<VTrigger>;\n}\n/**\n * Returns a Signal that updates its value with the latest value from\n * the target ValueReactor until the trigger ValueReactor emits a value.\n */\nexport const takeUntilTrigger = <VTarget, VTrigger>(\n options: TakeUntilTriggerOptions<VTarget, VTrigger>\n): Signal<VTarget> => {\n const { target, trigger } = options;\n\n const result = signal<VTarget>(castValueInitializer<VTarget>(), {\n onDispose: () => {\n eTarget.dispose()\n eTrigger.dispose()\n }\n })\n\n const eTarget = effect(() => {\n const latestValue = target.get()\n result.set(latestValue)\n })\n\n const eTrigger = effect((context) => {\n trigger.get()\n if (context.isInitializingRun === false) {\n eTarget.dispose()\n eTrigger.dispose()\n }\n })\n\n return result\n}\n",
31
+ "const internalBase64Pattern = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/\nconst internalNormalizeBase64 = (input: string): string => {\n return input.replaceAll(/\\s+/g, \"\")\n}\n/**\n * Check whether input is a valid Base64 string.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isBase64(\"aGVsbG8=\")\n * // Expect: false\n * const example2 = isBase64(\"abc\")\n * ```\n */\nexport const isBase64 = (input: string): boolean => {\n const normalizedInput = internalNormalizeBase64(input)\n return internalBase64Pattern.test(normalizedInput)\n}\n\nconst internalAssertValidBase64 = (input: string): void => {\n if (internalBase64Pattern.test(input) === false) {\n throw new TypeError(\"Invalid Base64 input\")\n }\n}\n/**\n * Assert input is a valid Base64 string.\n *\n * @throws {TypeError} when input is not valid Base64\n */\nexport const assertBase64 = (input: string): void => {\n const normalizedInput = internalNormalizeBase64(input)\n internalAssertValidBase64(normalizedInput)\n}\n\nconst internalStringToBase64ByBrowserApi = (input: string): string => {\n const bytes = new TextEncoder().encode(input)\n let binaryString = \"\"\n\n bytes.forEach((byte) => {\n binaryString = binaryString + String.fromCodePoint(byte)\n })\n\n return btoa(binaryString)\n}\n/**\n * Convert a UTF-8 string into a Base64 string.\n *\n * @example\n * ```\n * // Expect: \"aGVsbG8=\"\n * const example1 = stringToBase64(\"hello\")\n * // Expect: \"5L2g5aW9\"\n * const example2 = stringToBase64(\"你好\")\n * ```\n */\nexport const stringToBase64 = (input: string): string => {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(input, \"utf8\").toString(\"base64\")\n }\n\n if (typeof btoa !== \"undefined\") {\n return internalStringToBase64ByBrowserApi(input)\n }\n\n throw new Error(\"No Base64 runtime support found\")\n}\n\nconst internalBase64ToStringByBrowserApi = (input: string): string => {\n const binaryString = atob(input)\n const bytes = Uint8Array.from(binaryString, char => char.codePointAt(0) ?? 0)\n return new TextDecoder().decode(bytes)\n}\n/**\n * Convert a valid Base64 string into a UTF-8 string.\n *\n * @example\n * ```\n * // Expect: \"hello\"\n * const example1 = base64ToString(\"aGVsbG8=\")\n * // Expect: \"你好\"\n * const example2 = base64ToString(\"5L2g5aW9\")\n * ```\n */\nexport const base64ToString = (input: string): string => {\n const normalizedInput = internalNormalizeBase64(input)\n internalAssertValidBase64(normalizedInput)\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(normalizedInput, \"base64\").toString(\"utf8\")\n }\n\n if (typeof atob !== \"undefined\") {\n return internalBase64ToStringByBrowserApi(normalizedInput)\n }\n\n throw new Error(\"No Base64 runtime support found\")\n}\n",
32
+ "\nconst internalUUID_REGEXP = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n/**\n * Check whether input is a valid UUID string.\n *\n * @example\n * ```\n * // Expect: true\n * const example1 = isUuid(\"550e8400-e29b-41d4-a716-446655440000\")\n * // Expect: false\n * const example2 = isUuid(\"not-a-uuid\")\n * ```\n */\nexport const isUuid = (input: string): boolean => {\n return internalUUID_REGEXP.test(input)\n}\n\n/**\n * Assert input is a valid UUID string.\n *\n * @example\n * ```\n * // Expect: no throw\n * const example1 = assertUuid(\"550e8400-e29b-41d4-a716-446655440000\")\n * // Expect: throws TypeError\n * const example2 = () => assertUuid(\"not-a-uuid\")\n * ```\n *\n * @throws {TypeError} when input is not a valid UUID\n */\nexport const assertUuid = (input: string): void => {\n if (isUuid(input) === false) {\n throw new TypeError(`Expected a valid UUID string, got: ${input}`)\n }\n}\n\n/**\n * Get the version number from a valid UUID string.\n *\n * @example\n * ```\n * // Expect: 4\n * const example1 = getUuidVersion(\"550e8400-e29b-41d4-a716-446655440000\")\n * // Expect: 1\n * const example2 = getUuidVersion(\"123e4567-e89b-12d3-a456-426614174000\")\n * ```\n *\n * @throws {TypeError} when input is not a valid UUID\n */\nexport const getUuidVersion = (input: string): number => {\n // 1) Ensure the input is a syntactically valid UUID string.\n // If invalid, assertUuid throws TypeError and prevents unsafe parsing.\n assertUuid(input)\n\n // 2) Per UUID canonical format xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx,\n // the version nibble is the first hex digit of the 3rd group.\n // In a 36-char UUID string, that position is index 14.\n\n // 3) Convert the single hex character (for example \"4\") to a base-10 number.\n // parseInt(\"4\", 16) -> 4, parseInt(\"a\", 16) -> 10.\n return Number.parseInt(input[14]!, 16)\n}\n\n/**\n * Generate a RFC 4122 version-4 UUID string.\n *\n * @example\n * ```\n * const example1 = generateUuid()\n * // Expect: true\n * const example2 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(example1)\n * ```\n */\nexport const generateUuid = (): string => {\n if (typeof crypto === \"object\") {\n if (typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID()\n }\n\n if (typeof crypto.getRandomValues === \"function\" && typeof Uint8Array === \"function\") {\n const buffer = new Uint8Array(16)\n crypto.getRandomValues(buffer)\n\n // Per RFC 4122, set bits for version and `clock_seq_hi_and_reserved`\n buffer[6] = (buffer[6]! & 0x0F) | 0x40 // version 4\n buffer[8] = (buffer[8]! & 0x3F) | 0x80 // variant 1\n\n // Convert buffer to UUID string format\n const hex = [...buffer].map(b => b.toString(16).padStart(2, \"0\")).join(\"\")\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`\n }\n }\n\n // Fallback for environments without crypto support\n const fallbackUUID = (): string => {\n const random = (a: number): string => {\n return ((a ^ ((Math.random() * 16) >> (a / 4))) & 15).toString(16)\n }\n return \"10000000-1000-4000-8000-100000000000\".replaceAll(/[018]/g, (char: string) => random(Number(char)))\n }\n\n return fallbackUUID()\n}\n"
30
33
  ],
31
- "mappings": "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",
32
- "debugId": "295BB88C3404446C64756E2164756E21",
34
+ "mappings": "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",
35
+ "debugId": "9BF9A0BA58E860B064756E2164756E21",
33
36
  "names": []
34
37
  }