@lee-zg/melange 1.0.0 → 1.2.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.
Files changed (39) hide show
  1. package/dist/chunk-3RM45M64.js +1637 -0
  2. package/dist/chunk-3RM45M64.js.map +1 -0
  3. package/dist/{chunk-ALBD5XC5.js → chunk-GXFWPL5M.js} +4 -8
  4. package/dist/chunk-GXFWPL5M.js.map +1 -0
  5. package/dist/{chunk-Q73NOVWX.cjs → chunk-KUJARU3D.cjs} +7 -24
  6. package/dist/chunk-KUJARU3D.cjs.map +1 -0
  7. package/dist/{chunk-2PXWQDZC.js → chunk-MBBJMHTS.js} +3 -5
  8. package/dist/chunk-MBBJMHTS.js.map +1 -0
  9. package/dist/{chunk-ZT6HVG4G.cjs → chunk-UYJUSNDI.cjs} +4 -8
  10. package/dist/chunk-UYJUSNDI.cjs.map +1 -0
  11. package/dist/{chunk-Q7XG6YN6.cjs → chunk-V5THPEB2.cjs} +3 -5
  12. package/dist/chunk-V5THPEB2.cjs.map +1 -0
  13. package/dist/{chunk-352XNR3C.js → chunk-VGZMISJD.js} +7 -24
  14. package/dist/chunk-VGZMISJD.js.map +1 -0
  15. package/dist/chunk-YZVCK6VZ.cjs +1646 -0
  16. package/dist/chunk-YZVCK6VZ.cjs.map +1 -0
  17. package/dist/core/index.cjs +23 -23
  18. package/dist/core/index.js +1 -1
  19. package/dist/fp/index.cjs +45 -45
  20. package/dist/fp/index.js +1 -1
  21. package/dist/index.cjs +147 -147
  22. package/dist/index.js +4 -4
  23. package/dist/plugins/index.cjs +9 -9
  24. package/dist/plugins/index.d.cts +287 -133
  25. package/dist/plugins/index.d.ts +287 -133
  26. package/dist/plugins/index.js +1 -1
  27. package/dist/utils/index.cjs +73 -73
  28. package/dist/utils/index.js +1 -1
  29. package/package.json +5 -2
  30. package/dist/chunk-2PXWQDZC.js.map +0 -1
  31. package/dist/chunk-352XNR3C.js.map +0 -1
  32. package/dist/chunk-ALBD5XC5.js.map +0 -1
  33. package/dist/chunk-O7K662J5.cjs +0 -842
  34. package/dist/chunk-O7K662J5.cjs.map +0 -1
  35. package/dist/chunk-Q73NOVWX.cjs.map +0 -1
  36. package/dist/chunk-Q7XG6YN6.cjs.map +0 -1
  37. package/dist/chunk-YGMBCZJQ.js +0 -833
  38. package/dist/chunk-YGMBCZJQ.js.map +0 -1
  39. package/dist/chunk-ZT6HVG4G.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/object.ts","../src/utils/array.ts","../src/utils/string.ts","../src/utils/timing.ts","../src/utils/guards.ts"],"names":["result","__name","first"],"mappings":"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","file":"chunk-KUJARU3D.cjs","sourcesContent":["/**\n * @fileoverview 对象操作工具\n * @module melange/utils/object\n * @description 提供深度克隆、合并和\n * 安全操作 JavaScript 对象的工具。\n */\n\n/**\n * 创建对象的深度克隆。\n * 处理嵌套对象、数组、日期和其他内置类型。\n *\n * @description\n * 此函数创建输入的真实深度副本,意味着嵌套\n * 对象也会被克隆而不是引用。它处理循环\n * 引用和特殊对象类型。\n *\n * @example\n * ```typescript\n * const original = { a: 1, b: { c: 2 } };\n * const clone = deepClone(original);\n *\n * clone.b.c = 3;\n * console.log(original.b.c); // 2 (未改变)\n * ```\n *\n * @template T - 要克隆的值的类型\n * @param value - 要克隆的值\n * @returns 值的深度副本\n */\nexport function deepClone<T>(value: T): T {\n // Handle primitives and null\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Handle Date\n if (value instanceof Date) {\n return new Date(value.getTime()) as unknown as T;\n }\n\n // Handle RegExp\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags) as unknown as T;\n }\n\n // Handle Array\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as unknown as T;\n }\n\n // Handle Map\n if (value instanceof Map) {\n const result = new Map();\n value.forEach((v, k) => {\n result.set(deepClone(k), deepClone(v));\n });\n return result as unknown as T;\n }\n\n // Handle Set\n if (value instanceof Set) {\n const result = new Set();\n value.forEach(v => {\n result.add(deepClone(v));\n });\n return result as unknown as T;\n }\n\n // Handle plain objects\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n\n return result as unknown as T;\n}\n\n/**\n * 深度合并多个对象为一个。\n * 后面的对象会覆盖前面对象的冲突键。\n *\n * @example\n * ```typescript\n * const base = { a: 1, b: { c: 2, d: 3 } };\n * const override = { b: { c: 4 } };\n * const merged = deepMerge(base, override);\n * // { a: 1, b: { c: 4, d: 3 } }\n * ```\n *\n * @template T - 合并对象的类型\n * @param objects - 要合并的对象\n * @returns 合并后的对象\n */\nexport function deepMerge<T extends object>(...objects: Partial<T>[]): T {\n const result: Record<string, unknown> = {};\n\n for (const obj of objects) {\n if (!obj) continue;\n\n for (const key of Object.keys(obj)) {\n const targetValue = result[key];\n const sourceValue = (obj as Record<string, unknown>)[key];\n\n if (isPlainObject(targetValue) && isPlainObject(sourceValue)) {\n result[key] = deepMerge(targetValue, sourceValue);\n } else {\n result[key] = deepClone(sourceValue);\n }\n }\n }\n\n return result as T;\n}\n\n/**\n * 从对象中选择指定属性。\n *\n * @example\n * ```typescript\n * const user = { id: 1, name: 'John', email: 'john@example.com' };\n * const partial = pick(user, ['id', 'name']);\n * // { id: 1, name: 'John' }\n * ```\n *\n * @template T - 对象类型\n * @template K - 要选择的键\n * @param obj - 源对象\n * @param keys - 要选择的键\n * @returns 只包含指定键的新对象\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: readonly K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n\n return result;\n}\n\n/**\n * 从对象中省略指定属性。\n *\n * @example\n * ```typescript\n * const user = { id: 1, name: 'John', password: 'secret' };\n * const safe = omit(user, ['password']);\n * // { id: 1, name: 'John' }\n * ```\n *\n * @template T - 对象类型\n * @template K - 要省略的键\n * @param obj - 源对象\n * @param keys - 要省略的键\n * @returns 不包含指定键的新对象\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: readonly K[]): Omit<T, K> {\n const keysSet = new Set<keyof T>(keys);\n const result = {} as Omit<T, K>;\n\n for (const key of Object.keys(obj) as Array<keyof T>) {\n if (!keysSet.has(key)) {\n (result as Record<keyof T, unknown>)[key] = obj[key];\n }\n }\n\n return result;\n}\n\n/**\n * 使用路径字符串或数组获取嵌套属性值。\n *\n * @example\n * ```typescript\n * const obj = { a: { b: { c: 42 } } };\n * get(obj, 'a.b.c'); // 42\n * get(obj, ['a', 'b', 'c']); // 42\n * get(obj, 'a.x.y', 'default'); // 'default'\n * ```\n *\n * @template T - 默认值类型\n * @param obj - 要获取的对象\n * @param path - 属性路径\n * @param defaultValue - 路径不存在时的默认值\n * @returns 路径处的值或默认值\n */\nexport function get<T = unknown>(\n obj: unknown,\n path: string | readonly string[],\n defaultValue?: T\n): T {\n const keys = typeof path === 'string' ? path.split('.') : path;\n let result: unknown = obj;\n\n for (const key of keys) {\n if (result == null || typeof result !== 'object') {\n return defaultValue as T;\n }\n result = (result as Record<string, unknown>)[key];\n }\n\n return (result === undefined ? defaultValue : result) as T;\n}\n\n/**\n * 使用路径字符串或数组设置嵌套属性值。\n * 根据需要创建中间对象。\n *\n * @example\n * ```typescript\n * const obj = { a: { b: 1 } };\n * set(obj, 'a.c.d', 42);\n * // { a: { b: 1, c: { d: 42 } } }\n * ```\n *\n * @template T - 对象类型\n * @param obj - 要修改的对象\n * @param path - 属性路径\n * @param value - 要设置的值\n * @returns 修改后的对象\n */\nexport function set<T extends object>(obj: T, path: string | readonly string[], value: unknown): T {\n const keys = typeof path === 'string' ? path.split('.') : path;\n let current: Record<string, unknown> = obj as Record<string, unknown>;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (key === undefined) continue;\n\n if (current[key] == null || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (lastKey !== undefined) {\n current[lastKey] = value;\n }\n\n return obj;\n}\n\n/**\n * 检查对象是否具有嵌套属性。\n *\n * @example\n * ```typescript\n * const obj = { a: { b: { c: 42 } } };\n * has(obj, 'a.b.c'); // true\n * has(obj, 'a.x'); // false\n * ```\n *\n * @param obj - 要检查的对象\n * @param path - 要检查的路径\n * @returns 如果路径存在则返回 true\n */\nexport function has(obj: unknown, path: string | readonly string[]): boolean {\n const keys = typeof path === 'string' ? path.split('.') : path;\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current == null || typeof current !== 'object') {\n return false;\n }\n if (!(key in current)) {\n return false;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return true;\n}\n\n/**\n * 检查值是否为普通对象(非数组、null 或其他类型)。\n *\n * @param value - 要检查的值\n * @returns 如果值是普通对象则返回 true\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value) as unknown;\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * 从键值对创建对象。\n *\n * @example\n * ```typescript\n * fromEntries([['a', 1], ['b', 2]]);\n * // { a: 1, b: 2 }\n * ```\n *\n * @template K - 键类型\n * @template V - 值类型\n * @param entries - 键值对数组\n * @returns 从条目创建的对象\n */\nexport function fromEntries<K extends string | number | symbol, V>(\n entries: readonly (readonly [K, V])[]\n): Record<K, V> {\n const result = {} as Record<K, V>;\n\n for (const [key, value] of entries) {\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * 映射对象值同时保留键。\n *\n * @example\n * ```typescript\n * const prices = { apple: 1, banana: 2 };\n * const doubled = mapValues(prices, v => v * 2);\n * // { apple: 2, banana: 4 }\n * ```\n *\n * @template T - 原始值类型\n * @template U - 映射值类型\n * @param obj - 要映射的对象\n * @param fn - 映射函数\n * @returns 具有映射值的对象\n */\nexport function mapValues<T, U>(\n obj: Record<string, T>,\n fn: (value: T, key: string) => U\n): Record<string, U> {\n const result: Record<string, U> = {};\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (value !== undefined) {\n result[key] = fn(value, key);\n }\n }\n\n return result;\n}\n\n/**\n * 基于谓词过滤对象条目。\n *\n * @example\n * ```typescript\n * const prices = { apple: 1, banana: 2, cherry: 3 };\n * const expensive = filterObject(prices, v => v > 1);\n * // { banana: 2, cherry: 3 }\n * ```\n *\n * @template T - 值类型\n * @param obj - 要过滤的对象\n * @param predicate - 过滤函数\n * @returns 过滤后的对象\n */\nexport function filterObject<T>(\n obj: Record<string, T>,\n predicate: (value: T, key: string) => boolean\n): Record<string, T> {\n const result: Record<string, T> = {};\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (value !== undefined && predicate(value, key)) {\n result[key] = value;\n }\n }\n\n return result;\n}\n","/**\n * @fileoverview 数组操作工具\n * @module melange/utils/array\n * @description 提供操作数组的工具,包括\n * 分块、扁平化、分组和排序。\n */\n\n/**\n * 将数组拆分为指定大小的块。\n *\n * @example\n * ```typescript\n * chunk([1, 2, 3, 4, 5], 2);\n * // [[1, 2], [3, 4], [5]]\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要分块的数组\n * @param size - 块大小\n * @returns 块数组\n */\nexport function chunk<T>(array: readonly T[], size: number): T[][] {\n if (size <= 0) {\n throw new Error('Chunk size must be positive');\n }\n\n const result: T[][] = [];\n\n for (let i = 0; i < array.length; i += size) {\n result.push(array.slice(i, i + size));\n }\n\n return result;\n}\n\n/**\n * 将嵌套数组扁平化一级。\n *\n * @example\n * ```typescript\n * flatten([[1, 2], [3, 4], [5]]);\n * // [1, 2, 3, 4, 5]\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要扁平化的嵌套数组\n * @returns 扁平化后的数组\n */\nexport function flatten<T>(array: readonly (T | readonly T[])[]): T[] {\n const result: T[] = [];\n\n for (const item of array) {\n if (Array.isArray(item)) {\n result.push(...item);\n } else {\n result.push(item as T);\n }\n }\n\n return result;\n}\n\n/**\n * 深度扁平化嵌套数组。\n *\n * @example\n * ```typescript\n * flattenDeep([1, [2, [3, [4, 5]]]]);\n * // [1, 2, 3, 4, 5]\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要扁平化的嵌套数组\n * @returns 深度扁平化后的数组\n */\nexport function flattenDeep<T>(array: readonly unknown[]): T[] {\n const result: T[] = [];\n\n function flattenHelper(arr: readonly unknown[]): void {\n for (const item of arr) {\n if (Array.isArray(item)) {\n flattenHelper(item);\n } else {\n result.push(item as T);\n }\n }\n }\n\n flattenHelper(array);\n return result;\n}\n\n/**\n * 返回数组中的唯一元素。\n *\n * @example\n * ```typescript\n * unique([1, 2, 2, 3, 3, 3]);\n * // [1, 2, 3]\n *\n * const users = [{ id: 1 }, { id: 2 }, { id: 1 }];\n * unique(users, u => u.id);\n * // [{ id: 1 }, { id: 2 }]\n * ```\n *\n * @template T - 数组元素类型\n * @template K - 唯一性的键类型\n * @param array - 要去重的数组\n * @param keyFn - 提取比较键的可选函数\n * @returns 包含唯一元素的数组\n */\nexport function unique<T, K = T>(array: readonly T[], keyFn?: (item: T) => K): T[] {\n if (!keyFn) {\n return [...new Set(array)];\n }\n\n const seen = new Set<K>();\n const result: T[] = [];\n\n for (const item of array) {\n const key = keyFn(item);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(item);\n }\n }\n\n return result;\n}\n\n/**\n * 按键对数组元素进行分组。\n *\n * @example\n * ```typescript\n * const users = [\n * { name: 'Alice', age: 25 },\n * { name: 'Bob', age: 30 },\n * { name: 'Charlie', age: 25 }\n * ];\n *\n * groupBy(users, u => u.age);\n * // {\n * // 25: [{ name: 'Alice', age: 25 }, { name: 'Charlie', age: 25 }],\n * // 30: [{ name: 'Bob', age: 30 }]\n * // }\n * ```\n *\n * @template T - 数组元素类型\n * @template K - 分组键类型\n * @param array - 要分组的数组\n * @param keyFn - 提取分组键的函数\n * @returns 包含分组元素的对象\n */\nexport function groupBy<T, K extends string | number | symbol>(\n array: readonly T[],\n keyFn: (item: T) => K\n): Record<K, T[]> {\n const result = {} as Record<K, T[]>;\n\n for (const item of array) {\n const key = keyFn(item);\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(item);\n }\n\n return result;\n}\n\n/**\n * 按键对数组进行排序,返回新的排序数组。\n *\n * @example\n * ```typescript\n * const users = [\n * { name: 'Charlie', age: 25 },\n * { name: 'Alice', age: 30 },\n * { name: 'Bob', age: 20 }\n * ];\n *\n * sortBy(users, u => u.age);\n * // 按年龄升序排列\n *\n * sortBy(users, u => u.name, 'desc');\n * // 按姓名降序排列\n * ```\n *\n * @template T - 数组元素类型\n * @template K - 排序键类型\n * @param array - 要排序的数组\n * @param keyFn - 提取排序键的函数\n * @param order - 排序顺序: 'asc' 或 'desc'\n * @returns 新的排序数组\n */\nexport function sortBy<T, K extends string | number>(\n array: readonly T[],\n keyFn: (item: T) => K,\n order: 'asc' | 'desc' = 'asc'\n): T[] {\n const multiplier = order === 'asc' ? 1 : -1;\n\n return [...array].sort((a, b) => {\n const keyA = keyFn(a);\n const keyB = keyFn(b);\n\n if (keyA < keyB) return -1 * multiplier;\n if (keyA > keyB) return 1 * multiplier;\n return 0;\n });\n}\n\n/**\n * 根据谓词将数组分区为两个数组。\n *\n * @example\n * ```typescript\n * const [evens, odds] = partition([1, 2, 3, 4, 5], n => n % 2 === 0);\n * // evens = [2, 4], odds = [1, 3, 5]\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要分区的数组\n * @param predicate - 分区谓词\n * @returns [匹配, 不匹配] 数组的元组\n */\nexport function partition<T>(array: readonly T[], predicate: (item: T) => boolean): [T[], T[]] {\n const pass: T[] = [];\n const fail: T[] = [];\n\n for (const item of array) {\n if (predicate(item)) {\n pass.push(item);\n } else {\n fail.push(item);\n }\n }\n\n return [pass, fail];\n}\n\n/**\n * 将多个数组压缩在一起。\n *\n * @example\n * ```typescript\n * zip([1, 2, 3], ['a', 'b', 'c']);\n * // [[1, 'a'], [2, 'b'], [3, 'c']]\n *\n * zip([1, 2], ['a', 'b', 'c']);\n * // [[1, 'a'], [2, 'b']]\n * ```\n *\n * @template T - 第一个数组元素类型\n * @template U - 第二个数组元素类型\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 元组数组\n */\nexport function zip<T, U>(arr1: readonly T[], arr2: readonly U[]): Array<[T, U]> {\n const length = Math.min(arr1.length, arr2.length);\n const result: Array<[T, U]> = [];\n\n for (let i = 0; i < length; i++) {\n const first = arr1[i];\n const second = arr2[i];\n if (first !== undefined && second !== undefined) {\n result.push([first, second]);\n }\n }\n\n return result;\n}\n\n/**\n * 返回数组的第一个元素,如果为空则返回 undefined。\n *\n * @example\n * ```typescript\n * first([1, 2, 3]); // 1\n * first([]); // undefined\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 数组\n * @returns 第一个元素或 undefined\n */\nexport function first<T>(array: readonly T[]): T | undefined {\n return array[0];\n}\n\n/**\n * 返回数组的最后一个元素,如果为空则返回 undefined。\n *\n * @example\n * ```typescript\n * last([1, 2, 3]); // 3\n * last([]); // undefined\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 数组\n * @returns 最后一个元素或 undefined\n */\nexport function last<T>(array: readonly T[]): T | undefined {\n return array[array.length - 1];\n}\n\n/**\n * 从数组中返回随机元素。\n *\n * @example\n * ```typescript\n * sample([1, 2, 3, 4, 5]); // 随机元素\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 数组\n * @returns 随机元素,如果为空则返回 undefined\n */\nexport function sample<T>(array: readonly T[]): T | undefined {\n if (array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n\n/**\n * 随机打乱数组(Fisher-Yates 算法),返回新数组。\n *\n * @example\n * ```typescript\n * shuffle([1, 2, 3, 4, 5]); // 随机打乱\n * ```\n *\n * @template T - 数组元素类型\n * @param array - 要打乱的数组\n * @returns 新的打乱数组\n */\nexport function shuffle<T>(array: readonly T[]): T[] {\n const result = [...array];\n\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j] as T, result[i] as T];\n }\n\n return result;\n}\n\n/**\n * 创建从开始到结束(不包含)的数字数组。\n *\n * @example\n * ```typescript\n * range(5); // [0, 1, 2, 3, 4]\n * range(1, 5); // [1, 2, 3, 4]\n * range(0, 10, 2); // [0, 2, 4, 6, 8]\n * ```\n *\n * @param startOrEnd - 如果只有这一个参数,则为结束值;否则为开始值\n * @param end - 结束值(不包含)\n * @param step - 数字之间的步长\n * @returns 数字数组\n */\nexport function range(startOrEnd: number, end?: number, step: number = 1): number[] {\n let start = 0;\n let finalEnd = startOrEnd;\n\n if (end !== undefined) {\n start = startOrEnd;\n finalEnd = end;\n }\n\n if (step === 0) {\n throw new Error('Step cannot be zero');\n }\n\n const result: number[] = [];\n\n if (step > 0) {\n for (let i = start; i < finalEnd; i += step) {\n result.push(i);\n }\n } else {\n for (let i = start; i > finalEnd; i += step) {\n result.push(i);\n }\n }\n\n return result;\n}\n\n/**\n * 返回两个数组的交集。\n *\n * @example\n * ```typescript\n * intersection([1, 2, 3], [2, 3, 4]); // [2, 3]\n * ```\n *\n * @template T - 数组元素类型\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 两个数组中存在的元素\n */\nexport function intersection<T>(arr1: readonly T[], arr2: readonly T[]): T[] {\n const set2 = new Set(arr2);\n return arr1.filter(item => set2.has(item));\n}\n\n/**\n * 返回两个数组的差集(在 arr1 中但不在 arr2 中的元素)。\n *\n * @example\n * ```typescript\n * difference([1, 2, 3], [2, 3, 4]); // [1]\n * ```\n *\n * @template T - 数组元素类型\n * @param arr1 - 第一个数组\n * @param arr2 - 第二个数组\n * @returns 在 arr1 中但不在 arr2 中的元素\n */\nexport function difference<T>(arr1: readonly T[], arr2: readonly T[]): T[] {\n const set2 = new Set(arr2);\n return arr1.filter(item => !set2.has(item));\n}\n","/**\n * @fileoverview 字符串操作工具\n * @module melange/utils/string\n * @description 提供字符串操作工具,包括\n * 大小写转换、截断和格式化。\n */\n\n/**\n * 将字符串的第一个字母大写。\n *\n * @example\n * ```typescript\n * capitalize('hello'); // 'Hello'\n * capitalize('HELLO'); // 'HELLO'\n * ```\n *\n * @param str - 要大写的字符串\n * @returns 大写后的字符串\n */\nexport function capitalize(str: string): string {\n if (str.length === 0) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * 将字符串转换为驼峰命名法。\n *\n * @example\n * ```typescript\n * camelCase('hello world'); // 'helloWorld'\n * camelCase('hello-world'); // 'helloWorld'\n * camelCase('hello_world'); // 'helloWorld'\n * camelCase('HelloWorld'); // 'helloWorld'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 驼峰命名法字符串\n */\nexport function camelCase(str: string): string {\n return str\n .replace(/[\\s_-]+(.)?/g, (_, char: string | undefined) => (char ? char.toUpperCase() : ''))\n .replace(/^[A-Z]/, char => char.toLowerCase());\n}\n\n/**\n * 将字符串转换为帕斯卡命名法。\n *\n * @example\n * ```typescript\n * pascalCase('hello world'); // 'HelloWorld'\n * pascalCase('hello-world'); // 'HelloWorld'\n * pascalCase('hello_world'); // 'HelloWorld'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 帕斯卡命名法字符串\n */\nexport function pascalCase(str: string): string {\n return capitalize(camelCase(str));\n}\n\n/**\n * 将字符串转换为蛇形命名法。\n *\n * @example\n * ```typescript\n * snakeCase('helloWorld'); // 'hello_world'\n * snakeCase('HelloWorld'); // 'hello_world'\n * snakeCase('hello-world'); // 'hello_world'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 蛇形命名法字符串\n */\nexport function snakeCase(str: string): string {\n return str\n .replace(/[\\s-]+/g, '_')\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n .toLowerCase();\n}\n\n/**\n * 将字符串转换为烤肉串命名法。\n *\n * @example\n * ```typescript\n * kebabCase('helloWorld'); // 'hello-world'\n * kebabCase('HelloWorld'); // 'hello-world'\n * kebabCase('hello_world'); // 'hello-world'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 烤肉串命名法字符串\n */\nexport function kebabCase(str: string): string {\n return str\n .replace(/[\\s_]+/g, '-')\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase();\n}\n\n/**\n * 将字符串转换为常量命名法。\n *\n * @example\n * ```typescript\n * constantCase('helloWorld'); // 'HELLO_WORLD'\n * constantCase('hello-world'); // 'HELLO_WORLD'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 常量命名法字符串\n */\nexport function constantCase(str: string): string {\n return snakeCase(str).toUpperCase();\n}\n\n/**\n * 将字符串截断到最大长度,必要时添加省略号。\n *\n * @example\n * ```typescript\n * truncate('Hello, World!', 10); // 'Hello, ...'\n * truncate('Hello', 10); // 'Hello'\n * truncate('Hello, World!', 10, '…'); // 'Hello, Wo…'\n * ```\n *\n * @param str - 要截断的字符串\n * @param maxLength - 最大长度\n * @param suffix - 要添加的后缀(默认:'...')\n * @returns 截断后的字符串\n */\nexport function truncate(str: string, maxLength: number, suffix: string = '...'): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * 在字符串左侧填充到最小长度。\n *\n * @example\n * ```typescript\n * padStart('5', 3, '0'); // '005'\n * padStart('42', 3, '0'); // '042'\n * ```\n *\n * @param str - 要填充的字符串\n * @param length - 目标长度\n * @param padChar - 填充字符\n * @returns 填充后的字符串\n */\nexport function padStart(str: string, length: number, padChar: string = ' '): string {\n if (str.length >= length) return str;\n const padding = padChar.repeat(Math.ceil((length - str.length) / padChar.length));\n return (padding + str).slice(-length);\n}\n\n/**\n * 在字符串右侧填充到最小长度。\n *\n * @example\n * ```typescript\n * padEnd('5', 3, '0'); // '500'\n * padEnd('42', 3, '0'); // '420'\n * ```\n *\n * @param str - 要填充的字符串\n * @param length - 目标长度\n * @param padChar - 填充字符\n * @returns 填充后的字符串\n */\nexport function padEnd(str: string, length: number, padChar: string = ' '): string {\n if (str.length >= length) return str;\n const padding = padChar.repeat(Math.ceil((length - str.length) / padChar.length));\n return (str + padding).slice(0, length);\n}\n\n/**\n * 删除前导和尾随空白并折叠多个空格。\n *\n * @example\n * ```typescript\n * collapseWhitespace(' hello world '); // 'hello world'\n * ```\n *\n * @param str - 要清理的字符串\n * @returns 清理后的字符串\n */\nexport function collapseWhitespace(str: string): string {\n return str.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * 转义特殊字符以在 HTML 中使用。\n *\n * @example\n * ```typescript\n * escapeHtml('<script>alert(\"xss\")</script>');\n * // '&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;'\n * ```\n *\n * @param str - 要转义的字符串\n * @returns 转义后的字符串\n */\nexport function escapeHtml(str: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n };\n\n return str.replace(/[&<>\"']/g, char => htmlEntities[char] ?? char);\n}\n\n/**\n * 反转义 HTML 实体。\n *\n * @example\n * ```typescript\n * unescapeHtml('&lt;div&gt;Hello&lt;/div&gt;');\n * // '<div>Hello</div>'\n * ```\n *\n * @param str - 要反转义的字符串\n * @returns 反转义后的字符串\n */\nexport function unescapeHtml(str: string): string {\n const htmlEntities: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&apos;': \"'\",\n };\n\n return str.replace(/&(?:amp|lt|gt|quot|#39|apos);/g, entity => htmlEntities[entity] ?? entity);\n}\n\n/**\n * 生成指定长度的随机字符串。\n *\n * @example\n * ```typescript\n * randomString(10); // 'a1b2c3d4e5'\n * randomString(8, 'abc'); // 'abcabcab'\n * ```\n *\n * @param length - 要生成的字符串长度\n * @param chars - 要使用的字符(默认:字母数字)\n * @returns 随机字符串\n */\nexport function randomString(\n length: number,\n chars: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n): string {\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n\n return result;\n}\n\n/**\n * 从字符串中提取单词。\n *\n * @example\n * ```typescript\n * words('helloWorld'); // ['hello', 'World']\n * words('hello-world'); // ['hello', 'world']\n * words('hello_world'); // ['hello', 'world']\n * ```\n *\n * @param str - 要提取单词的字符串\n * @returns 单词数组\n */\nexport function words(str: string): string[] {\n return str\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[\\s_-]+/g, ' ')\n .trim()\n .split(' ')\n .filter(word => word.length > 0);\n}\n\n/**\n * 将字符串转换为标题大小写。\n *\n * @example\n * ```typescript\n * titleCase('hello world'); // 'Hello World'\n * titleCase('the quick brown fox'); // 'The Quick Brown Fox'\n * ```\n *\n * @param str - 要转换的字符串\n * @returns 标题大小写字符串\n */\nexport function titleCase(str: string): string {\n return words(str)\n .map(word => capitalize(word.toLowerCase()))\n .join(' ');\n}\n\n/**\n * 反转字符串。\n *\n * @example\n * ```typescript\n * reverse('hello'); // 'olleh'\n * ```\n *\n * @param str - 要反转的字符串\n * @returns 反转后的字符串\n */\nexport function reverse(str: string): string {\n return [...str].reverse().join('');\n}\n\n/**\n * 计算子字符串的出现次数。\n *\n * @example\n * ```typescript\n * countOccurrences('hello hello hello', 'hello'); // 3\n * ```\n *\n * @param str - 要搜索的字符串\n * @param substr - 要计数的子字符串\n * @returns 出现次数\n */\nexport function countOccurrences(str: string, substr: string): number {\n if (substr.length === 0) return 0;\n\n let count = 0;\n let pos = 0;\n\n while ((pos = str.indexOf(substr, pos)) !== -1) {\n count++;\n pos += substr.length;\n }\n\n return count;\n}\n","/**\n * @fileoverview 计时和速率限制工具\n * @module melange/utils/timing\n * @description 提供防抖、节流、延迟、\n * 重试和超时处理的工具。\n */\n\nimport type { AnyFunction } from '../types';\n\n/**\n * 创建函数的防抖版本。\n * 防抖函数会延迟调用,直到自上次调用防抖函数以来经过了 `wait` 毫秒。\n *\n * @description\n * 防抖对于限制用户输入事件(如在搜索框中打字)的速率很有用,\n * 您希望等到用户停止打字后再进行 API 调用。\n *\n * @example\n * ```typescript\n * const search = debounce((query: string) => {\n * console.log('搜索中:', query);\n * }, 300);\n *\n * search('h');\n * search('he');\n * search('hel');\n * search('hell');\n * search('hello');\n * // 只在 300ms 无调用后记录 '搜索中: hello'\n * ```\n *\n * @template T - 函数类型\n * @param fn - 要防抖的函数\n * @param wait - 等待的毫秒数\n * @param options - 可选配置\n * @returns 函数的防抖版本\n */\nexport function debounce<T extends AnyFunction>(\n fn: T,\n wait: number,\n options?: { leading?: boolean; trailing?: boolean }\n): T & { cancel: () => void; flush: () => void } {\n const { leading = false, trailing = true } = options ?? {};\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n let lastThis: unknown = null;\n let result: ReturnType<T>;\n\n function invokeFunc(): void {\n if (lastArgs !== null) {\n result = fn.apply(lastThis, lastArgs) as ReturnType<T>;\n lastArgs = null;\n lastThis = null;\n }\n }\n\n function debounced(this: unknown, ...args: Parameters<T>): ReturnType<T> {\n lastArgs = args;\n lastThis = this;\n\n if (leading && timeoutId === null) {\n invokeFunc();\n }\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n if (trailing) {\n invokeFunc();\n }\n timeoutId = null;\n }, wait);\n\n return result;\n }\n\n debounced.cancel = (): void => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastArgs = null;\n lastThis = null;\n };\n\n debounced.flush = (): void => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n if (trailing) {\n invokeFunc();\n }\n }\n };\n\n return debounced as T & { cancel: () => void; flush: () => void };\n}\n\n/**\n * 创建函数的节流版本。\n * 节流函数每 `limit` 毫秒最多调用一次。\n *\n * @description\n * 节流对于限制频繁触发的事件(如滚动或调整大小事件)的速率很有用,\n * 您希望确保处理程序以一致的速率运行。\n *\n * @example\n * ```typescript\n * const onScroll = throttle(() => {\n * console.log('滚动位置:', window.scrollY);\n * }, 100);\n *\n * window.addEventListener('scroll', onScroll);\n * // 滚动期间最多每 100ms 记录一次\n * ```\n *\n * @template T - 函数类型\n * @param fn - 要节流的函数\n * @param limit - 调用之间的最小时间\n * @returns 函数的节流版本\n */\nexport function throttle<T extends AnyFunction>(fn: T, limit: number): T & { cancel: () => void } {\n let lastCall = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let lastArgs: Parameters<T> | null = null;\n let lastThis: unknown = null;\n\n function throttled(this: unknown, ...args: Parameters<T>): ReturnType<T> | undefined {\n const now = Date.now();\n const remaining = limit - (now - lastCall);\n\n lastArgs = args;\n lastThis = this;\n\n if (remaining <= 0) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastCall = now;\n return fn.apply(this, args) as ReturnType<T>;\n }\n\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n lastCall = Date.now();\n timeoutId = null;\n if (lastArgs !== null) {\n fn.apply(lastThis, lastArgs);\n lastArgs = null;\n lastThis = null;\n }\n }, remaining);\n }\n\n return undefined;\n }\n\n throttled.cancel = (): void => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n lastArgs = null;\n lastThis = null;\n };\n\n return throttled as T & { cancel: () => void };\n}\n\n/**\n * 创建在指定延迟后解决的承诺。\n *\n * @example\n * ```typescript\n * console.log('开始');\n * await delay(1000);\n * console.log('1秒后');\n *\n * // 带值\n * const result = await delay(1000, 'hello');\n * console.log(result); // 'hello'\n * ```\n *\n * @template T - 值类型\n * @param ms - 延迟毫秒数\n * @param value - 解决时的可选值\n * @returns 在延迟后解决的承诺\n */\nexport function delay<T = void>(ms: number, value?: T): Promise<T> {\n return new Promise(resolve => setTimeout(() => resolve(value as T), ms));\n}\n\n/**\n * 重试异步函数直到成功或达到最大重试次数。\n *\n * @example\n * ```typescript\n * const result = await retry(\n * () => fetch('/api/data').then(r => r.json()),\n * {\n * maxRetries: 3,\n * delay: 1000,\n * backoff: 'exponential'\n * }\n * );\n * ```\n *\n * @template T - 返回类型\n * @param fn - 要重试的异步函数\n * @param options - 重试选项\n * @returns 函数的结果\n * @throws 如果所有重试都失败,则抛出最后一个错误\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options?: {\n maxRetries?: number;\n delay?: number;\n backoff?: 'none' | 'linear' | 'exponential';\n onRetry?: (error: unknown, attempt: number) => void;\n }\n): Promise<T> {\n const { maxRetries = 3, delay: retryDelay = 1000, backoff = 'none', onRetry } = options ?? {};\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt < maxRetries) {\n onRetry?.(error, attempt + 1);\n\n let waitTime = retryDelay;\n if (backoff === 'linear') {\n waitTime = retryDelay * (attempt + 1);\n } else if (backoff === 'exponential') {\n waitTime = retryDelay * Math.pow(2, attempt);\n }\n\n await delay(waitTime);\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * 用超时包装承诺。\n *\n * @example\n * ```typescript\n * try {\n * const result = await timeout(fetch('/api/data'), 5000);\n * } catch (error) {\n * if (error.message.includes('timed out')) {\n * console.log('请求耗时太长');\n * }\n * }\n * ```\n *\n * @template T - 承诺结果类型\n * @param promise - 要包装的承诺\n * @param ms - 超时毫秒数\n * @param errorMessage - 可选的自定义错误消息\n * @returns 如果超过超时时间则拒绝的承诺\n */\nexport function timeout<T>(promise: Promise<T>, ms: number, errorMessage?: string): Promise<T> {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(errorMessage ?? `Operation timed out after ${ms}ms`));\n }, ms);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimeout(timeoutId);\n });\n}\n\n/**\n * 创建可以从外部解决或拒绝的延迟承诺。\n *\n * @example\n * ```typescript\n * const deferred = createDeferred<string>();\n *\n * setTimeout(() => {\n * deferred.resolve('Hello!');\n * }, 1000);\n *\n * const result = await deferred.promise; // 'Hello!'\n * ```\n *\n * @template T - 承诺结果类型\n * @returns 带有 promise、resolve 和 reject 的延迟对象\n */\nexport function createDeferred<T>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n} {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * 以并发限制运行多个异步函数。\n *\n * @example\n * ```typescript\n * const urls = ['url1', 'url2', 'url3', 'url4', 'url5'];\n *\n * const results = await parallel(\n * urls.map(url => () => fetch(url)),\n * { concurrency: 2 }\n * );\n * ```\n *\n * @template T - 结果类型\n * @param tasks - 异步任务函数数组\n * @param options - 配置选项\n * @returns 结果数组\n */\nexport async function parallel<T>(\n tasks: Array<() => Promise<T>>,\n options?: { concurrency?: number }\n): Promise<T[]> {\n const { concurrency = Infinity } = options ?? {};\n const results: T[] = new Array(tasks.length);\n let currentIndex = 0;\n\n async function runNext(): Promise<void> {\n while (currentIndex < tasks.length) {\n const index = currentIndex++;\n const task = tasks[index];\n if (task) {\n results[index] = await task();\n }\n }\n }\n\n const workers = Array.from({ length: Math.min(concurrency, tasks.length) }, () => runNext());\n\n await Promise.all(workers);\n return results;\n}\n\n/**\n * 顺序运行任务,一个接一个。\n *\n * @example\n * ```typescript\n * const results = await sequence([\n * () => fetch('/api/step1'),\n * () => fetch('/api/step2'),\n * () => fetch('/api/step3'),\n * ]);\n * ```\n *\n * @template T - 结果类型\n * @param tasks - 异步任务函数数组\n * @returns 结果数组\n */\nexport async function sequence<T>(tasks: Array<() => Promise<T>>): Promise<T[]> {\n const results: T[] = [];\n\n for (const task of tasks) {\n results.push(await task());\n }\n\n return results;\n}\n","/**\n * @fileoverview 类型检查和验证工具\n * @module melange/utils/guards\n * @description 提供类型守卫和验证函数用于\n * 运行时类型检查。\n */\n\n/**\n * 检查值是否为字符串。\n *\n * @example\n * ```typescript\n * isString('hello'); // true\n * isString(123); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是字符串则返回 true\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * 检查值是否为数字(且不是 NaN)。\n *\n * @example\n * ```typescript\n * isNumber(123); // true\n * isNumber(NaN); // false\n * isNumber('123'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有限数字则返回 true\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * 检查值是否为布尔值。\n *\n * @example\n * ```typescript\n * isBoolean(true); // true\n * isBoolean(false); // true\n * isBoolean(0); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是布尔值则返回 true\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * 检查值是否为对象(非 null 或数组)。\n *\n * @example\n * ```typescript\n * isObject({}); // true\n * isObject([]); // false\n * isObject(null); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是普通对象则返回 true\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * 检查值是否为数组。\n *\n * @example\n * ```typescript\n * isArray([]); // true\n * isArray([1, 2]); // true\n * isArray({}); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是数组则返回 true\n */\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\n/**\n * 检查值是否为函数。\n *\n * @example\n * ```typescript\n * isFunction(() => {}); // true\n * isFunction(function() {}); // true\n * isFunction(async () => {}); // true\n * isFunction({}); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是函数则返回 true\n */\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === 'function';\n}\n\n/**\n * 检查值是否为 null 或 undefined。\n *\n * @example\n * ```typescript\n * isNil(null); // true\n * isNil(undefined); // true\n * isNil(0); // false\n * isNil(''); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是 null 或 undefined 则返回 true\n */\nexport function isNil(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * 检查值是否不为 null 或 undefined。\n *\n * @example\n * ```typescript\n * isNotNil(0); // true\n * isNotNil(''); // true\n * isNotNil(null); // false\n * isNotNil(undefined); // false\n * ```\n *\n * @template T - 值类型\n * @param value - 要检查的值\n * @returns 如果值不是 null 或 undefined 则返回 true\n */\nexport function isNotNil<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\n/**\n * 检查值是否为\"空\"。\n * 空值:null, undefined, '', [], {}, Map(0), Set(0)\n *\n * @example\n * ```typescript\n * isEmpty(''); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(null); // true\n * isEmpty(0); // false\n * isEmpty('hello'); // false\n * isEmpty([1]); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值为空则返回 true\n */\nexport function isEmpty(value: unknown): boolean {\n if (isNil(value)) return true;\n if (typeof value === 'string') return value.length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (value instanceof Map || value instanceof Set) return value.size === 0;\n if (typeof value === 'object' && value !== null) return Object.keys(value).length === 0;\n return false;\n}\n\n/**\n * 检查值是否不为\"空\"。\n *\n * @example\n * ```typescript\n * isNotEmpty('hello'); // true\n * isNotEmpty([1, 2]); // true\n * isNotEmpty(''); // false\n * isNotEmpty([]); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值不为空则返回 true\n */\nexport function isNotEmpty(value: unknown): boolean {\n return !isEmpty(value);\n}\n\n/**\n * 检查值是否为有效的 Date 对象。\n *\n * @example\n * ```typescript\n * isDate(new Date()); // true\n * isDate(new Date('invalid')); // false\n * isDate('2023-01-01'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有效日期则返回 true\n */\nexport function isDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\n/**\n * 检查值是否为 Promise。\n *\n * @example\n * ```typescript\n * isPromise(Promise.resolve()); // true\n * isPromise(async () => {}); // false (函数,不是 promise)\n * isPromise({ then: () => {} }); // true (thenable)\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是 Promise 或 thenable 则返回 true\n */\nexport function isPromise<T = unknown>(value: unknown): value is Promise<T> {\n return (\n value instanceof Promise ||\n (value !== null &&\n typeof value === 'object' &&\n typeof (value as { then?: unknown }).then === 'function')\n );\n}\n\n/**\n * 检查值是否为 Symbol。\n *\n * @param value - 要检查的值\n * @returns 如果值是 Symbol 则返回 true\n */\nexport function isSymbol(value: unknown): value is symbol {\n return typeof value === 'symbol';\n}\n\n/**\n * 检查值是否为 BigInt。\n *\n * @param value - 要检查的值\n * @returns 如果值是 BigInt 则返回 true\n */\nexport function isBigInt(value: unknown): value is bigint {\n return typeof value === 'bigint';\n}\n\n/**\n * 检查值是否为有效的电子邮件地址。\n *\n * @example\n * ```typescript\n * isEmail('user@example.com'); // true\n * isEmail('user@'); // false\n * isEmail('not-an-email'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有效邮箱则返回 true\n */\nexport function isEmail(value: unknown): boolean {\n if (!isString(value)) return false;\n // Basic email regex - covers most common cases\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(value);\n}\n\n/**\n * 检查值是否为有效的 UUID v4。\n *\n * @example\n * ```typescript\n * isUUID('550e8400-e29b-41d4-a716-446655440000'); // true\n * isUUID('not-a-uuid'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有效 UUID 则返回 true\n */\nexport function isUUID(value: unknown): boolean {\n if (!isString(value)) return false;\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidRegex.test(value);\n}\n\n/**\n * 检查值是否为有效的 URL。\n *\n * @example\n * ```typescript\n * isURL('https://example.com'); // true\n * isURL('http://localhost:3000'); // true\n * isURL('not-a-url'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是有效 URL 则返回 true\n */\nexport function isURL(value: unknown): boolean {\n if (!isString(value)) return false;\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 检查值是否为整数。\n *\n * @example\n * ```typescript\n * isInteger(42); // true\n * isInteger(42.0); // true\n * isInteger(42.5); // false\n * isInteger('42'); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是整数则返回 true\n */\nexport function isInteger(value: unknown): value is number {\n return isNumber(value) && Number.isInteger(value);\n}\n\n/**\n * 检查值是否为正数。\n *\n * @example\n * ```typescript\n * isPositive(1); // true\n * isPositive(0); // false\n * isPositive(-1); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是正数则返回 true\n */\nexport function isPositive(value: unknown): value is number {\n return isNumber(value) && value > 0;\n}\n\n/**\n * 检查值是否为负数。\n *\n * @example\n * ```typescript\n * isNegative(-1); // true\n * isNegative(0); // false\n * isNegative(1); // false\n * ```\n *\n * @param value - 要检查的值\n * @returns 如果值是负数则返回 true\n */\nexport function isNegative(value: unknown): value is number {\n return isNumber(value) && value < 0;\n}\n\n/**\n * 检查值是否在范围内(包含边界)。\n *\n * @example\n * ```typescript\n * isInRange(5, 1, 10); // true\n * isInRange(0, 1, 10); // false\n * isInRange(1, 1, 10); // true\n * isInRange(10, 1, 10); // true\n * ```\n *\n * @param value - 要检查的值\n * @param min - 最小值\n * @param max - 最大值\n * @returns 如果值在范围内则返回 true\n */\nexport function isInRange(value: unknown, min: number, max: number): value is number {\n return isNumber(value) && value >= min && value <= max;\n}\n"]}
@@ -472,9 +472,7 @@ function Timeout(timeoutMs, errorMessage) {
472
472
  descriptor.value = async function(...args) {
473
473
  const timeoutPromise = new Promise((_, reject) => {
474
474
  setTimeout(() => {
475
- reject(
476
- new Error(errorMessage ?? `${methodName} timed out after ${timeoutMs}ms`)
477
- );
475
+ reject(new Error(errorMessage ?? `${methodName} timed out after ${timeoutMs}ms`));
478
476
  }, timeoutMs);
479
477
  });
480
478
  return Promise.race([originalMethod.apply(this, args), timeoutPromise]);
@@ -655,5 +653,5 @@ function combineDisposables(...disposables) {
655
653
  __name(combineDisposables, "combineDisposables");
656
654
 
657
655
  export { Bind, Container, Debounce, Deprecated, Disposable, DisposableStore, EventEmitter, Frozen, Inject, Injectable, Lifecycle, Log, Memoize, Retry, Sealed, Singleton, Throttle, Timeout, Validate, combineDisposables, globalContainer, toDisposable };
658
- //# sourceMappingURL=chunk-2PXWQDZC.js.map
659
- //# sourceMappingURL=chunk-2PXWQDZC.js.map
656
+ //# sourceMappingURL=chunk-MBBJMHTS.js.map
657
+ //# sourceMappingURL=chunk-MBBJMHTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/events.ts","../src/core/container.ts","../src/core/decorators.ts","../src/core/disposable.ts"],"names":["Lifecycle"],"mappings":"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","file":"chunk-MBBJMHTS.js","sourcesContent":["/**\n * @fileoverview 用于发布/订阅模式的事件发射器类\n * @module melange/core/events\n * @description 提供一个类型安全的事件发射器实现\n * 遵循观察者模式。\n */\n\nimport type { EventHandler, Subscription } from '../types';\n\n/**\n * 类型安全的事件映射接口。\n * 扩展此接口以定义您的事件类型。\n *\n * @example\n * ```typescript\n * interface MyEvents {\n * userLogin: { userId: string; timestamp: Date };\n * userLogout: { userId: string };\n * error: Error;\n * }\n *\n * const emitter = new EventEmitter<MyEvents>();\n * emitter.on('userLogin', event => console.log(event.userId));\n * ```\n */\nexport interface EventMap {\n [event: string]: unknown;\n}\n\n/**\n * 带有元数据的内部监听器条目。\n */\ninterface ListenerEntry<T> {\n handler: EventHandler<T>;\n once: boolean;\n}\n\n/**\n * 类型安全的事件发射器类。\n * 实现观察者模式以进行解耦的事件驱动编程。\n *\n * @description\n * EventEmitter 提供了一种订阅和发射事件的方式,具有完整的\n * TypeScript 类型安全性。它支持一次性监听器、监听器移除\n * 和适当的清理。\n *\n * @template Events - 定义事件名称和载荷类型的事件映射类型\n *\n * @example\n * ```typescript\n * interface AppEvents {\n * 'user:created': { id: string; name: string };\n * 'user:deleted': { id: string };\n * 'error': Error;\n * }\n *\n * const events = new EventEmitter<AppEvents>();\n *\n * // 订阅事件\n * events.on('user:created', user => {\n * console.log(`创建用户: ${user.name}`);\n * });\n *\n * // 发射事件\n * events.emit('user:created', { id: '1', name: 'John' });\n *\n * // 一次性监听器\n * events.once('error', err => console.error(err));\n *\n * // 取消订阅\n * const subscription = events.on('user:deleted', handleDelete);\n * subscription.unsubscribe();\n * ```\n */\nexport class EventEmitter<Events extends EventMap = EventMap> {\n /**\n * 事件名称到其监听器的映射\n */\n private listeners: Map<keyof Events, ListenerEntry<unknown>[]> = new Map();\n\n /**\n * 订阅事件。\n *\n * @param event - 要订阅的事件名称\n * @param handler - 事件发射时要调用的处理函数\n * @returns 带有取消订阅方法的订阅对象\n */\n public on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): Subscription {\n return this.addListener(event, handler, false);\n }\n\n /**\n * 仅订阅事件的一次发射。\n * 监听器在被调用一次后自动移除。\n *\n * @param event - 要订阅的事件名称\n * @param handler - 事件发射时要调用的处理函数\n * @returns 带有取消订阅方法的订阅对象\n */\n public once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): Subscription {\n return this.addListener(event, handler, true);\n }\n\n /**\n * 从事件中移除特定监听器。\n *\n * @param event - 事件名称\n * @param handler - 要移除的处理函数\n */\n public off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n const index = eventListeners.findIndex(entry => entry.handler === handler);\n if (index !== -1) {\n eventListeners.splice(index, 1);\n }\n }\n }\n\n /**\n * 发射带有给定载荷的事件。\n * 所有订阅的监听器将同步调用。\n *\n * @param event - 要发射的事件名称\n * @param payload - 事件载荷\n */\n public emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n const eventListeners = this.listeners.get(event);\n if (!eventListeners) return;\n\n // 创建副本以避免监听器修改数组时出现问题\n const listenersCopy = [...eventListeners];\n\n for (const entry of listenersCopy) {\n entry.handler(payload);\n\n if (entry.once) {\n this.off(event, entry.handler as EventHandler<Events[K]>);\n }\n }\n }\n\n /**\n * 移除特定事件的所有监听器,或如果不指定事件则移除所有监听器。\n *\n * @param event - 可选的事件名称,用于清除监听器\n */\n public removeAllListeners<K extends keyof Events>(event?: K): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * 返回特定事件的监听器数量。\n *\n * @param event - 事件名称\n * @returns 监听器数量\n */\n public listenerCount<K extends keyof Events>(event: K): number {\n const eventListeners = this.listeners.get(event);\n return eventListeners?.length ?? 0;\n }\n\n /**\n * 返回所有具有监听器的事件名称。\n *\n * @returns 事件名称数组\n */\n public eventNames(): Array<keyof Events> {\n return Array.from(this.listeners.keys());\n }\n\n /**\n * 添加监听器的内部方法。\n */\n private addListener<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>,\n once: boolean\n ): Subscription {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n\n const entry: ListenerEntry<Events[K]> = { handler, once };\n this.listeners.get(event)!.push(entry as ListenerEntry<unknown>);\n\n return {\n unsubscribe: () => this.off(event, handler),\n };\n }\n}\n","/**\n * @fileoverview 依赖注入容器\n * @module melange/core/container\n * @description 提供一个简单而强大的依赖注入容器\n * 支持单例、工厂函数和自动解析。\n */\n\nimport type { Constructor } from '../types';\n\n/**\n * 用于标识依赖项的令牌类型。\n * 可以是字符串、符号或类构造函数。\n */\nexport type Token<T = unknown> = string | symbol | Constructor<T>;\n\n/**\n * 创建实例的工厂函数类型。\n */\nexport type Factory<T> = (container: Container) => T;\n\n/**\n * 依赖注册的生命周期选项。\n */\nexport enum Lifecycle {\n /** 每次都创建新实例 */\n Transient = 'transient',\n /** 创建单个实例并重复使用 */\n Singleton = 'singleton',\n}\n\n/**\n * 容器中的注册条目。\n */\ninterface Registration<T> {\n factory: Factory<T>;\n lifecycle: Lifecycle;\n instance?: T;\n}\n\n/**\n * 可注入类的元数据键。\n */\nconst INJECTABLE_METADATA = Symbol('melange:injectable');\nconst INJECT_METADATA = Symbol('melange:inject');\n\n/**\n * 依赖注入容器。\n * 管理依赖项的生命周期和解析。\n *\n * @description\n * Container 类提供控制反转 (IoC) 功能,\n * 允许您通过在运行时注册和解析依赖项来解耦代码。\n *\n * @example\n * ```typescript\n * // 创建容器\n * const container = new Container();\n *\n * // 注册类\n * container.register('logger', () => new ConsoleLogger());\n *\n * // 注册单例\n * container.registerSingleton('config', () => loadConfig());\n *\n * // 解析依赖项\n * const logger = container.resolve<Logger>('logger');\n *\n * // 使用装饰器\n * @Injectable()\n * class UserService {\n * constructor(@Inject('logger') private logger: Logger) {}\n * }\n * container.registerClass(UserService);\n * ```\n */\nexport class Container {\n /**\n * 已注册依赖项的映射\n */\n private registrations: Map<Token, Registration<unknown>> = new Map();\n\n /**\n * 用于分层解析的父容器\n */\n private parent: Container | undefined;\n\n /**\n * 创建新的容器实例。\n *\n * @param parent - 用于分层解析的可选父容器\n */\n constructor(parent?: Container) {\n this.parent = parent;\n }\n\n /**\n * 使用工厂函数注册依赖项。\n *\n * @template T - 依赖项类型\n * @param token - 用于标识依赖项的令牌\n * @param factory - 创建依赖项的工厂函数\n * @param lifecycle - 依赖项的生命周期(默认:Transient)\n * @returns 容器实例,用于链式调用\n */\n public register<T>(\n token: Token<T>,\n factory: Factory<T>,\n lifecycle: Lifecycle = Lifecycle.Transient\n ): this {\n this.registrations.set(token, {\n factory: factory as Factory<unknown>,\n lifecycle,\n });\n return this;\n }\n\n /**\n * 注册单例依赖项。\n * 工厂函数只会被调用一次,之后返回相同的实例。\n *\n * @template T - 依赖项类型\n * @param token - 用于标识依赖项的令牌\n * @param factory - 创建依赖项的工厂函数\n * @returns 容器实例,用于链式调用\n */\n public registerSingleton<T>(token: Token<T>, factory: Factory<T>): this {\n return this.register(token, factory, Lifecycle.Singleton);\n }\n\n /**\n * 直接将值注册为单例。\n *\n * @template T - 值类型\n * @param token - 用于标识依赖项的令牌\n * @param value - 要注册的值\n * @returns 容器实例,用于链式调用\n */\n public registerValue<T>(token: Token<T>, value: T): this {\n this.registrations.set(token, {\n factory: () => value,\n lifecycle: Lifecycle.Singleton,\n instance: value,\n });\n return this;\n }\n\n /**\n * 将类注册为依赖项。\n * 类的实例化会自动解析其依赖项。\n *\n * @template T - 类类型\n * @param ClassConstructor - 要注册的类构造函数\n * @param lifecycle - 依赖项的生命周期(默认:Transient)\n * @returns 容器实例,用于链式调用\n */\n public registerClass<T extends object>(\n ClassConstructor: Constructor<T>,\n lifecycle: Lifecycle = Lifecycle.Transient\n ): this {\n const factory: Factory<T> = container => {\n const injectTokens = this.getInjectMetadata(ClassConstructor);\n const dependencies = injectTokens.map(token => container.resolve(token));\n return new ClassConstructor(...dependencies);\n };\n\n return this.register(ClassConstructor, factory, lifecycle);\n }\n\n /**\n * 通过令牌解析依赖项。\n *\n * @template T - 依赖项类型\n * @param token - 标识依赖项的令牌\n * @returns 已解析的依赖项\n * @throws Error 如果依赖项未注册\n */\n public resolve<T>(token: Token<T>): T {\n const registration = this.registrations.get(token) as Registration<T> | undefined;\n\n if (!registration) {\n // 尝试父容器\n if (this.parent) {\n return this.parent.resolve(token);\n }\n throw new Error(`Dependency not registered: ${String(token)}`);\n }\n\n if (registration.lifecycle === Lifecycle.Singleton) {\n if (registration.instance === undefined) {\n registration.instance = registration.factory(this);\n }\n return registration.instance;\n }\n\n return registration.factory(this);\n }\n\n /**\n * 检查依赖项是否已注册。\n *\n * @param token - 要检查的令牌\n * @returns 如果依赖项已注册则返回 true\n */\n public has(token: Token): boolean {\n if (this.registrations.has(token)) {\n return true;\n }\n return this.parent?.has(token) ?? false;\n }\n\n /**\n * 移除依赖项注册。\n *\n * @param token - 要移除的令牌\n * @returns 如果注册已被移除则返回 true\n */\n public unregister(token: Token): boolean {\n return this.registrations.delete(token);\n }\n\n /**\n * 清除所有注册。\n */\n public clear(): void {\n this.registrations.clear();\n }\n\n /**\n * 创建子容器。\n * 子容器从父容器继承注册。\n *\n * @returns 新的子容器\n */\n public createChild(): Container {\n return new Container(this);\n }\n\n /**\n * 获取类的注入元数据。\n */\n private getInjectMetadata(target: Constructor): Token[] {\n // 如果可用则使用 reflect-metadata,否则返回空数组\n const reflect = Reflect as unknown as {\n getMetadata?: (key: symbol, target: unknown) => Token[] | undefined;\n };\n return reflect.getMetadata?.(INJECT_METADATA, target) ?? [];\n }\n}\n\n/**\n * 为了方便而提供的全局容器实例。\n */\nexport const globalContainer = new Container();\n\n// ============================================================================\n// 依赖注入装饰器\n// ============================================================================\n\n/**\n * 将类标记为可注入。\n * 自动依赖解析所必需。\n *\n * @example\n * ```typescript\n * @Injectable()\n * class UserService {\n * constructor(private userRepo: UserRepository) {}\n * }\n * ```\n *\n * @returns 类装饰器\n */\nexport function Injectable(): ClassDecorator {\n return function <TFunction extends Function>(target: TFunction): TFunction {\n // 如果可用则使用 reflect-metadata\n const reflect = Reflect as unknown as {\n defineMetadata?: (key: symbol, value: unknown, target: unknown) => void;\n };\n reflect.defineMetadata?.(INJECTABLE_METADATA, true, target);\n return target;\n };\n}\n\n/**\n * 标记构造函数参数以进行注入。\n *\n * @example\n * ```typescript\n * @Injectable()\n * class UserService {\n * constructor(@Inject('logger') private logger: Logger) {}\n * }\n * ```\n *\n * @param token - 要注入的令牌\n * @returns 参数装饰器\n */\nexport function Inject(token: Token): ParameterDecorator {\n return function (\n target: object,\n _propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n // 如果可用则使用 reflect-metadata\n const reflect = Reflect as unknown as {\n getMetadata?: (key: symbol, target: unknown) => Token[] | undefined;\n defineMetadata?: (key: symbol, value: unknown, target: unknown) => void;\n };\n const existingTokens: Token[] = reflect.getMetadata?.(INJECT_METADATA, target) ?? [];\n existingTokens[parameterIndex] = token;\n reflect.defineMetadata?.(INJECT_METADATA, existingTokens, target);\n };\n}\n\n/**\n * 将类标记为单例。\n * 结合 @Injectable 和单例生命周期。\n *\n * @example\n * ```typescript\n * @Singleton()\n * class ConfigService {\n * // 只会存在一个实例\n * }\n * ```\n *\n * @returns 类装饰器\n */\nexport function Singleton(): ClassDecorator {\n return function <TFunction extends Function>(target: TFunction): TFunction {\n // 如果可用则使用 reflect-metadata\n const reflect = Reflect as unknown as {\n defineMetadata?: (key: symbol | string, value: unknown, target: unknown) => void;\n };\n reflect.defineMetadata?.(INJECTABLE_METADATA, true, target);\n reflect.defineMetadata?.('melange:singleton', true, target);\n return target;\n };\n}\n","/**\n * @fileoverview 方法和类装饰器\n * @module melange/core/decorators\n * @description 提供一系列有用的装饰器,用于增强\n * 类和方法的横切关注点。\n */\n\n/**\n * 用于缓存方法结果的记忆化装饰器。\n * 根据方法的参数缓存结果。\n *\n * @description\n * 此装饰器根据方法的参数缓存其返回值。\n * 后续使用相同参数的调用将返回缓存的值。\n *\n * @example\n * ```typescript\n * class Calculator {\n * @Memoize()\n * fibonacci(n: number): number {\n * if (n <= 1) return n;\n * return this.fibonacci(n - 1) + this.fibonacci(n - 2);\n * }\n * }\n * ```\n *\n * @param keyFn - 生成缓存键的可选函数\n * @returns 方法装饰器\n */\nexport function Memoize(keyFn?: (...args: unknown[]) => string): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n const cache = new Map<string, unknown>();\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const key = keyFn ? keyFn(...args) : JSON.stringify(args);\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n\n const result = originalMethod.apply(this, args);\n cache.set(key, result);\n return result;\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于限制方法调用频率的防抖装饰器。\n * 延迟方法执行直到指定的等待时间过后。\n *\n * @example\n * ```typescript\n * class SearchInput {\n * @Debounce(300)\n * onSearch(query: string): void {\n * // 这将在上次调用后300毫秒才被调用\n * console.log('搜索中:', query);\n * }\n * }\n * ```\n *\n * @param waitMs - 等待的毫秒数\n * @returns 方法装饰器\n */\nexport function Debounce(waitMs: number): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n descriptor.value = function (this: unknown, ...args: unknown[]): void {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n originalMethod.apply(this, args);\n timeoutId = null;\n }, waitMs);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于限制方法调用频率的节流装饰器。\n * 确保方法在指定的时间段内最多被调用一次。\n *\n * @example\n * ```typescript\n * class ScrollHandler {\n * @Throttle(100)\n * onScroll(event: Event): void {\n * // 这将最多每100毫秒被调用一次\n * console.log('滚动中');\n * }\n * }\n * ```\n *\n * @param limitMs - 调用之间的最小时间间隔(毫秒)\n * @returns 方法装饰器\n */\nexport function Throttle(limitMs: number): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n let lastCall = 0;\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const now = Date.now();\n\n if (now - lastCall >= limitMs) {\n lastCall = now;\n return originalMethod.apply(this, args);\n }\n\n return undefined;\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于记录方法调用的日志装饰器。\n * 记录方法进入、退出,以及可选的参数和返回值。\n *\n * @example\n * ```typescript\n * class UserService {\n * @Log({ logArgs: true, logResult: true })\n * getUser(id: string): User {\n * return this.userRepository.findById(id);\n * }\n * }\n * // 日志: \"Entering getUser with args: [\"123\"]\"\n * // 日志: \"Exiting getUser with result: { id: \"123\", name: \"John\" }\"\n * ```\n *\n * @param options - 日志选项\n * @returns 方法装饰器\n */\nexport function Log(\n options: {\n logArgs?: boolean;\n logResult?: boolean;\n prefix?: string;\n } = {}\n): MethodDecorator {\n const { logArgs = false, logResult = false, prefix = '' } = options;\n\n return function (\n _target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n const methodName = String(propertyKey);\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const logPrefix = prefix ? `[${prefix}] ` : '';\n\n if (logArgs) {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Entering ${methodName} with args:`, args);\n } else {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Entering ${methodName}`);\n }\n\n try {\n const result = originalMethod.apply(this, args);\n\n // 处理异步方法\n if (result instanceof Promise) {\n return result\n .then(asyncResult => {\n if (logResult) {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Exiting ${methodName} with result:`, asyncResult);\n } else {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Exiting ${methodName}`);\n }\n return asyncResult;\n })\n .catch(error => {\n // eslint-disable-next-line no-console\n console.error(`${logPrefix}${methodName} threw error:`, error);\n throw error;\n });\n }\n\n if (logResult) {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Exiting ${methodName} with result:`, result);\n } else {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Exiting ${methodName}`);\n }\n\n return result;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`${logPrefix}${methodName} threw error:`, error);\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于验证方法参数的验证装饰器。\n * 在方法执行前运行验证函数。\n *\n * @example\n * ```typescript\n * class UserService {\n * @Validate((id: string) => {\n * if (!id) throw new Error('ID 是必需的');\n * })\n * getUser(id: string): User {\n * return this.userRepository.findById(id);\n * }\n * }\n * ```\n *\n * @param validator - 在输入无效时抛出异常的验证函数\n * @returns 方法装饰器\n */\nexport function Validate(validator: (...args: unknown[]) => void): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n validator(...args);\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于标记方法已弃用的装饰器。\n * 在调用方法时记录警告。\n *\n * @example\n * ```typescript\n * class UserService {\n * @Deprecated('请改用 getUserById')\n * getUser(id: string): User {\n * return this.getUserById(id);\n * }\n * }\n * ```\n *\n * @param message - 弃用消息\n * @returns 方法装饰器\n */\nexport function Deprecated(message?: string): MethodDecorator {\n return function (\n _target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n const methodName = String(propertyKey);\n const warningMessage = message ?? `${methodName} is deprecated`;\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n // eslint-disable-next-line no-console\n console.warn(`[DEPRECATED] ${warningMessage}`);\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于密封类的装饰器。\n * 防止向实例添加新属性。\n *\n * @example\n * ```typescript\n * @Sealed()\n * class Config {\n * readonly apiUrl: string = 'https://api.example.com';\n * }\n *\n * const config = new Config();\n * config.newProp = 'value'; // 错误: 无法添加属性\n * ```\n *\n * @returns 类装饰器\n */\nexport function Sealed(): ClassDecorator {\n return function <TFunction extends Function>(target: TFunction): TFunction {\n Object.seal(target);\n Object.seal(target.prototype);\n return target;\n };\n}\n\n/**\n * 用于冻结类的装饰器。\n * 防止对实例进行任何修改。\n *\n * @example\n * ```typescript\n * @Frozen()\n * class Constants {\n * static readonly PI = 3.14159;\n * }\n *\n * Constants.PI = 3; // 错误: 无法修改\n * ```\n *\n * @returns 类装饰器\n */\nexport function Frozen(): ClassDecorator {\n return function <TFunction extends Function>(target: TFunction): TFunction {\n Object.freeze(target);\n Object.freeze(target.prototype);\n return target;\n };\n}\n\n/**\n * 用于自动将方法绑定到类实例的装饰器。\n * 对于作为回调函数传递的方法很有用。\n *\n * @example\n * ```typescript\n * class Button {\n * @Bind()\n * onClick() {\n * console.log(this); // 总是指向 Button 实例\n * }\n * }\n *\n * const button = new Button();\n * const handler = button.onClick;\n * handler(); // `this` 仍然是 button 实例\n * ```\n *\n * @returns 方法装饰器\n */\nexport function Bind(): MethodDecorator {\n return function (\n _target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n\n return {\n configurable: true,\n get(this: object) {\n const bound = originalMethod.bind(this);\n Object.defineProperty(this, propertyKey, {\n value: bound,\n configurable: true,\n writable: true,\n });\n return bound;\n },\n };\n };\n}\n\n/**\n * 用于自动重试失败方法调用的装饰器。\n *\n * @example\n * ```typescript\n * class ApiClient {\n * @Retry(3, 1000)\n * async fetchData(): Promise<Data> {\n * const response = await fetch('/api/data');\n * if (!response.ok) throw new Error('请求失败');\n * return response.json();\n * }\n * }\n * ```\n *\n * @param maxRetries - 最大重试次数\n * @param delayMs - 重试之间的延迟(毫秒)\n * @returns 方法装饰器\n */\nexport function Retry(maxRetries: number, delayMs: number = 0): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n\n descriptor.value = async function (this: unknown, ...args: unknown[]): Promise<unknown> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n lastError = error;\n\n if (attempt < maxRetries && delayMs > 0) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n\n throw lastError;\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于为异步方法添加超时的装饰器。\n *\n * @example\n * ```typescript\n * class ApiClient {\n * @Timeout(5000)\n * async fetchData(): Promise<Data> {\n * // 如果这花费超过5秒,将抛出异常\n * return await fetch('/api/data').then(r => r.json());\n * }\n * }\n * ```\n *\n * @param timeoutMs - 超时时间(毫秒)\n * @param errorMessage - 可选的错误消息\n * @returns 方法装饰器\n */\nexport function Timeout(timeoutMs: number, errorMessage?: string): MethodDecorator {\n return function (\n _target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => Promise<unknown>;\n const methodName = String(propertyKey);\n\n descriptor.value = async function (this: unknown, ...args: unknown[]): Promise<unknown> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(errorMessage ?? `${methodName} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([originalMethod.apply(this, args), timeoutPromise]);\n };\n\n return descriptor;\n };\n}\n","/**\n * @fileoverview 用于资源管理的可释放基类\n * @module melange/core/disposable\n * @description 提供一个基类用于管理可释放资源\n * 包含适当的清理和生命周期管理。\n */\n\n/**\n * 可释放对象的接口。\n * 实现此接口的对象可以被正确清理。\n */\nexport interface IDisposable {\n /**\n * 释放此对象持有的资源。\n */\n dispose(): void;\n\n /**\n * 此对象是否已被释放。\n */\n readonly isDisposed: boolean;\n}\n\n/**\n * 管理可释放资源的对象的抽象基类。\n *\n * @description\n * Disposable 类提供了一种管理模式,用于管理需要显式清理的资源。\n * 它跟踪释放状态并防止重复释放。\n *\n * @example\n * ```typescript\n * class DatabaseConnection extends Disposable {\n * private connection: Connection;\n *\n * constructor() {\n * super();\n * this.connection = createConnection();\n * // 注册清理\n * this.addDisposable({\n * dispose: () => this.connection.close()\n * });\n * }\n *\n * query(sql: string) {\n * this.ensureNotDisposed();\n * return this.connection.query(sql);\n * }\n * }\n *\n * // 使用\n * const db = new DatabaseConnection();\n * try {\n * await db.query('SELECT * FROM users');\n * } finally {\n * db.dispose();\n * }\n * ```\n */\nexport abstract class Disposable implements IDisposable {\n /**\n * 此对象是否已被释放\n */\n private _isDisposed: boolean = false;\n\n /**\n * 待清理的可释放对象列表\n */\n private readonly disposables: IDisposable[] = [];\n\n /**\n * 获取此对象是否已被释放。\n */\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n /**\n * 释放此对象和所有已注册的可释放对象。\n * 多次调用 dispose 是安全的(后续调用无效)。\n */\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n\n this._isDisposed = true;\n\n // 按相反顺序释放(后进先出)\n for (let i = this.disposables.length - 1; i >= 0; i--) {\n try {\n this.disposables[i]?.dispose();\n } catch (error) {\n // 记录日志但不抛出异常 - 继续释放其他资源\n // eslint-disable-next-line no-console\n console.error('Error during disposal:', error);\n }\n }\n\n this.disposables.length = 0;\n\n // 调用子类清理方法\n this.onDispose();\n }\n\n /**\n * 注册一个可释放对象,在此对象被释放时进行清理。\n *\n * @template T - 可释放对象类型\n * @param disposable - 要注册的可释放对象\n * @returns 相同的可释放对象,用于链式调用\n */\n protected addDisposable<T extends IDisposable>(disposable: T): T {\n if (this._isDisposed) {\n // 如果已经释放,则立即释放新的可释放对象\n disposable.dispose();\n } else {\n this.disposables.push(disposable);\n }\n return disposable;\n }\n\n /**\n * 注册一个清理函数,在此对象被释放时调用。\n *\n * @param fn - 清理函数\n */\n protected addDisposeFn(fn: () => void): void {\n this.addDisposable({ dispose: fn, isDisposed: false });\n }\n\n /**\n * 如果此对象已被释放则抛出错误。\n * 在不应在释放后调用的方法开头使用此函数。\n *\n * @throws Error 如果对象已被释放\n */\n protected ensureNotDisposed(): void {\n if (this._isDisposed) {\n throw new Error('Object has been disposed');\n }\n }\n\n /**\n * 在对象被释放时调用。\n * 在子类中重写以执行自定义清理。\n */\n protected onDispose(): void {\n // 默认实现不执行任何操作\n }\n}\n\n/**\n * 用于管理多个可释放对象的工具类。\n * 适用于收集应一起释放的可释放对象。\n *\n * @example\n * ```typescript\n * const disposables = new DisposableStore();\n *\n * // 添加各种可释放对象\n * disposables.add(eventListener1);\n * disposables.add(eventListener2);\n * disposables.add({ dispose: () => cleanupSomething() });\n *\n * // 一次性释放所有对象\n * disposables.dispose();\n * ```\n */\nexport class DisposableStore implements IDisposable {\n private readonly items: Set<IDisposable> = new Set();\n private _isDisposed: boolean = false;\n\n /**\n * 获取此存储是否已被释放。\n */\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n /**\n * 向存储中添加可释放对象。\n *\n * @template T - 可释放对象类型\n * @param disposable - 要添加的可释放对象\n * @returns 相同的可释放对象,用于链式调用\n */\n public add<T extends IDisposable>(disposable: T): T {\n if (this._isDisposed) {\n disposable.dispose();\n } else {\n this.items.add(disposable);\n }\n return disposable;\n }\n\n /**\n * 从存储中移除可释放对象而不释放它。\n *\n * @param disposable - 要移除的可释放对象\n */\n public delete(disposable: IDisposable): void {\n this.items.delete(disposable);\n }\n\n /**\n * 释放存储中的所有项目并清空存储。\n */\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n\n this._isDisposed = true;\n\n for (const item of this.items) {\n try {\n item.dispose();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error during disposal:', error);\n }\n }\n\n this.items.clear();\n }\n\n /**\n * 释放所有项目但保持存储活跃以接收新项目。\n */\n public clear(): void {\n for (const item of this.items) {\n try {\n item.dispose();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error during disposal:', error);\n }\n }\n this.items.clear();\n }\n\n /**\n * 获取存储中的项目数量。\n */\n public get size(): number {\n return this.items.size;\n }\n}\n\n/**\n * 从清理函数创建可释放对象。\n *\n * @param dispose - 清理函数\n * @returns 可释放对象\n */\nexport function toDisposable(dispose: () => void): IDisposable {\n return {\n dispose,\n isDisposed: false,\n };\n}\n\n/**\n * 将多个可释放对象组合成单个可释放对象。\n *\n * @param disposables - 要组合的可释放对象\n * @returns 一次性释放所有对象的单个可释放对象\n */\nexport function combineDisposables(...disposables: IDisposable[]): IDisposable {\n return {\n dispose: () => {\n for (const d of disposables) {\n d.dispose();\n }\n },\n isDisposed: false,\n };\n}\n"]}
@@ -10,9 +10,7 @@ function compose(...fns) {
10
10
  if (fns.length === 1) {
11
11
  return fns[0];
12
12
  }
13
- return fns.reduce(
14
- (composed, fn) => (x) => composed(fn(x))
15
- );
13
+ return fns.reduce((composed, fn) => (x) => composed(fn(x)));
16
14
  }
17
15
  chunkPK6SKIKE_cjs.__name(compose, "compose");
18
16
  function pipe(...fns) {
@@ -22,9 +20,7 @@ function pipe(...fns) {
22
20
  if (fns.length === 1) {
23
21
  return fns[0];
24
22
  }
25
- return fns.reduce(
26
- (piped, fn) => (x) => fn(piped(x))
27
- );
23
+ return fns.reduce((piped, fn) => (x) => fn(piped(x)));
28
24
  }
29
25
  chunkPK6SKIKE_cjs.__name(pipe, "pipe");
30
26
  function flow(value, ...fns) {
@@ -326,5 +322,5 @@ exports.tryCatchAsync = tryCatchAsync;
326
322
  exports.uncurry = uncurry;
327
323
  exports.unwrapOr = unwrapOr;
328
324
  exports.unwrapOrElse = unwrapOrElse;
329
- //# sourceMappingURL=chunk-ZT6HVG4G.cjs.map
330
- //# sourceMappingURL=chunk-ZT6HVG4G.cjs.map
325
+ //# sourceMappingURL=chunk-UYJUSNDI.cjs.map
326
+ //# sourceMappingURL=chunk-UYJUSNDI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/fp/compose.ts","../src/fp/curry.ts","../src/fp/result.ts","../src/fp/option.ts","../src/fp/hof.ts"],"names":["__name"],"mappings":"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","file":"chunk-UYJUSNDI.cjs","sourcesContent":["/**\n * @fileoverview 函数组合工具\n * @module melange/fp/compose\n * @description 提供组合和连接函数的工具,\n * 实现无点风格编程和函数链式调用。\n */\n\nimport type { UnaryFunction } from '../types';\n\n/**\n * 从右到左组合多个函数。\n * 最右边的函数可以接受多个参数,其他所有函数必须是一元的。\n *\n * @description\n * 函数组合是函数式编程中的基本概念。\n * `compose(f, g, h)(x)` 等价于 `f(g(h(x)))`。\n *\n * @example\n * ```typescript\n * const addOne = (x: number) => x + 1;\n * const double = (x: number) => x * 2;\n * const square = (x: number) => x * x;\n *\n * const composed = compose(square, double, addOne);\n * composed(2); // ((2 + 1) * 2)² = 36\n * ```\n *\n * @param fns - 要组合的函数\n * @returns 一个新函数,从右到左应用所有函数\n */\nexport function compose<A, B>(fn1: UnaryFunction<A, B>): UnaryFunction<A, B>;\nexport function compose<A, B, C>(\n fn2: UnaryFunction<B, C>,\n fn1: UnaryFunction<A, B>\n): UnaryFunction<A, C>;\nexport function compose<A, B, C, D>(\n fn3: UnaryFunction<C, D>,\n fn2: UnaryFunction<B, C>,\n fn1: UnaryFunction<A, B>\n): UnaryFunction<A, D>;\nexport function compose<A, B, C, D, E>(\n fn4: UnaryFunction<D, E>,\n fn3: UnaryFunction<C, D>,\n fn2: UnaryFunction<B, C>,\n fn1: UnaryFunction<A, B>\n): UnaryFunction<A, E>;\nexport function compose<A, B, C, D, E, F>(\n fn5: UnaryFunction<E, F>,\n fn4: UnaryFunction<D, E>,\n fn3: UnaryFunction<C, D>,\n fn2: UnaryFunction<B, C>,\n fn1: UnaryFunction<A, B>\n): UnaryFunction<A, F>;\nexport function compose(...fns: UnaryFunction<unknown, unknown>[]): UnaryFunction<unknown, unknown>;\n\nexport function compose(\n ...fns: UnaryFunction<unknown, unknown>[]\n): UnaryFunction<unknown, unknown> {\n if (fns.length === 0) {\n return (x: unknown) => x;\n }\n\n if (fns.length === 1) {\n return fns[0] as UnaryFunction<unknown, unknown>;\n }\n\n return fns.reduce((composed, fn) => (x: unknown) => composed(fn(x)));\n}\n\n/**\n * 从左到右连接多个函数。\n * 第一个函数可以接受多个参数,其他所有函数必须是一元的。\n *\n * @description\n * Pipe 是 compose 的反向操作,从左到右应用函数。\n * `pipe(f, g, h)(x)` 等价于 `h(g(f(x)))`。\n * 这通常更易读,因为它遵循自然的阅读顺序。\n *\n * @example\n * ```typescript\n * const addOne = (x: number) => x + 1;\n * const double = (x: number) => x * 2;\n * const square = (x: number) => x * x;\n *\n * const piped = pipe(addOne, double, square);\n * piped(2); // ((2 + 1) * 2)² = 36\n * ```\n *\n * @param fns - 要连接的函数\n * @returns 一个新函数,从左到右应用所有函数\n */\nexport function pipe<A, B>(fn1: UnaryFunction<A, B>): UnaryFunction<A, B>;\nexport function pipe<A, B, C>(\n fn1: UnaryFunction<A, B>,\n fn2: UnaryFunction<B, C>\n): UnaryFunction<A, C>;\nexport function pipe<A, B, C, D>(\n fn1: UnaryFunction<A, B>,\n fn2: UnaryFunction<B, C>,\n fn3: UnaryFunction<C, D>\n): UnaryFunction<A, D>;\nexport function pipe<A, B, C, D, E>(\n fn1: UnaryFunction<A, B>,\n fn2: UnaryFunction<B, C>,\n fn3: UnaryFunction<C, D>,\n fn4: UnaryFunction<D, E>\n): UnaryFunction<A, E>;\nexport function pipe<A, B, C, D, E, F>(\n fn1: UnaryFunction<A, B>,\n fn2: UnaryFunction<B, C>,\n fn3: UnaryFunction<C, D>,\n fn4: UnaryFunction<D, E>,\n fn5: UnaryFunction<E, F>\n): UnaryFunction<A, F>;\nexport function pipe(...fns: UnaryFunction<unknown, unknown>[]): UnaryFunction<unknown, unknown>;\n\nexport function pipe(...fns: UnaryFunction<unknown, unknown>[]): UnaryFunction<unknown, unknown> {\n if (fns.length === 0) {\n return (x: unknown) => x;\n }\n\n if (fns.length === 1) {\n return fns[0] as UnaryFunction<unknown, unknown>;\n }\n\n return fns.reduce((piped, fn) => (x: unknown) => fn(piped(x)));\n}\n\n/**\n * 创建函数流,类似于 pipe 但立即返回最终结果。\n * 适用于通过一系列函数转换值。\n *\n * @description\n * Flow 类似于 pipe,但不是返回函数,\n * 而是立即将值通过所有函数应用。\n *\n * @example\n * ```typescript\n * const result = flow(\n * 5,\n * x => x + 1,\n * x => x * 2,\n * x => x.toString()\n * );\n * // result = \"12\"\n * ```\n *\n * @param value - 初始值\n * @param fns - 要应用的函数\n * @returns 将所有函数应用于值的结果\n */\nexport function flow<A>(value: A): A;\nexport function flow<A, B>(value: A, fn1: UnaryFunction<A, B>): B;\nexport function flow<A, B, C>(value: A, fn1: UnaryFunction<A, B>, fn2: UnaryFunction<B, C>): C;\nexport function flow<A, B, C, D>(\n value: A,\n fn1: UnaryFunction<A, B>,\n fn2: UnaryFunction<B, C>,\n fn3: UnaryFunction<C, D>\n): D;\nexport function flow<A, B, C, D, E>(\n value: A,\n fn1: UnaryFunction<A, B>,\n fn2: UnaryFunction<B, C>,\n fn3: UnaryFunction<C, D>,\n fn4: UnaryFunction<D, E>\n): E;\nexport function flow<A, B, C, D, E, F>(\n value: A,\n fn1: UnaryFunction<A, B>,\n fn2: UnaryFunction<B, C>,\n fn3: UnaryFunction<C, D>,\n fn4: UnaryFunction<D, E>,\n fn5: UnaryFunction<E, F>\n): F;\n\nexport function flow(value: unknown, ...fns: UnaryFunction<unknown, unknown>[]): unknown {\n return fns.reduce((acc, fn) => fn(acc), value);\n}\n","/**\n * @fileoverview 柯里化和部分应用工具\n * @module melange/fp/curry\n * @description 提供柯里化函数和部分应用的工具,\n * 实现更灵活的函数组合和重用。\n */\n\n/**\n * 柯里化二元函数。\n * 将接受两个参数的函数转换为接受一个参数并返回接受第二个参数的函数。\n *\n * @description\n * 柯里化以数学家 Haskell Curry 命名。它将具有多个参数的函数转换为一系列函数,每个函数接受一个参数。\n *\n * @example\n * ```typescript\n * const add = (a: number, b: number) => a + b;\n * const curriedAdd = curry(add);\n *\n * curriedAdd(1)(2); // 3\n * const addFive = curriedAdd(5);\n * addFive(10); // 15\n * ```\n *\n * @template A - 第一个参数的类型\n * @template B - 第二个参数的类型\n * @template R - 返回类型\n * @param fn - 要柯里化的二元函数\n * @returns 函数的柯里化版本\n */\nexport function curry<A, B, R>(fn: (a: A, b: B) => R): (a: A) => (b: B) => R;\n\n/**\n * 柯里化三元函数。\n *\n * @template A - 第一个参数的类型\n * @template B - 第二个参数的类型\n * @template C - 第三个参数的类型\n * @template R - 返回类型\n * @param fn - 要柯里化的三元函数\n * @returns 函数的柯里化版本\n */\nexport function curry<A, B, C, R>(fn: (a: A, b: B, c: C) => R): (a: A) => (b: B) => (c: C) => R;\n\n/**\n * 柯里化四元函数。\n *\n * @template A - 第一个参数的类型\n * @template B - 第二个参数的类型\n * @template C - 第三个参数的类型\n * @template D - 第四个参数的类型\n * @template R - 返回类型\n * @param fn - 要柯里化的四元函数\n * @returns 函数的柯里化版本\n */\nexport function curry<A, B, C, D, R>(\n fn: (a: A, b: B, c: C, d: D) => R\n): (a: A) => (b: B) => (c: C) => (d: D) => R;\n\nexport function curry(fn: (...args: unknown[]) => unknown): unknown {\n const arity = fn.length;\n\n function curried(...args: unknown[]): unknown {\n if (args.length >= arity) {\n return fn(...args);\n }\n return (...moreArgs: unknown[]) => curried(...args, ...moreArgs);\n }\n\n return curried;\n}\n\n/**\n * 反柯里化函数。\n * 将一元函数序列转换回接受多个参数的单个函数。\n *\n * @example\n * ```typescript\n * const curriedAdd = (a: number) => (b: number) => a + b;\n * const add = uncurry(curriedAdd);\n *\n * add(1, 2); // 3\n * ```\n *\n * @template A - 第一个参数的类型\n * @template B - 第二个参数的类型\n * @template R - 返回类型\n * @param fn - 要反柯里化的函数\n * @returns 函数的反柯里化版本\n */\nexport function uncurry<A, B, R>(fn: (a: A) => (b: B) => R): (a: A, b: B) => R;\nexport function uncurry<A, B, C, R>(fn: (a: A) => (b: B) => (c: C) => R): (a: A, b: B, c: C) => R;\n\nexport function uncurry(fn: (a: unknown) => unknown): (...args: unknown[]) => unknown {\n return (...args: unknown[]) => {\n let result: unknown = fn;\n for (const arg of args) {\n result = (result as (a: unknown) => unknown)(arg);\n }\n return result;\n };\n}\n\n/**\n * 从左侧部分应用参数到函数。\n * 返回一个接受剩余参数的新函数。\n *\n * @description\n * 部分应用不同于柯里化。柯里化将函数转换为一元函数序列,\n * 而部分应用固定一些参数并返回接受剩余参数的函数。\n *\n * @example\n * ```typescript\n * const greet = (greeting: string, name: string, punctuation: string) =>\n * `${greeting}, ${name}${punctuation}`;\n *\n * const sayHello = partial(greet, 'Hello');\n * sayHello('World', '!'); // \"Hello, World!\"\n *\n * const sayHelloWorld = partial(greet, 'Hello', 'World');\n * sayHelloWorld('!'); // \"Hello, World!\"\n * ```\n *\n * @template T - 部分参数的元组类型\n * @template R - 剩余参数的元组类型\n * @template Result - 返回类型\n * @param fn - 要部分应用的函数\n * @param partialArgs - 要固定的参数\n * @returns 接受剩余参数的新函数\n */\nexport function partial<T extends unknown[], R extends unknown[], Result>(\n fn: (...args: [...T, ...R]) => Result,\n ...partialArgs: T\n): (...remainingArgs: R) => Result {\n return (...remainingArgs: R): Result => fn(...partialArgs, ...remainingArgs);\n}\n\n/**\n * 从右侧部分应用参数到函数。\n * 返回一个接受剩余参数的新函数。\n *\n * @example\n * ```typescript\n * const greet = (greeting: string, name: string, punctuation: string) =>\n * `${greeting}, ${name}${punctuation}`;\n *\n * const greetExcitedly = partialRight(greet, '!');\n * greetExcitedly('Hello', 'World'); // \"Hello, World!\"\n * ```\n *\n * @template L - 前导参数的元组类型\n * @template T - 部分参数的元组类型\n * @template Result - 返回类型\n * @param fn - 要部分应用的函数\n * @param partialArgs - 从右侧固定的参数\n * @returns 接受前导参数的新函数\n */\nexport function partialRight<L extends unknown[], T extends unknown[], Result>(\n fn: (...args: [...L, ...T]) => Result,\n ...partialArgs: T\n): (...leadingArgs: L) => Result {\n return (...leadingArgs: L): Result => fn(...leadingArgs, ...partialArgs);\n}\n","/**\n * @fileoverview 用于函数式错误处理的 Result 类型\n * @module melange/fp/result\n * @description 提供 Result 类型和工具,用于处理可能成功或失败的操作,\n * 而无需抛出异常。\n */\n\nimport type { Result, Ok, Err, UnaryFunction } from '../types';\n\n/**\n * 创建包含给定值的成功 Result。\n *\n * @example\n * ```typescript\n * const result = ok(42);\n * // { _tag: 'Ok', value: 42 }\n * ```\n *\n * @template T - 成功值的类型\n * @param value - 成功值\n * @returns 包含该值的 Ok Result\n */\nexport function ok<T>(value: T): Ok<T> {\n return { _tag: 'Ok', value };\n}\n\n/**\n * 创建包含给定错误的失败 Result。\n *\n * @example\n * ```typescript\n * const result = err(new Error('出错了'));\n * // { _tag: 'Err', error: Error('出错了') }\n * ```\n *\n * @template E - 错误的类型\n * @param error - 错误值\n * @returns 包含该错误的 Err Result\n */\nexport function err<E>(error: E): Err<E> {\n return { _tag: 'Err', error };\n}\n\n/**\n * 类型守卫,用于检查 Result 是否为 Ok。\n *\n * @example\n * ```typescript\n * const result = ok(42);\n * if (isOk(result)) {\n * console.log(result.value); // 42\n * }\n * ```\n *\n * @template T - 成功类型\n * @template E - 错误类型\n * @param result - 要检查的 Result\n * @returns 如果 Result 是 Ok 则返回 true\n */\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T> {\n return result._tag === 'Ok';\n}\n\n/**\n * 类型守卫,用于检查 Result 是否为 Err。\n *\n * @example\n * ```typescript\n * const result = err('error');\n * if (isErr(result)) {\n * console.log(result.error); // 'error'\n * }\n * ```\n *\n * @template T - 成功类型\n * @template E - 错误类型\n * @param result - 要检查的 Result\n * @returns 如果 Result 是 Err 则返回 true\n */\nexport function isErr<T, E>(result: Result<T, E>): result is Err<E> {\n return result._tag === 'Err';\n}\n\n/**\n * 在 Result 的成功值上映射函数。\n * 如果 Result 是 Err,则错误将原样传递。\n *\n * @example\n * ```typescript\n * const result = ok(5);\n * const doubled = mapResult(result, x => x * 2);\n * // { _tag: 'Ok', value: 10 }\n *\n * const error = err('error');\n * const still = mapResult(error, x => x * 2);\n * // { _tag: 'Err', error: 'error' }\n * ```\n *\n * @template T - 原始成功类型\n * @template U - 映射后的成功类型\n * @template E - 错误类型\n * @param result - 要映射的 Result\n * @param fn - 要应用于成功值的函数\n * @returns 带有映射值的新 Result\n */\nexport function mapResult<T, U, E>(result: Result<T, E>, fn: UnaryFunction<T, U>): Result<U, E> {\n if (isOk(result)) {\n return ok(fn(result.value));\n }\n return result;\n}\n\n/**\n * 在 Result 的成功值上映射返回 Result 的函数。\n * 在其他库中这也被称为 `chain` 或 `bind`。\n *\n * @example\n * ```typescript\n * const safeDivide = (a: number, b: number): Result<number, string> =>\n * b === 0 ? err('除零错误') : ok(a / b);\n *\n * const result = ok(10);\n * const divided = flatMapResult(result, x => safeDivide(x, 2));\n * // { _tag: 'Ok', value: 5 }\n *\n * const divideByZero = flatMapResult(result, x => safeDivide(x, 0));\n * // { _tag: 'Err', error: '除零错误' }\n * ```\n *\n * @template T - 原始成功类型\n * @template U - 映射后的成功类型\n * @template E - 错误类型\n * @param result - 要 flatMap 的 Result\n * @param fn - 应用的返回 Result 的函数\n * @returns 展平后的 Result\n */\nexport function flatMapResult<T, U, E>(\n result: Result<T, E>,\n fn: UnaryFunction<T, Result<U, E>>\n): Result<U, E> {\n if (isOk(result)) {\n return fn(result.value);\n }\n return result;\n}\n\n/**\n * 解包 Result,返回成功值或如果为 Err 则返回默认值。\n *\n * @example\n * ```typescript\n * const success = ok(42);\n * unwrapOr(success, 0); // 42\n *\n * const failure = err('error');\n * unwrapOr(failure, 0); // 0\n * ```\n *\n * @template T - 成功类型\n * @template E - 错误类型\n * @param result - 要解包的 Result\n * @param defaultValue - 如果为 Err 的默认值\n * @returns 成功值或默认值\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (isOk(result)) {\n return result.value;\n }\n return defaultValue;\n}\n\n/**\n * 解包 Result,返回成功值或如果为 Err 则调用函数。\n *\n * @example\n * ```typescript\n * const success = ok(42);\n * unwrapOrElse(success, () => 0); // 42\n *\n * const failure = err('error');\n * unwrapOrElse(failure, () => 0); // 0\n * ```\n *\n * @template T - 成功类型\n * @template E - 错误类型\n * @param result - 要解包的 Result\n * @param fn - 如果为 Err 要调用的函数\n * @returns 成功值或函数的结果\n */\nexport function unwrapOrElse<T, E>(result: Result<T, E>, fn: UnaryFunction<E, T>): T {\n if (isOk(result)) {\n return result.value;\n }\n return fn(result.error);\n}\n\n/**\n * 将 Result 与成功和错误处理程序匹配。\n *\n * @example\n * ```typescript\n * const result = ok(42);\n * const message = match(result, {\n * ok: value => `得到 ${value}`,\n * err: error => `错误: ${error}`\n * });\n * // \"得到 42\"\n * ```\n *\n * @template T - 成功类型\n * @template E - 错误类型\n * @template R - 返回类型\n * @param result - 要匹配的 Result\n * @param handlers - 带有 ok 和 err 处理程序的对象\n * @returns 匹配处理程序的结果\n */\nexport function matchResult<T, E, R>(\n result: Result<T, E>,\n handlers: { ok: UnaryFunction<T, R>; err: UnaryFunction<E, R> }\n): R {\n if (isOk(result)) {\n return handlers.ok(result.value);\n }\n return handlers.err(result.error);\n}\n\n/**\n * 尝试执行函数并将结果包装在 Result 类型中。\n *\n * @example\n * ```typescript\n * const result = tryCatch(() => JSON.parse('{\"a\": 1}'));\n * // { _tag: 'Ok', value: { a: 1 } }\n *\n * const error = tryCatch(() => JSON.parse('invalid'));\n * // { _tag: 'Err', error: SyntaxError(...) }\n * ```\n *\n * @template T - 函数的返回类型\n * @param fn - 要执行的函数\n * @returns 包含返回值或错误的 Result\n */\nexport function tryCatch<T>(fn: () => T): Result<T, unknown> {\n try {\n return ok(fn());\n } catch (error) {\n return err(error);\n }\n}\n\n/**\n * 尝试执行异步函数并将结果包装在 Result 类型中。\n *\n * @example\n * ```typescript\n * const result = await tryCatchAsync(async () => {\n * const response = await fetch('/api/data');\n * return response.json();\n * });\n * ```\n *\n * @template T - 异步函数的返回类型\n * @param fn - 要执行的异步函数\n * @returns 包含返回值或错误的 Result 的 Promise\n */\nexport async function tryCatchAsync<T>(fn: () => Promise<T>): Promise<Result<T, unknown>> {\n try {\n const result = await fn();\n return ok(result);\n } catch (error) {\n return err(error);\n }\n}\n","/**\n * @fileoverview 用于可空值处理的 Option 类型\n * @module melange/fp/option\n * @description 提供 Option 类型和工具,用于处理可能存在或不存在的值,\n * 而不直接使用 null/undefined。\n */\n\nimport type { Option, Some, None, UnaryFunction } from '../types';\n\n/**\n * 创建包含给定值的 Some Option。\n *\n * @example\n * ```typescript\n * const option = some(42);\n * // { _tag: 'Some', value: 42 }\n * ```\n *\n * @template T - 值的类型\n * @param value - 要包装的值\n * @returns 包含该值的 Some Option\n */\nexport function some<T>(value: T): Some<T> {\n return { _tag: 'Some', value };\n}\n\n/**\n * 创建表示缺失值的 None Option。\n *\n * @example\n * ```typescript\n * const option = none();\n * // { _tag: 'None' }\n * ```\n *\n * @returns None Option\n */\nexport function none(): None {\n return { _tag: 'None' };\n}\n\n/**\n * 类型守卫,用于检查 Option 是否为 Some。\n *\n * @example\n * ```typescript\n * const option = some(42);\n * if (isSome(option)) {\n * console.log(option.value); // 42\n * }\n * ```\n *\n * @template T - 值的类型\n * @param option - 要检查的 Option\n * @returns 如果 Option 是 Some 则返回 true\n */\nexport function isSome<T>(option: Option<T>): option is Some<T> {\n return option._tag === 'Some';\n}\n\n/**\n * 类型守卫,用于检查 Option 是否为 None。\n *\n * @example\n * ```typescript\n * const option = none();\n * if (isNone(option)) {\n * console.log('无值');\n * }\n * ```\n *\n * @template T - 值的类型\n * @param option - 要检查的 Option\n * @returns 如果 Option 是 None 则返回 true\n */\nexport function isNone<T>(option: Option<T>): option is None {\n return option._tag === 'None';\n}\n\n/**\n * 从可空值创建 Option。\n * 如果值为 null 或 undefined,返回 None;否则返回 Some。\n *\n * @example\n * ```typescript\n * fromNullable(42); // Some(42)\n * fromNullable(null); // None\n * fromNullable(undefined);// None\n * ```\n *\n * @template T - 值的类型\n * @param value - 可空值\n * @returns 包装该值的 Option\n */\nexport function fromNullable<T>(value: T | null | undefined): Option<T> {\n return value == null ? none() : some(value);\n}\n\n/**\n * 在 Option 的值上映射函数。\n * 如果 Option 是 None,则原样返回 None。\n *\n * @example\n * ```typescript\n * const option = some(5);\n * const doubled = mapOption(option, x => x * 2);\n * // Some(10)\n *\n * const empty = none();\n * const still = mapOption(empty, x => x * 2);\n * // None\n * ```\n *\n * @template T - 原始值类型\n * @template U - 映射后的值类型\n * @param option - 要映射的 Option\n * @param fn - 要应用于值的函数\n * @returns 带有映射值的新 Option\n */\nexport function mapOption<T, U>(option: Option<T>, fn: UnaryFunction<T, U>): Option<U> {\n if (isSome(option)) {\n return some(fn(option.value));\n }\n return option;\n}\n\n/**\n * 在 Option 的值上映射返回 Option 的函数。\n * 在其他库中这也被称为 `chain` 或 `bind`。\n *\n * @example\n * ```typescript\n * const safeDivide = (n: number): Option<number> =>\n * n === 0 ? none() : some(100 / n);\n *\n * const option = some(10);\n * const divided = flatMapOption(option, safeDivide);\n * // Some(10)\n *\n * const zero = some(0);\n * const divideByZero = flatMapOption(zero, safeDivide);\n * // None\n * ```\n *\n * @template T - 原始值类型\n * @template U - 映射后的值类型\n * @param option - 要 flatMap 的 Option\n * @param fn - 应用的返回 Option 的函数\n * @returns 展平后的 Option\n */\nexport function flatMapOption<T, U>(option: Option<T>, fn: UnaryFunction<T, Option<U>>): Option<U> {\n if (isSome(option)) {\n return fn(option.value);\n }\n return option;\n}\n\n/**\n * 从 Option 获取值,如果为 None 则返回默认值。\n *\n * @example\n * ```typescript\n * const present = some(42);\n * getOrElse(present, 0); // 42\n *\n * const absent = none();\n * getOrElse(absent, 0); // 0\n * ```\n *\n * @template T - 值的类型\n * @param option - 要解包的 Option\n * @param defaultValue - 如果为 None 的默认值\n * @returns 值或默认值\n */\nexport function getOrElse<T>(option: Option<T>, defaultValue: T): T {\n if (isSome(option)) {\n return option.value;\n }\n return defaultValue;\n}\n\n/**\n * 从 Option 获取值,如果为 None 则调用函数。\n *\n * @example\n * ```typescript\n * const present = some(42);\n * getOrElseL(present, () => 0); // 42\n *\n * const absent = none();\n * getOrElseL(absent, () => computeDefault()); // computeDefault() 的结果\n * ```\n *\n * @template T - 值的类型\n * @param option - 要解包的 Option\n * @param fn - 如果为 None 要调用的函数\n * @returns 值或函数的结果\n */\nexport function getOrElseL<T>(option: Option<T>, fn: () => T): T {\n if (isSome(option)) {\n return option.value;\n }\n return fn();\n}\n\n/**\n * 将 Option 与 Some 和 None 处理程序匹配。\n *\n * @example\n * ```typescript\n * const option = some(42);\n * const message = matchOption(option, {\n * some: value => `得到 ${value}`,\n * none: () => '无'\n * });\n * // \"得到 42\"\n * ```\n *\n * @template T - 值的类型\n * @template R - 返回类型\n * @param option - 要匹配的 Option\n * @param handlers - 带有 some 和 none 处理程序的对象\n * @returns 匹配处理程序的结果\n */\nexport function matchOption<T, R>(\n option: Option<T>,\n handlers: { some: UnaryFunction<T, R>; none: () => R }\n): R {\n if (isSome(option)) {\n return handlers.some(option.value);\n }\n return handlers.none();\n}\n\n/**\n * 将 Option 转换为可空值。\n *\n * @example\n * ```typescript\n * toNullable(some(42)); // 42\n * toNullable(none()); // null\n * ```\n *\n * @template T - 值的类型\n * @param option - 要转换的 Option\n * @returns 值或 null\n */\nexport function toNullable<T>(option: Option<T>): T | null {\n if (isSome(option)) {\n return option.value;\n }\n return null;\n}\n\n/**\n * 基于谓词过滤 Option。\n * 如果 Option 是 Some 且谓词返回 false,则返回 None。\n *\n * @example\n * ```typescript\n * const option = some(10);\n * filter(option, x => x > 5); // Some(10)\n * filter(option, x => x > 15); // None\n * ```\n *\n * @template T - 值的类型\n * @param option - 要过滤的 Option\n * @param predicate - 谓词函数\n * @returns 如果谓词通过则返回 Option,否则返回 None\n */\nexport function filterOption<T>(option: Option<T>, predicate: (value: T) => boolean): Option<T> {\n if (isSome(option) && predicate(option.value)) {\n return option;\n }\n return none();\n}\n\n/**\n * 返回第一个为 Some 的 Option,如果都是 None 则返回 None。\n *\n * @example\n * ```typescript\n * alt(none(), some(42)); // Some(42)\n * alt(some(1), some(2)); // Some(1)\n * alt(none(), none()); // None\n * ```\n *\n * @template T - 值的类型\n * @param first - 第一个 Option\n * @param second - 第二个 Option\n * @returns 第一个 Some Option,或 None\n */\nexport function alt<T>(first: Option<T>, second: Option<T>): Option<T> {\n return isSome(first) ? first : second;\n}\n","/**\n * @fileoverview 高阶函数和工具\n * @module melange/fp/hof\n * @description 提供高阶函数用于记忆化、函数控制\n * 和其他函数式编程工具。\n */\n\nimport type { AnyFunction } from '../types';\n\n/**\n * 创建函数的记忆化版本。\n * 记忆化函数根据提供的参数缓存结果。\n *\n * @description\n * 记忆化是一种优化技术,存储昂贵函数调用的结果,\n * 当相同输入再次出现时返回缓存结果。\n *\n * @example\n * ```typescript\n * const expensiveCalculation = (n: number) => {\n * console.log('计算中...');\n * return n * n;\n * };\n *\n * const memoized = memoize(expensiveCalculation);\n * memoized(5); // 记录 '计算中...', 返回 25\n * memoized(5); // 从缓存返回 25, 无记录\n * memoized(3); // 记录 '计算中...', 返回 9\n * ```\n *\n * @template T - 函数类型\n * @param fn - 要记忆化的函数\n * @param keyFn - 生成缓存键的可选函数\n * @returns 函数的记忆化版本\n */\nexport function memoize<T extends AnyFunction>(\n fn: T,\n keyFn?: (...args: Parameters<T>) => string\n): T {\n const cache = new Map<string, ReturnType<T>>();\n\n return ((...args: Parameters<T>): ReturnType<T> => {\n const key = keyFn ? keyFn(...args) : JSON.stringify(args);\n\n if (cache.has(key)) {\n return cache.get(key) as ReturnType<T>;\n }\n\n const result = fn(...args) as ReturnType<T>;\n cache.set(key, result);\n return result;\n }) as T;\n}\n\n/**\n * 创建只能调用一次的函数。\n * 后续调用返回第一次调用的结果。\n *\n * @example\n * ```typescript\n * const initialize = once(() => {\n * console.log('初始化中...');\n * return { initialized: true };\n * });\n *\n * initialize(); // 记录 '初始化中...', 返回 { initialized: true }\n * initialize(); // 返回 { initialized: true }, 无记录\n * ```\n *\n * @template T - 函数类型\n * @param fn - 要包装的函数\n * @returns 只能调用一次的函数\n */\nexport function once<T extends AnyFunction>(fn: T): T {\n let called = false;\n let result: ReturnType<T>;\n\n return ((...args: Parameters<T>): ReturnType<T> => {\n if (!called) {\n called = true;\n result = fn(...args) as ReturnType<T>;\n }\n return result;\n }) as T;\n}\n\n/**\n * 创建调用原始函数然后执行副作用的函数,返回原始结果。\n *\n * @description\n * Tap 适用于在管道中调试或记录日志\n * 而不影响数据流。\n *\n * @example\n * ```typescript\n * const addOne = (x: number) => x + 1;\n * const logValue = tap((x: number) => console.log('值:', x));\n *\n * pipe(\n * 5,\n * addOne,\n * logValue, // 记录 '值: 6', 返回 6\n * x => x * 2\n * ); // 返回 12\n * ```\n *\n * @template T - 值类型\n * @param effect - 要执行的副作用函数\n * @returns 执行副作用并返回输入的函数\n */\nexport function tap<T>(effect: (value: T) => void): (value: T) => T {\n return (value: T): T => {\n effect(value);\n return value;\n };\n}\n\n/**\n * 返回传入的值而不改变。\n * 恒等函数作为默认转换器很有用。\n *\n * @example\n * ```typescript\n * identity(42); // 42\n * identity('hello'); // 'hello'\n * [1, 2, 3].map(identity); // [1, 2, 3]\n * ```\n *\n * @template T - 值类型\n * @param value - 要返回的值\n * @returns 相同的值\n */\nexport function identity<T>(value: T): T {\n return value;\n}\n\n/**\n * 创建总是返回相同值的函数。\n * 适用于创建占位符函数。\n *\n * @example\n * ```typescript\n * const alwaysFive = constant(5);\n * alwaysFive(); // 5\n * alwaysFive(100); // 5\n *\n * [1, 2, 3].map(constant('x')); // ['x', 'x', 'x']\n * ```\n *\n * @template T - 值类型\n * @param value - 总是返回的值\n * @returns 总是返回值的函数\n */\nexport function constant<T>(value: T): () => T {\n return () => value;\n}\n\n/**\n * 不执行任何操作并返回 undefined 的函数。\n * 适合作为默认回调或占位符。\n *\n * @example\n * ```typescript\n * const callback = maybeCallback || noop;\n * callback();\n * ```\n */\nexport function noop(): void {\n // 故意为空\n}\n\n/**\n * 否定谓词函数。\n *\n * @example\n * ```typescript\n * const isEven = (n: number) => n % 2 === 0;\n * const isOdd = not(isEven);\n *\n * isOdd(3); // true\n * isOdd(4); // false\n * ```\n *\n * @template T - 参数类型\n * @param predicate - 要否定的谓词\n * @returns 否定的谓词\n */\nexport function not<T>(predicate: (value: T) => boolean): (value: T) => boolean {\n return (value: T) => !predicate(value);\n}\n\n/**\n * 创建当所有谓词都返回 true 时返回 true 的函数。\n *\n * @example\n * ```typescript\n * const isPositive = (n: number) => n > 0;\n * const isEven = (n: number) => n % 2 === 0;\n * const isPositiveEven = allPass([isPositive, isEven]);\n *\n * isPositiveEven(4); // true\n * isPositiveEven(-4); // false\n * isPositiveEven(3); // false\n * ```\n *\n * @template T - 参数类型\n * @param predicates - 要检查的谓词数组\n * @returns 当所有谓词都通过时返回 true 的函数\n */\nexport function allPass<T>(predicates: Array<(value: T) => boolean>): (value: T) => boolean {\n return (value: T) => predicates.every(predicate => predicate(value));\n}\n\n/**\n * 创建当任何谓词返回 true 时返回 true 的函数。\n *\n * @example\n * ```typescript\n * const isZero = (n: number) => n === 0;\n * const isNegative = (n: number) => n < 0;\n * const isNotPositive = anyPass([isZero, isNegative]);\n *\n * isNotPositive(0); // true\n * isNotPositive(-1); // true\n * isNotPositive(1); // false\n * ```\n *\n * @template T - 参数类型\n * @param predicates - 要检查的谓词数组\n * @returns 当任何谓词通过时返回 true 的函数\n */\nexport function anyPass<T>(predicates: Array<(value: T) => boolean>): (value: T) => boolean {\n return (value: T) => predicates.some(predicate => predicate(value));\n}\n\n/**\n * 翻转二元函数的参数。\n *\n * @example\n * ```typescript\n * const divide = (a: number, b: number) => a / b;\n * const flippedDivide = flip(divide);\n *\n * divide(10, 2); // 5\n * flippedDivide(10, 2); // 0.2\n * ```\n *\n * @template A - 第一个参数类型\n * @template B - 第二个参数类型\n * @template R - 返回类型\n * @param fn - 要翻转的函数\n * @returns 参数翻转后的函数\n */\nexport function flip<A, B, R>(fn: (a: A, b: B) => R): (b: B, a: A) => R {\n return (b: B, a: A) => fn(a, b);\n}\n\n/**\n * 将值应用到函数。\n * 适用于无点编程。\n *\n * @example\n * ```typescript\n * const addOne = (x: number) => x + 1;\n * apply(5, addOne); // 6\n *\n * const funcs = [x => x + 1, x => x * 2];\n * funcs.map(f => apply(5, f)); // [6, 10]\n * ```\n *\n * @template T - 值类型\n * @template R - 返回类型\n * @param value - 要应用的值\n * @param fn - 要应用的函数\n * @returns 将值应用到函数的结果\n */\nexport function apply<T, R>(value: T, fn: (value: T) => R): R {\n return fn(value);\n}\n\n/**\n * 从值创建 thunk(延迟计算)。\n *\n * @example\n * ```typescript\n * const lazyValue = thunk(expensiveComputation);\n * // ... 稍后\n * const result = lazyValue(); // 计算在此处发生\n * ```\n *\n * @template T - 返回类型\n * @param fn - 要延迟的函数\n * @returns 调用时执行函数的 thunk\n */\nexport function thunk<T>(fn: () => T): () => T {\n return fn;\n}\n\n/**\n * 反转布尔值。\n *\n * @example\n * ```typescript\n * invert(true); // false\n * invert(false); // true\n * ```\n *\n * @param value - 要反转的布尔值\n * @returns 反转后的布尔值\n */\nexport function invert(value: boolean): boolean {\n return !value;\n}\n"]}
@@ -474,9 +474,7 @@ function Timeout(timeoutMs, errorMessage) {
474
474
  descriptor.value = async function(...args) {
475
475
  const timeoutPromise = new Promise((_, reject) => {
476
476
  setTimeout(() => {
477
- reject(
478
- new Error(errorMessage ?? `${methodName} timed out after ${timeoutMs}ms`)
479
- );
477
+ reject(new Error(errorMessage ?? `${methodName} timed out after ${timeoutMs}ms`));
480
478
  }, timeoutMs);
481
479
  });
482
480
  return Promise.race([originalMethod.apply(this, args), timeoutPromise]);
@@ -678,5 +676,5 @@ exports.Validate = Validate;
678
676
  exports.combineDisposables = combineDisposables;
679
677
  exports.globalContainer = globalContainer;
680
678
  exports.toDisposable = toDisposable;
681
- //# sourceMappingURL=chunk-Q7XG6YN6.cjs.map
682
- //# sourceMappingURL=chunk-Q7XG6YN6.cjs.map
679
+ //# sourceMappingURL=chunk-V5THPEB2.cjs.map
680
+ //# sourceMappingURL=chunk-V5THPEB2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/events.ts","../src/core/container.ts","../src/core/decorators.ts","../src/core/disposable.ts"],"names":["__name","Lifecycle"],"mappings":"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","file":"chunk-V5THPEB2.cjs","sourcesContent":["/**\n * @fileoverview 用于发布/订阅模式的事件发射器类\n * @module melange/core/events\n * @description 提供一个类型安全的事件发射器实现\n * 遵循观察者模式。\n */\n\nimport type { EventHandler, Subscription } from '../types';\n\n/**\n * 类型安全的事件映射接口。\n * 扩展此接口以定义您的事件类型。\n *\n * @example\n * ```typescript\n * interface MyEvents {\n * userLogin: { userId: string; timestamp: Date };\n * userLogout: { userId: string };\n * error: Error;\n * }\n *\n * const emitter = new EventEmitter<MyEvents>();\n * emitter.on('userLogin', event => console.log(event.userId));\n * ```\n */\nexport interface EventMap {\n [event: string]: unknown;\n}\n\n/**\n * 带有元数据的内部监听器条目。\n */\ninterface ListenerEntry<T> {\n handler: EventHandler<T>;\n once: boolean;\n}\n\n/**\n * 类型安全的事件发射器类。\n * 实现观察者模式以进行解耦的事件驱动编程。\n *\n * @description\n * EventEmitter 提供了一种订阅和发射事件的方式,具有完整的\n * TypeScript 类型安全性。它支持一次性监听器、监听器移除\n * 和适当的清理。\n *\n * @template Events - 定义事件名称和载荷类型的事件映射类型\n *\n * @example\n * ```typescript\n * interface AppEvents {\n * 'user:created': { id: string; name: string };\n * 'user:deleted': { id: string };\n * 'error': Error;\n * }\n *\n * const events = new EventEmitter<AppEvents>();\n *\n * // 订阅事件\n * events.on('user:created', user => {\n * console.log(`创建用户: ${user.name}`);\n * });\n *\n * // 发射事件\n * events.emit('user:created', { id: '1', name: 'John' });\n *\n * // 一次性监听器\n * events.once('error', err => console.error(err));\n *\n * // 取消订阅\n * const subscription = events.on('user:deleted', handleDelete);\n * subscription.unsubscribe();\n * ```\n */\nexport class EventEmitter<Events extends EventMap = EventMap> {\n /**\n * 事件名称到其监听器的映射\n */\n private listeners: Map<keyof Events, ListenerEntry<unknown>[]> = new Map();\n\n /**\n * 订阅事件。\n *\n * @param event - 要订阅的事件名称\n * @param handler - 事件发射时要调用的处理函数\n * @returns 带有取消订阅方法的订阅对象\n */\n public on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): Subscription {\n return this.addListener(event, handler, false);\n }\n\n /**\n * 仅订阅事件的一次发射。\n * 监听器在被调用一次后自动移除。\n *\n * @param event - 要订阅的事件名称\n * @param handler - 事件发射时要调用的处理函数\n * @returns 带有取消订阅方法的订阅对象\n */\n public once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): Subscription {\n return this.addListener(event, handler, true);\n }\n\n /**\n * 从事件中移除特定监听器。\n *\n * @param event - 事件名称\n * @param handler - 要移除的处理函数\n */\n public off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n const index = eventListeners.findIndex(entry => entry.handler === handler);\n if (index !== -1) {\n eventListeners.splice(index, 1);\n }\n }\n }\n\n /**\n * 发射带有给定载荷的事件。\n * 所有订阅的监听器将同步调用。\n *\n * @param event - 要发射的事件名称\n * @param payload - 事件载荷\n */\n public emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n const eventListeners = this.listeners.get(event);\n if (!eventListeners) return;\n\n // 创建副本以避免监听器修改数组时出现问题\n const listenersCopy = [...eventListeners];\n\n for (const entry of listenersCopy) {\n entry.handler(payload);\n\n if (entry.once) {\n this.off(event, entry.handler as EventHandler<Events[K]>);\n }\n }\n }\n\n /**\n * 移除特定事件的所有监听器,或如果不指定事件则移除所有监听器。\n *\n * @param event - 可选的事件名称,用于清除监听器\n */\n public removeAllListeners<K extends keyof Events>(event?: K): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * 返回特定事件的监听器数量。\n *\n * @param event - 事件名称\n * @returns 监听器数量\n */\n public listenerCount<K extends keyof Events>(event: K): number {\n const eventListeners = this.listeners.get(event);\n return eventListeners?.length ?? 0;\n }\n\n /**\n * 返回所有具有监听器的事件名称。\n *\n * @returns 事件名称数组\n */\n public eventNames(): Array<keyof Events> {\n return Array.from(this.listeners.keys());\n }\n\n /**\n * 添加监听器的内部方法。\n */\n private addListener<K extends keyof Events>(\n event: K,\n handler: EventHandler<Events[K]>,\n once: boolean\n ): Subscription {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n\n const entry: ListenerEntry<Events[K]> = { handler, once };\n this.listeners.get(event)!.push(entry as ListenerEntry<unknown>);\n\n return {\n unsubscribe: () => this.off(event, handler),\n };\n }\n}\n","/**\n * @fileoverview 依赖注入容器\n * @module melange/core/container\n * @description 提供一个简单而强大的依赖注入容器\n * 支持单例、工厂函数和自动解析。\n */\n\nimport type { Constructor } from '../types';\n\n/**\n * 用于标识依赖项的令牌类型。\n * 可以是字符串、符号或类构造函数。\n */\nexport type Token<T = unknown> = string | symbol | Constructor<T>;\n\n/**\n * 创建实例的工厂函数类型。\n */\nexport type Factory<T> = (container: Container) => T;\n\n/**\n * 依赖注册的生命周期选项。\n */\nexport enum Lifecycle {\n /** 每次都创建新实例 */\n Transient = 'transient',\n /** 创建单个实例并重复使用 */\n Singleton = 'singleton',\n}\n\n/**\n * 容器中的注册条目。\n */\ninterface Registration<T> {\n factory: Factory<T>;\n lifecycle: Lifecycle;\n instance?: T;\n}\n\n/**\n * 可注入类的元数据键。\n */\nconst INJECTABLE_METADATA = Symbol('melange:injectable');\nconst INJECT_METADATA = Symbol('melange:inject');\n\n/**\n * 依赖注入容器。\n * 管理依赖项的生命周期和解析。\n *\n * @description\n * Container 类提供控制反转 (IoC) 功能,\n * 允许您通过在运行时注册和解析依赖项来解耦代码。\n *\n * @example\n * ```typescript\n * // 创建容器\n * const container = new Container();\n *\n * // 注册类\n * container.register('logger', () => new ConsoleLogger());\n *\n * // 注册单例\n * container.registerSingleton('config', () => loadConfig());\n *\n * // 解析依赖项\n * const logger = container.resolve<Logger>('logger');\n *\n * // 使用装饰器\n * @Injectable()\n * class UserService {\n * constructor(@Inject('logger') private logger: Logger) {}\n * }\n * container.registerClass(UserService);\n * ```\n */\nexport class Container {\n /**\n * 已注册依赖项的映射\n */\n private registrations: Map<Token, Registration<unknown>> = new Map();\n\n /**\n * 用于分层解析的父容器\n */\n private parent: Container | undefined;\n\n /**\n * 创建新的容器实例。\n *\n * @param parent - 用于分层解析的可选父容器\n */\n constructor(parent?: Container) {\n this.parent = parent;\n }\n\n /**\n * 使用工厂函数注册依赖项。\n *\n * @template T - 依赖项类型\n * @param token - 用于标识依赖项的令牌\n * @param factory - 创建依赖项的工厂函数\n * @param lifecycle - 依赖项的生命周期(默认:Transient)\n * @returns 容器实例,用于链式调用\n */\n public register<T>(\n token: Token<T>,\n factory: Factory<T>,\n lifecycle: Lifecycle = Lifecycle.Transient\n ): this {\n this.registrations.set(token, {\n factory: factory as Factory<unknown>,\n lifecycle,\n });\n return this;\n }\n\n /**\n * 注册单例依赖项。\n * 工厂函数只会被调用一次,之后返回相同的实例。\n *\n * @template T - 依赖项类型\n * @param token - 用于标识依赖项的令牌\n * @param factory - 创建依赖项的工厂函数\n * @returns 容器实例,用于链式调用\n */\n public registerSingleton<T>(token: Token<T>, factory: Factory<T>): this {\n return this.register(token, factory, Lifecycle.Singleton);\n }\n\n /**\n * 直接将值注册为单例。\n *\n * @template T - 值类型\n * @param token - 用于标识依赖项的令牌\n * @param value - 要注册的值\n * @returns 容器实例,用于链式调用\n */\n public registerValue<T>(token: Token<T>, value: T): this {\n this.registrations.set(token, {\n factory: () => value,\n lifecycle: Lifecycle.Singleton,\n instance: value,\n });\n return this;\n }\n\n /**\n * 将类注册为依赖项。\n * 类的实例化会自动解析其依赖项。\n *\n * @template T - 类类型\n * @param ClassConstructor - 要注册的类构造函数\n * @param lifecycle - 依赖项的生命周期(默认:Transient)\n * @returns 容器实例,用于链式调用\n */\n public registerClass<T extends object>(\n ClassConstructor: Constructor<T>,\n lifecycle: Lifecycle = Lifecycle.Transient\n ): this {\n const factory: Factory<T> = container => {\n const injectTokens = this.getInjectMetadata(ClassConstructor);\n const dependencies = injectTokens.map(token => container.resolve(token));\n return new ClassConstructor(...dependencies);\n };\n\n return this.register(ClassConstructor, factory, lifecycle);\n }\n\n /**\n * 通过令牌解析依赖项。\n *\n * @template T - 依赖项类型\n * @param token - 标识依赖项的令牌\n * @returns 已解析的依赖项\n * @throws Error 如果依赖项未注册\n */\n public resolve<T>(token: Token<T>): T {\n const registration = this.registrations.get(token) as Registration<T> | undefined;\n\n if (!registration) {\n // 尝试父容器\n if (this.parent) {\n return this.parent.resolve(token);\n }\n throw new Error(`Dependency not registered: ${String(token)}`);\n }\n\n if (registration.lifecycle === Lifecycle.Singleton) {\n if (registration.instance === undefined) {\n registration.instance = registration.factory(this);\n }\n return registration.instance;\n }\n\n return registration.factory(this);\n }\n\n /**\n * 检查依赖项是否已注册。\n *\n * @param token - 要检查的令牌\n * @returns 如果依赖项已注册则返回 true\n */\n public has(token: Token): boolean {\n if (this.registrations.has(token)) {\n return true;\n }\n return this.parent?.has(token) ?? false;\n }\n\n /**\n * 移除依赖项注册。\n *\n * @param token - 要移除的令牌\n * @returns 如果注册已被移除则返回 true\n */\n public unregister(token: Token): boolean {\n return this.registrations.delete(token);\n }\n\n /**\n * 清除所有注册。\n */\n public clear(): void {\n this.registrations.clear();\n }\n\n /**\n * 创建子容器。\n * 子容器从父容器继承注册。\n *\n * @returns 新的子容器\n */\n public createChild(): Container {\n return new Container(this);\n }\n\n /**\n * 获取类的注入元数据。\n */\n private getInjectMetadata(target: Constructor): Token[] {\n // 如果可用则使用 reflect-metadata,否则返回空数组\n const reflect = Reflect as unknown as {\n getMetadata?: (key: symbol, target: unknown) => Token[] | undefined;\n };\n return reflect.getMetadata?.(INJECT_METADATA, target) ?? [];\n }\n}\n\n/**\n * 为了方便而提供的全局容器实例。\n */\nexport const globalContainer = new Container();\n\n// ============================================================================\n// 依赖注入装饰器\n// ============================================================================\n\n/**\n * 将类标记为可注入。\n * 自动依赖解析所必需。\n *\n * @example\n * ```typescript\n * @Injectable()\n * class UserService {\n * constructor(private userRepo: UserRepository) {}\n * }\n * ```\n *\n * @returns 类装饰器\n */\nexport function Injectable(): ClassDecorator {\n return function <TFunction extends Function>(target: TFunction): TFunction {\n // 如果可用则使用 reflect-metadata\n const reflect = Reflect as unknown as {\n defineMetadata?: (key: symbol, value: unknown, target: unknown) => void;\n };\n reflect.defineMetadata?.(INJECTABLE_METADATA, true, target);\n return target;\n };\n}\n\n/**\n * 标记构造函数参数以进行注入。\n *\n * @example\n * ```typescript\n * @Injectable()\n * class UserService {\n * constructor(@Inject('logger') private logger: Logger) {}\n * }\n * ```\n *\n * @param token - 要注入的令牌\n * @returns 参数装饰器\n */\nexport function Inject(token: Token): ParameterDecorator {\n return function (\n target: object,\n _propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n // 如果可用则使用 reflect-metadata\n const reflect = Reflect as unknown as {\n getMetadata?: (key: symbol, target: unknown) => Token[] | undefined;\n defineMetadata?: (key: symbol, value: unknown, target: unknown) => void;\n };\n const existingTokens: Token[] = reflect.getMetadata?.(INJECT_METADATA, target) ?? [];\n existingTokens[parameterIndex] = token;\n reflect.defineMetadata?.(INJECT_METADATA, existingTokens, target);\n };\n}\n\n/**\n * 将类标记为单例。\n * 结合 @Injectable 和单例生命周期。\n *\n * @example\n * ```typescript\n * @Singleton()\n * class ConfigService {\n * // 只会存在一个实例\n * }\n * ```\n *\n * @returns 类装饰器\n */\nexport function Singleton(): ClassDecorator {\n return function <TFunction extends Function>(target: TFunction): TFunction {\n // 如果可用则使用 reflect-metadata\n const reflect = Reflect as unknown as {\n defineMetadata?: (key: symbol | string, value: unknown, target: unknown) => void;\n };\n reflect.defineMetadata?.(INJECTABLE_METADATA, true, target);\n reflect.defineMetadata?.('melange:singleton', true, target);\n return target;\n };\n}\n","/**\n * @fileoverview 方法和类装饰器\n * @module melange/core/decorators\n * @description 提供一系列有用的装饰器,用于增强\n * 类和方法的横切关注点。\n */\n\n/**\n * 用于缓存方法结果的记忆化装饰器。\n * 根据方法的参数缓存结果。\n *\n * @description\n * 此装饰器根据方法的参数缓存其返回值。\n * 后续使用相同参数的调用将返回缓存的值。\n *\n * @example\n * ```typescript\n * class Calculator {\n * @Memoize()\n * fibonacci(n: number): number {\n * if (n <= 1) return n;\n * return this.fibonacci(n - 1) + this.fibonacci(n - 2);\n * }\n * }\n * ```\n *\n * @param keyFn - 生成缓存键的可选函数\n * @returns 方法装饰器\n */\nexport function Memoize(keyFn?: (...args: unknown[]) => string): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n const cache = new Map<string, unknown>();\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const key = keyFn ? keyFn(...args) : JSON.stringify(args);\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n\n const result = originalMethod.apply(this, args);\n cache.set(key, result);\n return result;\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于限制方法调用频率的防抖装饰器。\n * 延迟方法执行直到指定的等待时间过后。\n *\n * @example\n * ```typescript\n * class SearchInput {\n * @Debounce(300)\n * onSearch(query: string): void {\n * // 这将在上次调用后300毫秒才被调用\n * console.log('搜索中:', query);\n * }\n * }\n * ```\n *\n * @param waitMs - 等待的毫秒数\n * @returns 方法装饰器\n */\nexport function Debounce(waitMs: number): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n descriptor.value = function (this: unknown, ...args: unknown[]): void {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n originalMethod.apply(this, args);\n timeoutId = null;\n }, waitMs);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于限制方法调用频率的节流装饰器。\n * 确保方法在指定的时间段内最多被调用一次。\n *\n * @example\n * ```typescript\n * class ScrollHandler {\n * @Throttle(100)\n * onScroll(event: Event): void {\n * // 这将最多每100毫秒被调用一次\n * console.log('滚动中');\n * }\n * }\n * ```\n *\n * @param limitMs - 调用之间的最小时间间隔(毫秒)\n * @returns 方法装饰器\n */\nexport function Throttle(limitMs: number): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n let lastCall = 0;\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const now = Date.now();\n\n if (now - lastCall >= limitMs) {\n lastCall = now;\n return originalMethod.apply(this, args);\n }\n\n return undefined;\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于记录方法调用的日志装饰器。\n * 记录方法进入、退出,以及可选的参数和返回值。\n *\n * @example\n * ```typescript\n * class UserService {\n * @Log({ logArgs: true, logResult: true })\n * getUser(id: string): User {\n * return this.userRepository.findById(id);\n * }\n * }\n * // 日志: \"Entering getUser with args: [\"123\"]\"\n * // 日志: \"Exiting getUser with result: { id: \"123\", name: \"John\" }\"\n * ```\n *\n * @param options - 日志选项\n * @returns 方法装饰器\n */\nexport function Log(\n options: {\n logArgs?: boolean;\n logResult?: boolean;\n prefix?: string;\n } = {}\n): MethodDecorator {\n const { logArgs = false, logResult = false, prefix = '' } = options;\n\n return function (\n _target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n const methodName = String(propertyKey);\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n const logPrefix = prefix ? `[${prefix}] ` : '';\n\n if (logArgs) {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Entering ${methodName} with args:`, args);\n } else {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Entering ${methodName}`);\n }\n\n try {\n const result = originalMethod.apply(this, args);\n\n // 处理异步方法\n if (result instanceof Promise) {\n return result\n .then(asyncResult => {\n if (logResult) {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Exiting ${methodName} with result:`, asyncResult);\n } else {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Exiting ${methodName}`);\n }\n return asyncResult;\n })\n .catch(error => {\n // eslint-disable-next-line no-console\n console.error(`${logPrefix}${methodName} threw error:`, error);\n throw error;\n });\n }\n\n if (logResult) {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Exiting ${methodName} with result:`, result);\n } else {\n // eslint-disable-next-line no-console\n console.log(`${logPrefix}Exiting ${methodName}`);\n }\n\n return result;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`${logPrefix}${methodName} threw error:`, error);\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于验证方法参数的验证装饰器。\n * 在方法执行前运行验证函数。\n *\n * @example\n * ```typescript\n * class UserService {\n * @Validate((id: string) => {\n * if (!id) throw new Error('ID 是必需的');\n * })\n * getUser(id: string): User {\n * return this.userRepository.findById(id);\n * }\n * }\n * ```\n *\n * @param validator - 在输入无效时抛出异常的验证函数\n * @returns 方法装饰器\n */\nexport function Validate(validator: (...args: unknown[]) => void): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n validator(...args);\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于标记方法已弃用的装饰器。\n * 在调用方法时记录警告。\n *\n * @example\n * ```typescript\n * class UserService {\n * @Deprecated('请改用 getUserById')\n * getUser(id: string): User {\n * return this.getUserById(id);\n * }\n * }\n * ```\n *\n * @param message - 弃用消息\n * @returns 方法装饰器\n */\nexport function Deprecated(message?: string): MethodDecorator {\n return function (\n _target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n const methodName = String(propertyKey);\n const warningMessage = message ?? `${methodName} is deprecated`;\n\n descriptor.value = function (this: unknown, ...args: unknown[]): unknown {\n // eslint-disable-next-line no-console\n console.warn(`[DEPRECATED] ${warningMessage}`);\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于密封类的装饰器。\n * 防止向实例添加新属性。\n *\n * @example\n * ```typescript\n * @Sealed()\n * class Config {\n * readonly apiUrl: string = 'https://api.example.com';\n * }\n *\n * const config = new Config();\n * config.newProp = 'value'; // 错误: 无法添加属性\n * ```\n *\n * @returns 类装饰器\n */\nexport function Sealed(): ClassDecorator {\n return function <TFunction extends Function>(target: TFunction): TFunction {\n Object.seal(target);\n Object.seal(target.prototype);\n return target;\n };\n}\n\n/**\n * 用于冻结类的装饰器。\n * 防止对实例进行任何修改。\n *\n * @example\n * ```typescript\n * @Frozen()\n * class Constants {\n * static readonly PI = 3.14159;\n * }\n *\n * Constants.PI = 3; // 错误: 无法修改\n * ```\n *\n * @returns 类装饰器\n */\nexport function Frozen(): ClassDecorator {\n return function <TFunction extends Function>(target: TFunction): TFunction {\n Object.freeze(target);\n Object.freeze(target.prototype);\n return target;\n };\n}\n\n/**\n * 用于自动将方法绑定到类实例的装饰器。\n * 对于作为回调函数传递的方法很有用。\n *\n * @example\n * ```typescript\n * class Button {\n * @Bind()\n * onClick() {\n * console.log(this); // 总是指向 Button 实例\n * }\n * }\n *\n * const button = new Button();\n * const handler = button.onClick;\n * handler(); // `this` 仍然是 button 实例\n * ```\n *\n * @returns 方法装饰器\n */\nexport function Bind(): MethodDecorator {\n return function (\n _target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n\n return {\n configurable: true,\n get(this: object) {\n const bound = originalMethod.bind(this);\n Object.defineProperty(this, propertyKey, {\n value: bound,\n configurable: true,\n writable: true,\n });\n return bound;\n },\n };\n };\n}\n\n/**\n * 用于自动重试失败方法调用的装饰器。\n *\n * @example\n * ```typescript\n * class ApiClient {\n * @Retry(3, 1000)\n * async fetchData(): Promise<Data> {\n * const response = await fetch('/api/data');\n * if (!response.ok) throw new Error('请求失败');\n * return response.json();\n * }\n * }\n * ```\n *\n * @param maxRetries - 最大重试次数\n * @param delayMs - 重试之间的延迟(毫秒)\n * @returns 方法装饰器\n */\nexport function Retry(maxRetries: number, delayMs: number = 0): MethodDecorator {\n return function (\n _target: object,\n _propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown;\n\n descriptor.value = async function (this: unknown, ...args: unknown[]): Promise<unknown> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n lastError = error;\n\n if (attempt < maxRetries && delayMs > 0) {\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n\n throw lastError;\n };\n\n return descriptor;\n };\n}\n\n/**\n * 用于为异步方法添加超时的装饰器。\n *\n * @example\n * ```typescript\n * class ApiClient {\n * @Timeout(5000)\n * async fetchData(): Promise<Data> {\n * // 如果这花费超过5秒,将抛出异常\n * return await fetch('/api/data').then(r => r.json());\n * }\n * }\n * ```\n *\n * @param timeoutMs - 超时时间(毫秒)\n * @param errorMessage - 可选的错误消息\n * @returns 方法装饰器\n */\nexport function Timeout(timeoutMs: number, errorMessage?: string): MethodDecorator {\n return function (\n _target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const originalMethod = descriptor.value as (...args: unknown[]) => Promise<unknown>;\n const methodName = String(propertyKey);\n\n descriptor.value = async function (this: unknown, ...args: unknown[]): Promise<unknown> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(errorMessage ?? `${methodName} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([originalMethod.apply(this, args), timeoutPromise]);\n };\n\n return descriptor;\n };\n}\n","/**\n * @fileoverview 用于资源管理的可释放基类\n * @module melange/core/disposable\n * @description 提供一个基类用于管理可释放资源\n * 包含适当的清理和生命周期管理。\n */\n\n/**\n * 可释放对象的接口。\n * 实现此接口的对象可以被正确清理。\n */\nexport interface IDisposable {\n /**\n * 释放此对象持有的资源。\n */\n dispose(): void;\n\n /**\n * 此对象是否已被释放。\n */\n readonly isDisposed: boolean;\n}\n\n/**\n * 管理可释放资源的对象的抽象基类。\n *\n * @description\n * Disposable 类提供了一种管理模式,用于管理需要显式清理的资源。\n * 它跟踪释放状态并防止重复释放。\n *\n * @example\n * ```typescript\n * class DatabaseConnection extends Disposable {\n * private connection: Connection;\n *\n * constructor() {\n * super();\n * this.connection = createConnection();\n * // 注册清理\n * this.addDisposable({\n * dispose: () => this.connection.close()\n * });\n * }\n *\n * query(sql: string) {\n * this.ensureNotDisposed();\n * return this.connection.query(sql);\n * }\n * }\n *\n * // 使用\n * const db = new DatabaseConnection();\n * try {\n * await db.query('SELECT * FROM users');\n * } finally {\n * db.dispose();\n * }\n * ```\n */\nexport abstract class Disposable implements IDisposable {\n /**\n * 此对象是否已被释放\n */\n private _isDisposed: boolean = false;\n\n /**\n * 待清理的可释放对象列表\n */\n private readonly disposables: IDisposable[] = [];\n\n /**\n * 获取此对象是否已被释放。\n */\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n /**\n * 释放此对象和所有已注册的可释放对象。\n * 多次调用 dispose 是安全的(后续调用无效)。\n */\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n\n this._isDisposed = true;\n\n // 按相反顺序释放(后进先出)\n for (let i = this.disposables.length - 1; i >= 0; i--) {\n try {\n this.disposables[i]?.dispose();\n } catch (error) {\n // 记录日志但不抛出异常 - 继续释放其他资源\n // eslint-disable-next-line no-console\n console.error('Error during disposal:', error);\n }\n }\n\n this.disposables.length = 0;\n\n // 调用子类清理方法\n this.onDispose();\n }\n\n /**\n * 注册一个可释放对象,在此对象被释放时进行清理。\n *\n * @template T - 可释放对象类型\n * @param disposable - 要注册的可释放对象\n * @returns 相同的可释放对象,用于链式调用\n */\n protected addDisposable<T extends IDisposable>(disposable: T): T {\n if (this._isDisposed) {\n // 如果已经释放,则立即释放新的可释放对象\n disposable.dispose();\n } else {\n this.disposables.push(disposable);\n }\n return disposable;\n }\n\n /**\n * 注册一个清理函数,在此对象被释放时调用。\n *\n * @param fn - 清理函数\n */\n protected addDisposeFn(fn: () => void): void {\n this.addDisposable({ dispose: fn, isDisposed: false });\n }\n\n /**\n * 如果此对象已被释放则抛出错误。\n * 在不应在释放后调用的方法开头使用此函数。\n *\n * @throws Error 如果对象已被释放\n */\n protected ensureNotDisposed(): void {\n if (this._isDisposed) {\n throw new Error('Object has been disposed');\n }\n }\n\n /**\n * 在对象被释放时调用。\n * 在子类中重写以执行自定义清理。\n */\n protected onDispose(): void {\n // 默认实现不执行任何操作\n }\n}\n\n/**\n * 用于管理多个可释放对象的工具类。\n * 适用于收集应一起释放的可释放对象。\n *\n * @example\n * ```typescript\n * const disposables = new DisposableStore();\n *\n * // 添加各种可释放对象\n * disposables.add(eventListener1);\n * disposables.add(eventListener2);\n * disposables.add({ dispose: () => cleanupSomething() });\n *\n * // 一次性释放所有对象\n * disposables.dispose();\n * ```\n */\nexport class DisposableStore implements IDisposable {\n private readonly items: Set<IDisposable> = new Set();\n private _isDisposed: boolean = false;\n\n /**\n * 获取此存储是否已被释放。\n */\n public get isDisposed(): boolean {\n return this._isDisposed;\n }\n\n /**\n * 向存储中添加可释放对象。\n *\n * @template T - 可释放对象类型\n * @param disposable - 要添加的可释放对象\n * @returns 相同的可释放对象,用于链式调用\n */\n public add<T extends IDisposable>(disposable: T): T {\n if (this._isDisposed) {\n disposable.dispose();\n } else {\n this.items.add(disposable);\n }\n return disposable;\n }\n\n /**\n * 从存储中移除可释放对象而不释放它。\n *\n * @param disposable - 要移除的可释放对象\n */\n public delete(disposable: IDisposable): void {\n this.items.delete(disposable);\n }\n\n /**\n * 释放存储中的所有项目并清空存储。\n */\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n\n this._isDisposed = true;\n\n for (const item of this.items) {\n try {\n item.dispose();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error during disposal:', error);\n }\n }\n\n this.items.clear();\n }\n\n /**\n * 释放所有项目但保持存储活跃以接收新项目。\n */\n public clear(): void {\n for (const item of this.items) {\n try {\n item.dispose();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error during disposal:', error);\n }\n }\n this.items.clear();\n }\n\n /**\n * 获取存储中的项目数量。\n */\n public get size(): number {\n return this.items.size;\n }\n}\n\n/**\n * 从清理函数创建可释放对象。\n *\n * @param dispose - 清理函数\n * @returns 可释放对象\n */\nexport function toDisposable(dispose: () => void): IDisposable {\n return {\n dispose,\n isDisposed: false,\n };\n}\n\n/**\n * 将多个可释放对象组合成单个可释放对象。\n *\n * @param disposables - 要组合的可释放对象\n * @returns 一次性释放所有对象的单个可释放对象\n */\nexport function combineDisposables(...disposables: IDisposable[]): IDisposable {\n return {\n dispose: () => {\n for (const d of disposables) {\n d.dispose();\n }\n },\n isDisposed: false,\n };\n}\n"]}