modern-ts 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +223 -0
- package/README.zh-CN.md +223 -0
- package/dist/chunks/Errors-BWEYu-AB.cjs +2 -0
- package/dist/chunks/Errors-BWEYu-AB.cjs.map +1 -0
- package/dist/chunks/Errors-DwUAvFIF.mjs +63 -0
- package/dist/chunks/Errors-DwUAvFIF.mjs.map +1 -0
- package/dist/chunks/Math-CGEH1ClN.mjs +68 -0
- package/dist/chunks/Math-CGEH1ClN.mjs.map +1 -0
- package/dist/chunks/Math-CWZVxSF-.cjs +2 -0
- package/dist/chunks/Math-CWZVxSF-.cjs.map +1 -0
- package/dist/chunks/base-B9k8Lqvf.mjs +56 -0
- package/dist/chunks/base-B9k8Lqvf.mjs.map +1 -0
- package/dist/chunks/base-BTXL1y_I.cjs +2 -0
- package/dist/chunks/base-BTXL1y_I.cjs.map +1 -0
- package/dist/chunks/base-BpECeKwU.mjs +19 -0
- package/dist/chunks/base-BpECeKwU.mjs.map +1 -0
- package/dist/chunks/base-BvHqpP_s.cjs +2 -0
- package/dist/chunks/base-BvHqpP_s.cjs.map +1 -0
- package/dist/chunks/base-K-RHLZ-S.mjs +46 -0
- package/dist/chunks/base-K-RHLZ-S.mjs.map +1 -0
- package/dist/chunks/base-r6kn0B0D.cjs +2 -0
- package/dist/chunks/base-r6kn0B0D.cjs.map +1 -0
- package/dist/chunks/combine-async-DcG-3p8i.cjs +2 -0
- package/dist/chunks/combine-async-DcG-3p8i.cjs.map +1 -0
- package/dist/chunks/combine-async-Dcg4ya1R.mjs +236 -0
- package/dist/chunks/combine-async-Dcg4ya1R.mjs.map +1 -0
- package/dist/chunks/delay-CG3cD7bk.cjs +2 -0
- package/dist/chunks/delay-CG3cD7bk.cjs.map +1 -0
- package/dist/chunks/delay-CKIXpP71.mjs +32 -0
- package/dist/chunks/delay-CKIXpP71.mjs.map +1 -0
- package/dist/chunks/helper-BVabbpmX.mjs +165 -0
- package/dist/chunks/helper-BVabbpmX.mjs.map +1 -0
- package/dist/chunks/helper-tsqZMRHW.cjs +3 -0
- package/dist/chunks/helper-tsqZMRHW.cjs.map +1 -0
- package/dist/chunks/local-8JVtLN0O.mjs +10 -0
- package/dist/chunks/local-8JVtLN0O.mjs.map +1 -0
- package/dist/chunks/local-Da4yU-nE.cjs +2 -0
- package/dist/chunks/local-Da4yU-nE.cjs.map +1 -0
- package/dist/chunks/types-B7X_LBjM.cjs +2 -0
- package/dist/chunks/types-B7X_LBjM.cjs.map +1 -0
- package/dist/chunks/types-DE2SnSbz.mjs +5 -0
- package/dist/chunks/types-DE2SnSbz.mjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +759 -0
- package/dist/index.mjs.map +1 -0
- package/dist/subpath/Arr.cjs +2 -0
- package/dist/subpath/Arr.cjs.map +1 -0
- package/dist/subpath/Arr.mjs +539 -0
- package/dist/subpath/Arr.mjs.map +1 -0
- package/dist/subpath/Concurrent.cjs +15 -0
- package/dist/subpath/Concurrent.cjs.map +1 -0
- package/dist/subpath/Concurrent.mjs +4044 -0
- package/dist/subpath/Concurrent.mjs.map +1 -0
- package/dist/subpath/FetchQ.cjs +2 -0
- package/dist/subpath/FetchQ.cjs.map +1 -0
- package/dist/subpath/FetchQ.mjs +519 -0
- package/dist/subpath/FetchQ.mjs.map +1 -0
- package/dist/subpath/Fit.cjs +2 -0
- package/dist/subpath/Fit.cjs.map +1 -0
- package/dist/subpath/Fit.mjs +914 -0
- package/dist/subpath/Fit.mjs.map +1 -0
- package/dist/subpath/Lazy.cjs +2 -0
- package/dist/subpath/Lazy.cjs.map +1 -0
- package/dist/subpath/Lazy.mjs +72 -0
- package/dist/subpath/Lazy.mjs.map +1 -0
- package/dist/subpath/Maps.cjs +2 -0
- package/dist/subpath/Maps.cjs.map +1 -0
- package/dist/subpath/Maps.mjs +123 -0
- package/dist/subpath/Maps.mjs.map +1 -0
- package/dist/subpath/Maybe.cjs +2 -0
- package/dist/subpath/Maybe.cjs.map +1 -0
- package/dist/subpath/Maybe.mjs +329 -0
- package/dist/subpath/Maybe.mjs.map +1 -0
- package/dist/subpath/Reactive.cjs +2 -0
- package/dist/subpath/Reactive.cjs.map +1 -0
- package/dist/subpath/Reactive.mjs +1204 -0
- package/dist/subpath/Reactive.mjs.map +1 -0
- package/dist/subpath/Reader.cjs +2 -0
- package/dist/subpath/Reader.cjs.map +1 -0
- package/dist/subpath/Reader.mjs +75 -0
- package/dist/subpath/Reader.mjs.map +1 -0
- package/dist/subpath/ReaderT.cjs +2 -0
- package/dist/subpath/ReaderT.cjs.map +1 -0
- package/dist/subpath/ReaderT.mjs +148 -0
- package/dist/subpath/ReaderT.mjs.map +1 -0
- package/dist/subpath/Resource.cjs +2 -0
- package/dist/subpath/Resource.cjs.map +1 -0
- package/dist/subpath/Resource.mjs +150 -0
- package/dist/subpath/Resource.mjs.map +1 -0
- package/dist/subpath/Result.cjs +2 -0
- package/dist/subpath/Result.cjs.map +1 -0
- package/dist/subpath/Result.mjs +337 -0
- package/dist/subpath/Result.mjs.map +1 -0
- package/dist/subpath/Sets.cjs +2 -0
- package/dist/subpath/Sets.cjs.map +1 -0
- package/dist/subpath/Sets.mjs +92 -0
- package/dist/subpath/Sets.mjs.map +1 -0
- package/dist/subpath/Str.cjs +2 -0
- package/dist/subpath/Str.cjs.map +1 -0
- package/dist/subpath/Str.mjs +114 -0
- package/dist/subpath/Str.mjs.map +1 -0
- package/dist/subpath/TxScope.cjs +2 -0
- package/dist/subpath/TxScope.cjs.map +1 -0
- package/dist/subpath/TxScope.mjs +138 -0
- package/dist/subpath/TxScope.mjs.map +1 -0
- package/dist/subpath/TypeTool.cjs +2 -0
- package/dist/subpath/TypeTool.cjs.map +1 -0
- package/dist/subpath/TypeTool.mjs +9 -0
- package/dist/subpath/TypeTool.mjs.map +1 -0
- package/dist/subpath/Utils.cjs +2 -0
- package/dist/subpath/Utils.cjs.map +1 -0
- package/dist/subpath/Utils.mjs +835 -0
- package/dist/subpath/Utils.mjs.map +1 -0
- package/dist/subpath/VirtualTime.cjs +2 -0
- package/dist/subpath/VirtualTime.cjs.map +1 -0
- package/dist/subpath/VirtualTime.mjs +1186 -0
- package/dist/subpath/VirtualTime.mjs.map +1 -0
- package/dist/types/Arr.d.ts +2 -0
- package/dist/types/Concurrent/Lock/condition_variable.d.ts +138 -0
- package/dist/types/Concurrent/Lock/mutex.d.ts +185 -0
- package/dist/types/Concurrent/Lock/rwlock.d.ts +253 -0
- package/dist/types/Concurrent/Lock/semaphore.d.ts +208 -0
- package/dist/types/Concurrent/Valve/__export__.d.ts +5 -0
- package/dist/types/Concurrent/Valve/circuit-breaker.d.ts +146 -0
- package/dist/types/Concurrent/Valve/leaky-bucket.d.ts +115 -0
- package/dist/types/Concurrent/Valve/sliding-window.d.ts +91 -0
- package/dist/types/Concurrent/Valve/token-bucket.d.ts +68 -0
- package/dist/types/Concurrent/__export__.d.ts +15 -0
- package/dist/types/Concurrent/barrier.d.ts +255 -0
- package/dist/types/Concurrent/channel.d.ts +239 -0
- package/dist/types/Concurrent/delay.d.ts +42 -0
- package/dist/types/Concurrent/ext/map.d.ts +82 -0
- package/dist/types/Concurrent/ext/other.d.ts +113 -0
- package/dist/types/Concurrent/ext/race.d.ts +31 -0
- package/dist/types/Concurrent/ext/some.d.ts +64 -0
- package/dist/types/Concurrent/limiter.d.ts +131 -0
- package/dist/types/Concurrent/scheduler.d.ts +171 -0
- package/dist/types/Concurrent/task-scope.d.ts +282 -0
- package/dist/types/Concurrent.d.ts +2 -0
- package/dist/types/Errors.d.ts +66 -0
- package/dist/types/FetchQ.d.ts +2 -0
- package/dist/types/Fit/__export__.d.ts +5 -0
- package/dist/types/Fit/base.d.ts +325 -0
- package/dist/types/Fit/parser.d.ts +110 -0
- package/dist/types/Fit/standard-schema.d.ts +127 -0
- package/dist/types/Fit/sugar.d.ts +274 -0
- package/dist/types/Fit/tool.d.ts +585 -0
- package/dist/types/Fit.d.ts +2 -0
- package/dist/types/Lazy.d.ts +2 -0
- package/dist/types/Maps.d.ts +2 -0
- package/dist/types/Maybe/__export__.d.ts +6 -0
- package/dist/types/Maybe/base.d.ts +62 -0
- package/dist/types/Maybe/consumers-async.d.ts +58 -0
- package/dist/types/Maybe/consumers.d.ts +63 -0
- package/dist/types/Maybe/operators-async.d.ts +145 -0
- package/dist/types/Maybe/operators.d.ts +177 -0
- package/dist/types/Maybe/types.d.ts +12 -0
- package/dist/types/Maybe.d.ts +2 -0
- package/dist/types/MockClock/Timeline.d.ts +392 -0
- package/dist/types/MockClock/TimerHandle.d.ts +159 -0
- package/dist/types/MockClock/TimerHeap.d.ts +21 -0
- package/dist/types/MockClock/VirtualTimeManager.d.ts +23 -0
- package/dist/types/MockClock/__export__.d.ts +104 -0
- package/dist/types/MockClock/hooks/__export__.d.ts +9 -0
- package/dist/types/MockClock/hooks/hookAbortSignal.d.ts +3 -0
- package/dist/types/MockClock/hooks/hookDate.d.ts +3 -0
- package/dist/types/MockClock/hooks/hookIntl.d.ts +3 -0
- package/dist/types/MockClock/hooks/hookMessageChannel.d.ts +3 -0
- package/dist/types/MockClock/hooks/hookMicrotasks.d.ts +3 -0
- package/dist/types/MockClock/hooks/hookOs.d.ts +3 -0
- package/dist/types/MockClock/hooks/hookPerformance.d.ts +3 -0
- package/dist/types/MockClock/hooks/hookProcess.d.ts +3 -0
- package/dist/types/MockClock/hooks/hookTimers.d.ts +3 -0
- package/dist/types/MockClock/types.d.ts +103 -0
- package/dist/types/Other/FetchQ.d.ts +320 -0
- package/dist/types/Other/deque.d.ts +59 -0
- package/dist/types/Other/disjointSet.d.ts +53 -0
- package/dist/types/Other/heap.d.ts +41 -0
- package/dist/types/Other/lazy.d.ts +127 -0
- package/dist/types/Other/queue.d.ts +42 -0
- package/dist/types/Other/secret.d.ts +111 -0
- package/dist/types/Other/stack.d.ts +40 -0
- package/dist/types/Reactive/__export__.d.ts +4 -0
- package/dist/types/Reactive/event_emitter.d.ts +195 -0
- package/dist/types/Reactive/flow-combination.d.ts +74 -0
- package/dist/types/Reactive/flow.d.ts +180 -0
- package/dist/types/Reactive/pace.d.ts +80 -0
- package/dist/types/Reactive.d.ts +2 -0
- package/dist/types/Reader/__export-readerT__.d.ts +4 -0
- package/dist/types/Reader/__export-reader__.d.ts +4 -0
- package/dist/types/Reader/local.d.ts +39 -0
- package/dist/types/Reader/reader-async.d.ts +84 -0
- package/dist/types/Reader/reader.d.ts +96 -0
- package/dist/types/Reader/readerT-async.d.ts +186 -0
- package/dist/types/Reader/readerT.d.ts +178 -0
- package/dist/types/Reader/types.d.ts +37 -0
- package/dist/types/Reader.d.ts +2 -0
- package/dist/types/ReaderT.d.ts +2 -0
- package/dist/types/Resource/TxScope-async.d.ts +86 -0
- package/dist/types/Resource/TxScope.d.ts +85 -0
- package/dist/types/Resource/__export-TxScope__.d.ts +2 -0
- package/dist/types/Resource/__export-resource__.d.ts +2 -0
- package/dist/types/Resource/resource-async.d.ts +79 -0
- package/dist/types/Resource/resource.d.ts +78 -0
- package/dist/types/Resource/types.d.ts +79 -0
- package/dist/types/Resource.d.ts +2 -0
- package/dist/types/Result/Consumers/branch-async.d.ts +77 -0
- package/dist/types/Result/Consumers/branch.d.ts +70 -0
- package/dist/types/Result/Consumers/inspect.d.ts +66 -0
- package/dist/types/Result/Operators/Async/combine-async.d.ts +69 -0
- package/dist/types/Result/Operators/Async/partition-async.d.ts +29 -0
- package/dist/types/Result/Operators/Async/reduce-async.d.ts +15 -0
- package/dist/types/Result/Operators/Async/transform-async.d.ts +90 -0
- package/dist/types/Result/Operators/combine.d.ts +60 -0
- package/dist/types/Result/Operators/flatten.d.ts +26 -0
- package/dist/types/Result/Operators/partition.d.ts +25 -0
- package/dist/types/Result/Operators/reduce.d.ts +12 -0
- package/dist/types/Result/Operators/transform.d.ts +70 -0
- package/dist/types/Result/__export__.d.ts +14 -0
- package/dist/types/Result/base.d.ts +115 -0
- package/dist/types/Result/types.d.ts +34 -0
- package/dist/types/Result.d.ts +2 -0
- package/dist/types/Sets.d.ts +2 -0
- package/dist/types/Str.d.ts +2 -0
- package/dist/types/TxScope.d.ts +2 -0
- package/dist/types/TypeTool.d.ts +2 -0
- package/dist/types/Utils/Array/__export__.d.ts +10 -0
- package/dist/types/Utils/Array/filtering.d.ts +89 -0
- package/dist/types/Utils/Array/flatten.d.ts +45 -0
- package/dist/types/Utils/Array/grouping.d.ts +44 -0
- package/dist/types/Utils/Array/iteration.d.ts +86 -0
- package/dist/types/Utils/Array/operators.d.ts +62 -0
- package/dist/types/Utils/Array/randomization.d.ts +76 -0
- package/dist/types/Utils/Array/set.d.ts +108 -0
- package/dist/types/Utils/Array/slice.d.ts +189 -0
- package/dist/types/Utils/Array/sorting.d.ts +55 -0
- package/dist/types/Utils/Array/zip.d.ts +93 -0
- package/dist/types/Utils/Functions/__export__.d.ts +5 -0
- package/dist/types/Utils/Functions/base.d.ts +157 -0
- package/dist/types/Utils/Functions/curry.d.ts +73 -0
- package/dist/types/Utils/Functions/debounce.d.ts +240 -0
- package/dist/types/Utils/Functions/defer.d.ts +43 -0
- package/dist/types/Utils/Functions/pipe.d.ts +205 -0
- package/dist/types/Utils/Map.d.ts +284 -0
- package/dist/types/Utils/Math.d.ts +225 -0
- package/dist/types/Utils/Object/__export__.d.ts +2 -0
- package/dist/types/Utils/Object/base.d.ts +131 -0
- package/dist/types/Utils/Object/clone.d.ts +81 -0
- package/dist/types/Utils/Predicates.d.ts +361 -0
- package/dist/types/Utils/Set.d.ts +105 -0
- package/dist/types/Utils/String.d.ts +217 -0
- package/dist/types/Utils/__export__.d.ts +9 -0
- package/dist/types/Utils/type-tool.d.ts +168 -0
- package/dist/types/Utils.d.ts +2 -0
- package/dist/types/VirtualTime.d.ts +2 -0
- package/dist/types/helper.d.ts +71 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/unknown-error.d.ts +98 -0
- package/package.json +179 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Utils.cjs","sources":["../../src/Utils/Functions/pipe.ts","../../src/Utils/Functions/curry.ts","../../src/Utils/Functions/debounce.ts","../../src/Utils/Functions/defer.ts","../../src/Utils/Predicates.ts","../../src/Utils/Object/base.ts","../../src/Utils/Object/clone.ts"],"sourcesContent":["// ========================================\r\n// ./src/Utils/Functions/pipe.ts\r\n// ========================================\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport {isPromiseLike} from '../../helper';\r\nimport {identity, type IdentityFn} from './base';\r\n\r\n/**\r\n * Represents a value that can either be of type `Out` or `Promise<Out>`, depending on the `IsAsync` flag.\r\n * @template Out - The resolved output type\r\n * @template IsAsync - Boolean flag indicating if the function is asynchronous\r\n */\r\ntype MaybePromise<Out, IsAsync extends boolean> = IsAsync extends true\r\n ? Out | Promise<Out>\r\n : Out;\r\n\r\n/**\r\n * The base type for the *first* function in a pipe, which can take multiple arguments.\r\n * @template In - The input arguments tuple type\r\n * @template Out - The resolved output type\r\n * @template IsAsync - Boolean flag indicating if the function is asynchronous\r\n */\r\ntype BaseFn<In extends readonly unknown[], Out, IsAsync extends boolean> = (\r\n ...args: In\r\n) => MaybePromise<Out, IsAsync>;\r\n\r\n/**\r\n * The base type for *subsequent* functions in a pipe, which must take exactly one input argument.\r\n * @template In - The single input argument type (which is the output of the previous function)\r\n * @template Out - The resolved output type\r\n * @template IsAsync - Boolean flag indicating if the function is asynchronous\r\n */\r\ntype BaseNextFn<In, Out, IsAsync extends boolean> = (\r\n input: In,\r\n) => MaybePromise<Out, IsAsync>;\r\n\r\n// ============================================\r\n// 类型错误提示\r\n// ============================================\r\n\r\n/**\r\n * A type that forces a TypeScript error when a pipe function's input type\r\n * (Actual) does not match the previous function's output type (Expected). (Sync version)\r\n * @template Expected - The expected input type\r\n * @template Actual - The actual input type received (from the previous function's output)\r\n */\r\nexport type PipeError<Expected, Actual> = {\r\n __error: never;\r\n expected: Expected;\r\n actual: Actual;\r\n};\r\n\r\n/**\r\n * A type that forces a TypeScript error when a pipe function's input type\r\n * (Actual) does not match the previous function's output type (Expected). (Async version)\r\n * @template Expected - The expected input type\r\n * @template Actual - The actual input type received (from the previous function's output)\r\n */\r\nexport type PipeErrorAsync<Expected, Actual> = (\r\n __error: never,\r\n expected: Expected,\r\n actual: Actual,\r\n) => Actual;\r\n\r\n/**\r\n * A type that forces a TypeScript error when the initial input of `run`\r\n * (Actual) does not match the input type of the first function (Expected). (Sync version)\r\n * @template Expected - The expected input type of the first function\r\n * @template Actual - The actual input type provided to `run`\r\n */\r\ntype RunInputError<Expected, Actual> = (\r\n __error: never,\r\n expected: Expected,\r\n actual: Actual,\r\n) => Actual;\r\n\r\n/**\r\n * A type that forces a TypeScript error when the initial input of `runAsync`\r\n * (Actual) does not match the input type of the first function (Expected). (Async version)\r\n * @template Expected - The expected input type of the first function\r\n * @template Actual - The actual input type provided to `runAsync`\r\n */\r\ntype RunInputErrorAsync<Expected, Actual> = (\r\n __error: never,\r\n expected: Expected,\r\n actual: Actual,\r\n) => Actual;\r\n\r\n// ============================================\r\n// 核心校验\r\n// ============================================\r\n\r\n/**\r\n * Validates if the initial input type (T) matches the input type of the first function (F1).\r\n * @template T - The actual input type provided to `run`/`runAsync`\r\n * @template F1 - The type of the first function in the pipe\r\n * @template IsAsync - Boolean flag for async validation mode\r\n */\r\ntype VInput<T, F1, IsAsync extends boolean> =\r\n F1 extends BaseNextFn<infer ExpectedIn, unknown, IsAsync> // [L1]:约束 第一个函数必须满足 BaseNextFn(单参数)\r\n ? T extends ExpectedIn // [L2]:类型T必须能够兼容ExpectedIn(run的第一个参数T,能否兼容第一个函数F1)\r\n ? T\r\n : IsAsync extends true // [L2]:不兼容就报错!\r\n ? RunInputErrorAsync<ExpectedIn, T>\r\n : RunInputError<ExpectedIn, T>\r\n : IsAsync extends true // [L1]:如果不满足 BaseNextFn,则会报错\r\n ? RunInputErrorAsync<unknown[], T>\r\n : RunInputError<unknown[], T>;\r\n\r\n/**\r\n * Recursively validates the function chain to ensure the output of the preceding function\r\n * is compatible with the input of the succeeding function. Uses Tail Recursion Optimization (TRO) pattern.\r\n * @template Fns - The remaining functions to validate\r\n * @template IsAsync - Boolean flag for async validation mode\r\n * @template Acc - Accumulator holding the validated functions so far (used for TRO)\r\n */\r\ntype VFuncsIterative<\r\n Fns extends readonly unknown[],\r\n IsAsync extends boolean,\r\n Acc extends readonly unknown[] = [], // 累加器\r\n> = Fns extends readonly [infer F, ...infer R] // [L1]:解构成功,还有函数待处理\r\n ? F extends\r\n | BaseFn<infer _I, infer O, IsAsync>\r\n | BaseNextFn<unknown, infer O, IsAsync>\r\n ? // [L2]:F 是合法函数。检查下一个函数 S。\r\n R extends readonly [infer S, ...infer Oth] // [L3]:S 存在\r\n ? S extends BaseNextFn<\r\n IsAsync extends true ? Awaited<O> : O,\r\n unknown,\r\n IsAsync\r\n >\r\n ? // [L4]:S 匹配 F 的输出。-> 尾递归调用(成功)\r\n VFuncsIterative<\r\n R, // R 是 [S, ...Oth]\r\n IsAsync,\r\n [...Acc, F] // TRO:将 F 放入累加器!\r\n >\r\n : // [L4]:S 匹配 F 的输出失败。-> 返回错误元组(结束)\r\n [\r\n ...Acc,\r\n F,\r\n IsAsync extends true\r\n ? PipeErrorAsync<IsAsync extends true ? Awaited<O> : O, S>\r\n : PipeError<IsAsync extends true ? Awaited<O> : O, S>,\r\n ...(Oth extends readonly unknown[] ? Oth : []),\r\n ]\r\n : // [L3]:R 为空元组 []。-> 递归结束(成功)\r\n [...Acc, F] // 最后的 F 也加入 Acc 中\r\n : // [L2]:F 不是合法函数。-> 返回错误元组(结束)\r\n [\r\n ...Acc,\r\n IsAsync extends true\r\n ? PipeErrorAsync<unknown[], F>\r\n : PipeError<unknown[], F>,\r\n ...(R extends readonly unknown[] ? R : []),\r\n ]\r\n : Fns extends [] // [L1]:Fns 为空元组 []。-> 递归结束(初始 Fns 为空,或已跑完)\r\n ? Acc\r\n : Fns; // [L1]:Fns 无法解构或不匹配,原样返回\r\n\r\n// ============================================\r\n// 最终类型提取\r\n// ============================================\r\n\r\n/**\r\n * Extracts the final resolved output type from the function chain.\r\n * @template Fns - The function chain\r\n * @template IsAsync - Boolean flag for async mode\r\n */\r\n\r\ntype FinalOut<\r\n Fns extends readonly unknown[],\r\n IsAsync extends boolean,\r\n> = Fns extends [\r\n ...unknown[],\r\n (\r\n // 若在此处将any换成unknown将导致返回值推断为never\r\n BaseFn<any[], infer O, IsAsync> | BaseNextFn<unknown, infer O, IsAsync>\r\n ),\r\n]\r\n ? IsAsync extends true\r\n ? Awaited<O>\r\n : O\r\n : never;\r\n\r\n/**\r\n * Extracts the full signature of the resulting curried pipe function.\r\n * @template Fns - The validated function chain\r\n * @template IsAsync - Boolean flag for async mode\r\n */\r\ntype BasePipeR<\r\n Fns extends readonly unknown[],\r\n IsAsync extends boolean,\r\n> = Fns extends [BaseFn<infer I, unknown, IsAsync>, ...unknown[]]\r\n ? (...args: I) => IsAsync extends true\r\n ? Promise<FinalOut<Fns, IsAsync>> // 强制要求异步管道返回 Promise\r\n : FinalOut<Fns, IsAsync>\r\n : never;\r\n\r\n// ============================================\r\n// 同步/异步别名导出\r\n// ============================================\r\n\r\n// -- 同步别名 --\r\n\r\n/**\r\n * Alias for a synchronous, multi-argument function (first function in sync pipe).\r\n * @template In - The input arguments tuple type\r\n * @template Out - The output type\r\n */\r\ntype Fn<In extends unknown[], Out> = BaseFn<In, Out, false>;\r\n\r\n/**\r\n * Alias for a synchronous, single-argument function (subsequent functions in sync pipe).\r\n * @template In - The single input argument type\r\n * @template Out - The output type\r\n */\r\ntype NextFn<In, Out> = BaseNextFn<In, Out, false>;\r\n\r\n/**\r\n * Type validation for a synchronous function chain.\r\n * @template Fns - The function chain to validate\r\n */\r\ntype VFuncs<Fns extends readonly unknown[]> = VFuncsIterative<Fns, false>;\r\n\r\n/**\r\n * Extracts the final synchronous output type.\r\n * @template Fns - The function chain\r\n */\r\ntype Out<Fns extends readonly unknown[]> = FinalOut<Fns, false>;\r\n\r\n/**\r\n * Extracts the final synchronous pipe function signature.\r\n * @template Fns - The function chain\r\n */\r\ntype PipeR<Fns extends readonly unknown[]> = BasePipeR<Fns, false>;\r\n\r\n// -- 异步别名 --\r\n\r\n/**\r\n * Alias for an asynchronous, multi-argument function (first function in async pipe).\r\n * @template In - The input arguments tuple type\r\n * @template Out - The output type\r\n */\r\ntype AsyncFn<In extends unknown[], Out> = BaseFn<In, Out, true>;\r\n\r\n/**\r\n * Alias for an asynchronous, single-argument function (subsequent functions in async pipe).\r\n * @template In - The single input argument type\r\n * @template Out - The output type\r\n */\r\ntype AsyncNextFn<In, Out> = BaseNextFn<In, Out, true>;\r\n\r\n/**\r\n * Type validation for an asynchronous function chain.\r\n * @template Fns - The function chain to validate\r\n */\r\ntype AsyncVFuncs<Fns extends readonly unknown[]> = VFuncsIterative<Fns, true>;\r\n\r\n/**\r\n * Extracts the final asynchronous output type.\r\n * @template Fns - The function chain\r\n */\r\ntype AsyncOut<Fns extends readonly unknown[]> = FinalOut<Fns, true>;\r\n\r\n/**\r\n * Extracts the final asynchronous pipe function signature.\r\n * @template Fns - The function chain\r\n */\r\ntype AsyncPipeR<Fns extends readonly unknown[]> = BasePipeR<Fns, true>;\r\n\r\n// ============================================\r\n// 运行时实现\r\n// ============================================\r\n\r\n/**\r\n * Core logic for executing the synchronous pipeline.\r\n * @param initial_value - The initial input value for the pipeline.\r\n * @param fns - The sequence of functions to execute (must be of type NextFn<unknown, unknown>).\r\n * @returns The final synchronous result of the pipeline.\r\n */\r\nfunction execute_pipeline(\r\n initial_value: unknown,\r\n fns: readonly NextFn<unknown, unknown>[],\r\n): unknown {\r\n let result: unknown = initial_value;\r\n for (const fn of fns) {\r\n result = fn(result);\r\n }\r\n return result;\r\n}\r\n/**\r\n * Core asynchronous pipeline execution logic (handling Promise switching).\r\n * @param initial_value - The initial input value of the pipeline.\r\n * @param fns - The list of functions to be executed (must be of type AsyncNextFn<unknown, unknown>).\r\n * @returns The final result of the pipeline (which may be a synchronous value or a Promise).\r\n */\r\nfunction execute_async_pipeline(\r\n initial_value: unknown,\r\n fns: readonly AsyncNextFn<unknown, unknown>[],\r\n): MaybePromise<unknown, true> {\r\n let result: unknown = initial_value;\r\n\r\n // 尝试同步循环并检查异步切换点\r\n for (let i = 0; i < fns.length; i++) {\r\n result = fns[i](result);\r\n\r\n if (isPromiseLike(result)) {\r\n // 发现 Promise,立即切换到异步接管模式!\r\n return (async () => {\r\n let async_result = await result; // 等待当前的 Promise\r\n\r\n // 接管并执行后续函数\r\n for (let j = i + 1; j < fns.length; j++) {\r\n async_result = fns[j](async_result);\r\n if (isPromiseLike(async_result)) {\r\n async_result = await async_result; // 遇到新的 Promise 继续等待\r\n }\r\n }\r\n return async_result;\r\n })();\r\n }\r\n }\r\n\r\n // 全同步时,直接返回同步值\r\n return result;\r\n}\r\n\r\n/**\r\n * Executes a synchronous function chain with an initial input.\r\n * All intermediate function results are passed synchronously.\r\n * @template T - The type of the initial input\r\n * @template Fns - The tuple of functions in the pipe (validated)\r\n * @template F1 - The type of the first function\r\n * @param input - The initial value to start the pipe with\r\n * @param fns - The sequence of functions to execute\r\n * @returns The final synchronous result\r\n */\r\nexport function run<\r\n T,\r\n Fns extends readonly [NextFn<any, any>, ...NextFn<any, any>[]],\r\n F1 extends Fns[0], // 提取第一个函数类型\r\n>(\r\n input: VInput<T, F1, false>, // 在 input 参数上强制校验 T 是否匹配 F1 的输入类型\r\n ...fns: VFuncs<Fns> // VFuncs 负责链式校验\r\n): Out<Fns> {\r\n return execute_pipeline(input, fns as NextFn<unknown, unknown>[]) as Out<Fns>;\r\n}\r\n\r\n/**\r\n * Creates a synchronous, multi-argument function that executes a sequence of functions from left-to-right.\r\n * The output of each function (except the first) is passed as the input to the next.\r\n * @returns Returns an identity function if no functions are provided\r\n */\r\nexport function pipe(): IdentityFn;\r\n\r\n/**\r\n * Creates a synchronous, multi-argument function that executes a sequence of functions from left-to-right.\r\n * The output of each function (except the first) is passed as the input to the next.\r\n * @template Fns - The tuple of functions in the pipe (validated)\r\n * @param fns - The sequence of functions to compose\r\n * @returns The composed synchronous function\r\n */\r\nexport function pipe<\r\n Fns extends readonly [Fn<any, any>, ...NextFn<any, any>[]],\r\n>(...fns: VFuncs<Fns>): PipeR<Fns>;\r\n\r\nexport function pipe(...fns: unknown[]): unknown {\r\n if (fns.length === 0) {\r\n return identity; // 如果没有函数,返回恒等函数\r\n }\r\n // 返回柯里化函数\r\n return (...args: unknown[]) => {\r\n // 1. 先执行第一个多参数函数\r\n const first_result = (fns[0] as Fn<unknown[], unknown>)(...args);\r\n\r\n // 2. 将结果和后续的单参数函数传入公共执行器\r\n const subsequent_fns = fns.slice(1) as NextFn<unknown, unknown>[];\r\n return execute_pipeline(first_result, subsequent_fns);\r\n };\r\n}\r\n\r\n/**\r\n * Executes a potentially asynchronous function chain with an initial input.\r\n * It will run synchronously until the first `Promise` is encountered, then switch to async execution.\r\n * @template T - The type of the initial input\r\n * @template Fns - The tuple of functions in the pipe (validated)\r\n * @template F1 - The type of the first function\r\n * @param input - The initial value to start the pipe with\r\n * @param fns - The sequence of async-compatible functions to execute\r\n * @returns The final result, which may be a Promise\r\n */\r\nexport function runAsync<\r\n T,\r\n Fns extends [AsyncNextFn<any, any>, ...AsyncNextFn<any, any>[]],\r\n F1 extends Fns[0],\r\n>(\r\n input: VInput<T, F1, true>,\r\n ...fns: AsyncVFuncs<Fns>\r\n): Promise<AsyncOut<Fns>> {\r\n return execute_async_pipeline(\r\n input,\r\n fns as AsyncNextFn<unknown, unknown>[],\r\n ) as Promise<AsyncOut<Fns>>;\r\n}\r\n\r\n/**\r\n * Creates a multi-argument function that executes a sequence of potentially asynchronous functions from left-to-right.\r\n * The resulting function returns a `Promise` if any function in the chain returns one.\r\n * @returns Returns an identity function if no functions are provided\r\n */\r\nexport function pipeAsync(): IdentityFn;\r\n\r\n/**\r\n * Creates a multi-argument function that executes a sequence of potentially asynchronous functions from left-to-right.\r\n * The resulting function returns a `Promise` if any function in the chain returns one.\r\n * @template Fns - The tuple of async-compatible functions in the pipe (validated)\r\n * @param fns - The sequence of functions to compose\r\n * @returns The composed async-compatible function\r\n */\r\nexport function pipeAsync<\r\n Fns extends readonly [AsyncFn<any, any>, ...AsyncNextFn<any, any>[]],\r\n>(...fns: AsyncVFuncs<Fns>): AsyncPipeR<Fns>;\r\nexport function pipeAsync(...fns: unknown[]): unknown {\r\n if (fns.length === 0) {\r\n return identity;\r\n }\r\n\r\n // 返回柯里化函数\r\n return (...args: unknown[]) => {\r\n // 1. 执行第一个多参数函数\r\n const result: unknown = (fns[0] as AsyncFn<unknown[], unknown>)(...args);\r\n\r\n const subsequent_fns = fns.slice(1) as AsyncNextFn<unknown, unknown>[];\r\n\r\n // 2. 检查第一个函数是否返回 Promise\r\n if (isPromiseLike(result)) {\r\n // 如果第一个函数就是异步的,切换到 Promise 链式执行\r\n return (async () => {\r\n const async_result = await result;\r\n return execute_async_pipeline(\r\n async_result,\r\n subsequent_fns,\r\n ) as BasePipeR<[AsyncFn<unknown[], unknown>], true>;\r\n })();\r\n }\r\n\r\n // 3. 如果第一个函数是同步的,则传入执行器,让执行器处理后续可能出现的异步\r\n return execute_async_pipeline(result, subsequent_fns) as BasePipeR<\r\n [AsyncFn<unknown[], unknown>],\r\n true\r\n >;\r\n };\r\n}\r\n","// ========================================\n// ./src/Utils/Functions/curry.ts\n// ========================================\n\nimport {ParameterError} from 'src/Errors';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFunction = (...args: any[]) => any;\n\n/**\n * The placeholder symbol used in curried functions to skip arguments.\n */\nexport const __ = Symbol('Curry placeholder');\n\n/**\n * Type alias for the curry placeholder symbol.\n */\nexport type __ = typeof __;\n\n// -- Internal Types --\n\n/**\n * A brand type used internally to signal an invalid call (e.g., calling without any arguments).\n */\ntype EmptyCallError = {\n readonly __error_brand: unique symbol;\n};\n\n/**\n * Validates whether the provided arguments (T) form a valid prefix for the expected arguments (A).\n * Prevents empty calls and ensures types match or use the placeholder.\n * @template T - The arguments currently provided\n * @template A - The expected arguments of the original function\n */\ntype ValidApply<\n T extends readonly unknown[],\n A extends readonly unknown[],\n> = T['length'] extends 0 // 禁止空调用,这毫无意义\n ? [EmptyCallError]\n : IsValidPrefix<T, A> extends true // 检测前缀是否符合\n ? T\n : {\n [K in keyof T]: K extends keyof A\n ? T[K] extends A[K] | __\n ? T[K]\n : A[K] // 精准指出哪一格错了\n : never;\n };\n\n/**\n * Recursively checks if the `Given` arguments are a valid prefix of the `Expected` arguments,\n * allowing the placeholder `__` in place of any expected argument type.\n * @template Given - The arguments provided in the current call\n * @template Expected - The remaining arguments expected by the original function\n */\ntype IsValidPrefix<\n Given extends readonly unknown[],\n Expected extends readonly unknown[],\n> = Given extends readonly [infer GFirst, ...infer GRest]\n ? Expected extends readonly [infer EFirst, ...infer ERest]\n ? GFirst extends EFirst | __\n ? IsValidPrefix<GRest, ERest>\n : false // 类型不匹配,直接出局\n : false // Given 还没完,Expected 没了,短了!\n : true; // Given 耗尽,校验通过\n\n/**\n * Calculates the types of the remaining arguments needed after a call,\n * filling the types corresponding to used placeholders (`__`).\n * @template Given - The arguments provided in the current call\n * @template Expected - The remaining arguments expected by the original function\n */\ntype RemainingArgs<\n Given extends readonly unknown[],\n Expected extends readonly unknown[],\n Acc extends readonly unknown[] = [], // 累加器\n> = Given extends readonly []\n ? [...Acc, ...Expected] // 递归终点:把攒下的孔洞类型和剩余预期合并\n : Expected extends readonly []\n ? Acc // 给多了也不怕\n : Given extends readonly [infer GFirst, ...infer GRest]\n ? Expected extends readonly [infer EFirst, ...infer ERest]\n ? GFirst extends __\n ? RemainingArgs<GRest, ERest, [...Acc, EFirst]> // 遇到占位符,把类型塞进累加器,继续递归\n : RemainingArgs<GRest, ERest, Acc> // 填了实参,直接跳过这一位\n : Acc\n : Acc;\n\n/**\n * Checks if all arguments required by the original function are now provided\n * (i.e., provided arguments match expected length and contain no placeholders).\n * @template Given - The currently accumulated arguments\n * @template Expected - The required arguments of the original function\n */\ntype AllArgsProvided<\n Given extends readonly unknown[],\n Expected extends readonly unknown[],\n> = Given['length'] extends Expected['length']\n ? __ extends Given[number]\n ? false // 长度够了但有占位符,还没完\n : true // 长度够了且全是实参,大功告成!\n : false;\n\n/**\n * Checks if the function has a rest parameter (...args) by comparing the length\n * of the parameter array to the length of the parameter array with placeholders replaced.\n * @template A - The parameter array of the function\n */\ntype IsRestParameter<A extends readonly unknown[]> = number extends A['length']\n ? true\n : false;\n\n/**\n * Overloaded type definition for the `curry` function. It recursively defines the\n * return type based on the arguments provided in the current call.\n * @template F - The function being curried\n */\n\ntype Curry<F> = F extends (...args: infer A) => infer R\n ? IsRestParameter<A> extends true\n ? {\n readonly __error: 'Cannot curry a function with rest parameters (...args). Please use fixed-arity functions.';\n }\n : A['length'] extends 0\n ? {\n readonly __error: '0 parameters do not need currying, which is meaningless';\n }\n : <T extends readonly unknown[]>(\n ...args: ValidApply<T, Required<A>>\n ) => AllArgsProvided<T, Required<A>> extends true\n ? R\n : RemainingArgs<T, Required<A>> extends infer P\n ? P extends readonly [infer Single]\n ? (arg: Single) => R // 兼容pipe的关键\n : Curry<(...args: P extends readonly unknown[] ? P : []) => R>\n : never\n : never;\n\n// ============================================\n// curry\n// ============================================\n\n/**\n * Creates a curried version of a function that supports argument placeholders (`__`).\n * The resulting function will be recursively callable until the required number of\n * non-placeholder arguments (`length`) have been provided.\n * @template F - The function to curry\n * @param fn - The function to curry\n * @param length - The required arity (number of arguments) for the function to execute\n * @returns The curried function\n * @throws If `length` is not a positive integer\n */\nexport function curry<F extends AnyFunction>(fn: F, length: number): Curry<F>;\n\nexport function curry(fn: AnyFunction, length: number): unknown {\n if (length <= 0 || !Number.isInteger(length))\n throw new ParameterError(\n `Invalid length: Expected a positive integer, but received ${length}.`,\n );\n\n const makeCurried = (prev_args: unknown[], holes: number) => {\n return (...next_args: unknown[]): unknown => {\n const args = [...prev_args];\n let [ptr, h] = [0, holes];\n\n // 填坑:用新参数替换已有的占位符\n for (let i = 0; i < args.length && ptr < next_args.length; i++)\n if (args[i] === __ && next_args[ptr] !== __) {\n args[i] = next_args[ptr++];\n h--;\n } else if (args[i] === __ && next_args[ptr] === __) {\n // 当 args[i] 和 next_args[ptr] 都是占位符时,跳过\n ptr++;\n }\n // 如果 args[i] 不是占位符,直接跳过\n\n // 追加剩余参数\n while (ptr < next_args.length) {\n const val = next_args[ptr++];\n args.push(val);\n if (val === __) h++;\n }\n\n // 检查是否达到执行条件:总参数数减去占位符数 >= 要求的参数长度\n return args.length - h >= length\n ? fn(...args.map((x) => (x === __ ? undefined : x)).slice(0, length))\n : makeCurried(args, h);\n };\n };\n\n return makeCurried([], 0);\n}\n","// ========================================\r\n// ./src/Utils/Functions/debounce.ts\r\n// ========================================\r\nimport {ParameterError} from '../../Errors';\r\n\r\n/**\r\n * Symbol indicating that the debounced function call was skipped\r\n */\r\nexport const SKIPPED = Symbol('skipped');\r\n\r\n/**\r\n * Type representing a skipped debounced function call\r\n */\r\nexport type Skipped = typeof SKIPPED;\r\n\r\n/**\r\n * Symbol indicating that requestAnimationFrame should be used for timing\r\n */\r\nexport const useRAF = Symbol('requestAnimationFrame');\r\n\r\n/**\r\n * A debouncer class that controls the rate at which a function is executed\r\n *\r\n * @template A - The argument types of the debounced function\r\n * @template R - The return type of the debounced function\r\n *\r\n * @example\r\n * ```typescript\r\n * const debounced = new Debounced(\r\n * (x: number) => console.log(x),\r\n * 100,\r\n * false,\r\n * true\r\n * );\r\n * ```\r\n */\r\nexport class Debounced<A extends readonly unknown[], R> {\r\n private fn: ((...args: A) => R) | null;\r\n\r\n // 状态跟踪\r\n private last_args: A | null = null;\r\n private last_this: ThisParameterType<typeof this.fn> = null;\r\n private result_: R | Skipped = SKIPPED;\r\n private timer_id: ReturnType<typeof setTimeout> | number | null = null;\r\n private last_call_time = 0;\r\n private last_invoke_time = 0;\r\n\r\n /* v8 ignore next -- @preserve */\r\n private static getTime = (() => {\r\n return typeof performance !== 'undefined'\r\n ? performance.now.bind(performance)\r\n : Date.now;\r\n })();\r\n\r\n /**\r\n * Creates a new Debounced instance\r\n *\r\n * @param fn - The function to debounce\r\n * @param wait - The number of milliseconds to wait, or useRAF for animation frame timing\r\n * @param leading - Whether to invoke the function on the leading edge of the timeout\r\n * @param trailing - Whether to invoke the function on the trailing edge of the timeout\r\n * @param max_wait - The maximum time the function is allowed to be delayed before it's invoked\r\n *\r\n * @throws {ParameterError} If parameters are invalid or incompatible\r\n *\r\n * @example\r\n * ```typescript\r\n * const debounced = new Debounced(\r\n * (searchTerm: string) => fetchResults(searchTerm),\r\n * 300,\r\n * false,\r\n * true,\r\n * 1000\r\n * );\r\n * ```\r\n */\r\n constructor(\r\n fn: (...args: A) => R,\r\n private readonly wait: number | typeof useRAF,\r\n private readonly leading: boolean = false,\r\n private readonly trailing: boolean = true,\r\n private readonly max_wait?: number,\r\n ) {\r\n // 检查环境对 requestAnimationFrame 的支持\r\n /* v8 ignore next -- @preserve */\r\n if (wait === useRAF && typeof requestAnimationFrame !== 'function')\r\n throw new ParameterError(\r\n `Error: wait = useRAF, But the environment does not support requestAnimationFrame.`,\r\n );\r\n\r\n // RAF由浏览器调度,不支持max_wait\r\n /* v8 ignore next -- @preserve */\r\n if (wait === useRAF && max_wait != null)\r\n throw new ParameterError(\r\n `Error: maxWait cannot be used when wait is set to useRAF.`,\r\n );\r\n\r\n // 检查 wait 是否有效\r\n if (wait !== useRAF && (wait < 0 || !Number.isFinite(wait))) {\r\n throw new ParameterError(\r\n `Error: wait = ${wait} < 0 or is not a finite number.`,\r\n );\r\n }\r\n // 检查 max_wait 是否有效(如果存在的话)\r\n if (\r\n max_wait != null &&\r\n (!Number.isFinite(max_wait) ||\r\n max_wait <= 0 ||\r\n (wait !== useRAF && max_wait < wait))\r\n ) {\r\n throw new ParameterError(\r\n `Error: maxWait (${max_wait}) must be positive and at least the value of wait (${String(wait)}).`,\r\n );\r\n }\r\n // 检查 leading 和 trailing 是否逻辑闭环\r\n if (!leading && !trailing) {\r\n throw new ParameterError(\r\n `Error: Both leading and trailing are false, which is meaningless.`,\r\n );\r\n }\r\n this.fn = fn;\r\n }\r\n\r\n /**\r\n * Gets the result of the last function invocation or SKIPPED if no invocation occurred\r\n */\r\n get result() {\r\n return this.result_;\r\n }\r\n\r\n /**\r\n * Checks if there's a pending debounced invocation\r\n */\r\n get pending() {\r\n return this.timer_id !== null;\r\n }\r\n\r\n private invokeFunc(time: number) {\r\n const args = this.last_args;\r\n if (args === null) {\r\n this.result_ = SKIPPED;\r\n return;\r\n }\r\n\r\n const this_arg = this.last_this;\r\n\r\n this.clearTimers();\r\n this.last_args = this.last_this = null;\r\n this.last_invoke_time = time;\r\n\r\n this.result_ = this.fn!.call(this_arg, ...args);\r\n }\r\n\r\n private shouldInvoke(time: number) {\r\n // 第一次调用\r\n if (this.last_call_time === 0) return true;\r\n\r\n // RAF期间,不允许Call\r\n /* v8 ignore if -- @preserve */\r\n if (this.wait === useRAF) return this.timer_id === null;\r\n\r\n const time_since_last_call = time - this.last_call_time;\r\n\r\n // 超过等待时间\r\n if (time_since_last_call >= this.wait) return true;\r\n\r\n // 超过最大等待时间(如果设置了)\r\n if (this.max_wait) {\r\n // 计算距离上次执行的时间\r\n const time_since_last_invoke = time - this.last_invoke_time;\r\n if (time_since_last_invoke >= this.max_wait) return true;\r\n }\r\n\r\n // 时间倒流(系统时间被调整)\r\n if (time_since_last_call < 0) return true;\r\n\r\n return false;\r\n }\r\n\r\n private remainingWait(time: number) {\r\n /* v8 ignore if -- @preserve */\r\n if (this.wait === useRAF) return 0;\r\n\r\n const time_since_last_call = time - this.last_call_time;\r\n const wait_remain = this.wait - time_since_last_call;\r\n\r\n // 如果没有 max_wait,直接返回剩余时间\r\n if (!this.max_wait) return wait_remain;\r\n\r\n // 计算距离上次执行的时间\r\n const time_since_last_invoke = time - this.last_invoke_time;\r\n const max_wait_remain = this.max_wait - time_since_last_invoke;\r\n\r\n // 取等待时间和最大等待时间的最小值\r\n return Math.min(wait_remain, max_wait_remain);\r\n }\r\n\r\n private static Task<A extends readonly unknown[], R>(\r\n instance: Debounced<A, R>,\r\n ) {\r\n const now = Debounced.getTime();\r\n // RAF调度到时必须执行\r\n if (instance.wait === useRAF || instance.shouldInvoke(now)) {\r\n instance.invokeFunc(now);\r\n } else {\r\n // 没到时间就根据剩余时间重新排队\r\n instance.refreshTimer(instance.remainingWait(now));\r\n }\r\n }\r\n\r\n // 刷新计时器\r\n private refreshTimer(timeout: number | typeof useRAF) {\r\n this.clearTimers();\r\n\r\n /* v8 ignore if -- @preserve */\r\n if (this.wait === useRAF) {\r\n this.timer_id = requestAnimationFrame(() => Debounced.Task(this));\r\n } else {\r\n /* eslint-disable-next-line @typescript-eslint/unbound-method */\r\n this.timer_id = setTimeout(Debounced.Task, timeout as number, this);\r\n }\r\n }\r\n\r\n // 移除计时器\r\n private clearTimers() {\r\n if (this.timer_id !== null) {\r\n /* v8 ignore if -- @preserve */\r\n if (this.wait === useRAF) cancelAnimationFrame(this.timer_id as number);\r\n else clearTimeout(this.timer_id);\r\n\r\n this.timer_id = null;\r\n }\r\n }\r\n\r\n /**\r\n * Calls the debounced function with the provided context and arguments\r\n *\r\n * @param context - The `this` context to use when calling the function\r\n * @param args - The arguments to pass to the function\r\n * @returns The result of the function call or SKIPPED if the call was debounced\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = debounced.call(someObject, arg1, arg2);\r\n * if (result !== SKIPPED) {\r\n * console.log('Function executed:', result);\r\n * }\r\n * ```\r\n */\r\n public call(\r\n context: ThisParameterType<typeof this.fn>,\r\n ...args: A\r\n ): R | Skipped {\r\n const now = Debounced.getTime();\r\n const is_invokable = this.shouldInvoke(now);\r\n\r\n this.last_args = args;\r\n this.last_this = context;\r\n this.last_call_time = now;\r\n\r\n // 基准执行时间\r\n if (this.last_invoke_time === 0) this.last_invoke_time = now;\r\n\r\n // 重置为无结果,确保除非 leading 触发,否则都是 SKIPPED\r\n this.result_ = SKIPPED;\r\n\r\n if (is_invokable && this.leading) this.invokeFunc(now);\r\n\r\n if (this.trailing) this.refreshTimer(this.remainingWait(now));\r\n\r\n return this.result_;\r\n }\r\n\r\n /**\r\n * Cancels any pending invocation of the debounced function\r\n * Resets all internal state\r\n */\r\n public cancel() {\r\n this.clearTimers();\r\n\r\n this.last_invoke_time = this.last_call_time = 0;\r\n this.last_args = this.last_this = null;\r\n this.result_ = SKIPPED;\r\n }\r\n\r\n /**\r\n * Immediately invokes any pending debounced invocation and returns the result\r\n *\r\n * @returns The result of the function call or SKIPPED if there was nothing to flush\r\n *\r\n * @example\r\n * ```typescript\r\n * // Force execution of any pending call\r\n * const result = debounced.flush();\r\n * ```\r\n */\r\n public flush(): R | Skipped {\r\n // 如果没有计时器,说明没有待执行任务,直接吐出当前缓存的结果\r\n if (this.timer_id === null) {\r\n return this.result_;\r\n }\r\n // 如果允许后沿触发且有参数\r\n if (this.trailing && this.last_args !== null) {\r\n this.invokeFunc(Debounced.getTime());\r\n } else {\r\n // 否则仅清理现场\r\n this.clearTimers();\r\n return SKIPPED;\r\n }\r\n return this.result_;\r\n }\r\n\r\n /**\r\n * Disposes of the debounced instance, cleaning up resources\r\n * Implements the disposable pattern\r\n */\r\n [Symbol.dispose]() {\r\n this.cancel();\r\n // 消除引用\r\n this.fn = null;\r\n this.last_args = null;\r\n this.last_this = null;\r\n }\r\n}\r\n\r\n/**\r\n * A debounced function with additional control methods\r\n *\r\n * @template A - The argument types of the function\r\n * @template R - The return type of the function\r\n * @template T - The `this` type of the function\r\n */\r\nexport type DebouncedFunction<A extends readonly unknown[], R, T> = ((\r\n this: T,\r\n ...args: A\r\n) => R | Skipped) & {\r\n /** Cancels any pending invocation */\r\n cancel: () => void;\r\n /** Immediately invokes any pending invocation */\r\n flush: () => R | Skipped;\r\n /** Checks if there's a pending invocation */\r\n pending: () => boolean;\r\n /** Gets the result of the last invocation */\r\n result: () => R | Skipped;\r\n /** Disposes of the debounced function, cleaning up resources */\r\n [Symbol.dispose]: () => void;\r\n};\r\n\r\n/**\r\n * Creates a debounced function that delays invoking `fn` until after `wait` milliseconds\r\n * have elapsed since the last time the debounced function was invoked\r\n *\r\n * @template A - The argument types of the function\r\n * @template R - The return type of the function\r\n *\r\n * @param fn - The function to debounce\r\n * @param wait - The number of milliseconds to delay, or useRAF for animation frame timing\r\n * @param options - Configuration options for debouncing behavior\r\n * @param options.leading - Whether to invoke on the leading edge of the timeout\r\n * @param options.trailing - Whether to invoke on the trailing edge of the timeout\r\n * @param options.maxWait - The maximum time `fn` is allowed to be delayed before it's invoked\r\n * @param options.useRAF - Use requestAnimationFrame instead of setTimeout for timing\r\n *\r\n * @returns A debounced function with control methods\r\n *\r\n * @throws {ParameterError} If parameters are invalid or incompatible\r\n *\r\n * @example\r\n * ```typescript\r\n * const debouncedSearch = createDebounce(\r\n * (query: string) => searchAPI(query),\r\n * 300,\r\n * { leading: false, trailing: true, maxWait: 1000 }\r\n * );\r\n *\r\n * // Usage\r\n * debouncedSearch('hello');\r\n * debouncedSearch('world');\r\n *\r\n * // Control methods\r\n * debouncedSearch.cancel();\r\n * debouncedSearch.flush();\r\n * debouncedSearch.pending();\r\n * ```\r\n */\r\n/* v8 ignore next -- @preserve */\r\nexport function createDebounce<A extends readonly unknown[], R>(\r\n fn: (...args: A) => R,\r\n wait: number,\r\n options: {\r\n leading?: boolean;\r\n trailing?: boolean;\r\n maxWait?: number;\r\n useRAF?: boolean;\r\n } = {\r\n leading: false,\r\n trailing: true,\r\n },\r\n): DebouncedFunction<A, R, ThisParameterType<typeof fn>> {\r\n const {leading = false, trailing = true, maxWait, useRAF: use_raf} = options;\r\n const wait_time = use_raf ? useRAF : wait;\r\n const instance = new Debounced(fn, wait_time, leading, trailing, maxWait);\r\n\r\n const wrapper = function (this: ThisParameterType<typeof fn>, ...args: A) {\r\n return instance.call(this, ...args);\r\n };\r\n\r\n wrapper.cancel = () => instance.cancel();\r\n wrapper.flush = () => instance.flush();\r\n wrapper.pending = () => instance.pending;\r\n wrapper.result = () => instance.result;\r\n const dispose = () => {\r\n instance[Symbol.dispose]();\r\n };\r\n wrapper[Symbol.dispose] = dispose;\r\n return wrapper;\r\n}\r\n\r\n// ============================================\r\n// 节流函数实现\r\n// ============================================\r\n\r\n/**\r\n * A throttled function with additional control methods\r\n *\r\n * @template A - The argument types of the function\r\n * @template R - The return type of the function\r\n * @template T - The `this` type of the function\r\n */\r\nexport type ThrottledFunction<A extends readonly unknown[], R, T> = ((\r\n this: T,\r\n ...args: A\r\n) => R | Skipped) & {\r\n /** Cancels any pending invocation */\r\n cancel: () => void;\r\n /** Immediately invokes any pending invocation */\r\n flush: () => R | Skipped;\r\n /** Checks if there's a pending invocation */\r\n pending: () => boolean;\r\n /** Gets the result of the last invocation */\r\n result: () => R | Skipped;\r\n /** Disposes of the throttled function, cleaning up resources */\r\n [Symbol.dispose]: () => void;\r\n};\r\n\r\n/**\r\n * Creates a throttled function that only invokes `fn` at most once per every `wait` milliseconds\r\n *\r\n * Throttling ensures the function is executed at a controlled rate, useful for\r\n * handling high-frequency events like scrolling, resizing, or mouse movement\r\n *\r\n * @template A - The argument types of the function\r\n * @template R - The return type of the function\r\n *\r\n * @param fn - The function to throttle\r\n * @param wait - The number of milliseconds to throttle invocations to\r\n * @param options - Configuration options for throttling behavior\r\n * @param options.leading - Whether to invoke on the leading edge of the timeout (default: true)\r\n * @param options.trailing - Whether to invoke on the trailing edge of the timeout (default: true)\r\n * @param options.useRAF - Use requestAnimationFrame instead of setTimeout for timing\r\n *\r\n * @returns A throttled function with control methods\r\n *\r\n * @throws {ParameterError} If `wait` is invalid or if both `leading` and `trailing` are false\r\n *\r\n * @example\r\n * ```typescript\r\n * const throttledScroll = createThrottle(\r\n * () => updateScrollIndicator(),\r\n * 100,\r\n * { leading: true, trailing: false }\r\n * );\r\n *\r\n * // Usage\r\n * window.addEventListener('scroll', throttledScroll);\r\n *\r\n * // Control methods\r\n * throttledScroll.cancel();\r\n * throttledScroll.flush();\r\n * throttledScroll.pending();\r\n * ```\r\n */\r\n/* v8 ignore next -- @preserve */\r\nexport function createThrottle<A extends readonly unknown[], R>(\r\n fn: (...args: A) => R,\r\n wait: number,\r\n options: {leading?: boolean; trailing?: boolean; useRAF?: boolean} = {\r\n leading: true,\r\n trailing: true,\r\n },\r\n): ThrottledFunction<A, R, ThisParameterType<typeof fn>> {\r\n const {leading = true, trailing = true, useRAF: use_raf} = options;\r\n // 使用maxWait等于wait的防抖实现节流逻辑\r\n const wait_time = use_raf ? useRAF : wait;\r\n // RAF模式下不能设置maxWait\r\n const instance = new Debounced(\r\n fn,\r\n wait_time,\r\n leading,\r\n trailing,\r\n use_raf ? undefined : wait,\r\n );\r\n\r\n const wrapper = function (this: ThisParameterType<typeof fn>, ...args: A) {\r\n return instance.call(this, ...args);\r\n };\r\n\r\n wrapper.cancel = () => instance.cancel();\r\n wrapper.flush = () => instance.flush();\r\n wrapper.pending = () => instance.pending;\r\n wrapper.result = () => instance.result;\r\n const dispose = () => {\r\n instance[Symbol.dispose]();\r\n };\r\n wrapper[Symbol.dispose] = dispose;\r\n return wrapper;\r\n}\r\n","// ========================================\n// ./src/Utils/Functions/defer.ts\n// ========================================\nimport type {MaybePromise} from '../type-tool';\nimport {dynamicAwait} from '../../helper';\n\n/**\n * Symbol used to indicate no error occurred during task execution.\n */\nexport const NO_ERROR = Symbol('No Error');\n\n/**\n * Type for error callback functions registered with defer.\n * @param error - The error from the task, or NO_ERROR if task succeeded\n * @returns A promise or value (return value is ignored)\n */\ntype ErrorCallback = (error: unknown) => unknown;\n\n/**\n * Function type for registering cleanup/error callbacks.\n * @param fn - The callback function to register\n */\ntype RegisterFn = (fn: ErrorCallback) => void;\n\n/**\n * Executes a task with deferred cleanup/error handling callbacks.\n *\n * This function provides a resource management pattern similar to try-finally,\n * but with support for async cleanup and multiple callbacks. Callbacks are\n * executed in reverse order (LIFO) regardless of task success or failure.\n *\n * @template R - The type of the task result\n * @param task - A function that receives a register function and returns a result\n * @returns A promise that resolves with the task result\n * @throws {AggregateError} If both the task and callbacks fail, or if multiple callbacks fail\n * @throws {unknown} If only the task fails and callbacks succeed, the original error is thrown\n * @throws {AggregateError} If only callbacks fail, an AggregateError is thrown\n *\n * @example\n * ```typescript\n * const result = await defer(async (register) => {\n * const resource = acquireResource();\n * register(async (error) => {\n * await resource.release();\n * });\n * return resource.use();\n * });\n * ```\n */\nexport const defer = async <R>(\n task: (register: RegisterFn) => MaybePromise<R>,\n) => {\n const callbacks: ErrorCallback[] = [];\n const register = (fn: ErrorCallback) => void callbacks.push(fn);\n let result_value: R;\n let error_arg: unknown = NO_ERROR;\n const callback_errors: unknown[] = [];\n\n try {\n result_value = await dynamicAwait(task(register));\n } catch (e) {\n error_arg = e;\n } finally {\n for (let i = callbacks.length - 1; i >= 0; i--)\n try {\n await callbacks[i](error_arg);\n } catch (e) {\n callback_errors.push(e);\n }\n }\n if (error_arg !== NO_ERROR) {\n if (callback_errors.length > 0) {\n const all_errors = [error_arg, ...callback_errors];\n throw new AggregateError(all_errors, 'defer: task and callbacks failed');\n }\n throw error_arg;\n }\n if (callback_errors.length > 0)\n throw new AggregateError(callback_errors, 'defer: callbacks failed');\n\n return result_value!;\n};\n","// ============================================\r\n// ./src/Utils/Predicates.ts\r\n// ============================================\r\n\r\n/**\r\n * Gets the internal [[Class]] property of a value using Object.prototype.toString\r\n * @param value - Value to check\r\n * @returns String representation of value's type\r\n * @remarks Handles null and undefined explicitly to avoid [[Class]] inconsistencies\r\n */\r\nexport const getTag = (value: unknown): string => {\r\n if (value == null)\r\n return value === undefined ? '[object Undefined]' : '[object Null]';\r\n return Object.prototype.toString.call(value);\r\n};\r\n\r\n// ========================================\r\n// 基础类型断言\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is a string primitive or String object\r\n * @param value - Value to check\r\n * @returns Type guard for string\r\n * @remarks Returns true for both primitive strings and String objects\r\n */\r\nexport const isString = (value: unknown): value is string => {\r\n return typeof value === 'string' || getTag(value) === '[object String]';\r\n};\r\n\r\n/**\r\n * Checks if value is a number primitive or Number object\r\n * @param value - Value to check\r\n * @returns Type guard for number\r\n * @remarks Returns true for both primitive numbers and Number objects\r\n */\r\nexport const isNumber = (value: unknown): value is number => {\r\n return typeof value === 'number' || getTag(value) === '[object Number]';\r\n};\r\n\r\n/**\r\n * Checks if value is a finite number\r\n * @param value - Value to check\r\n * @returns Type guard for finite number\r\n * @remarks Returns false for Infinity, -Infinity, and NaN\r\n */\r\nexport const isFinite = (value: unknown): value is number => {\r\n return isNumber(value) && globalThis.isFinite(value);\r\n};\r\n\r\n/**\r\n * Checks if value is a boolean primitive or Boolean object\r\n * @param value - Value to check\r\n * @returns Type guard for boolean\r\n * @remarks Returns true for both primitive booleans and Boolean objects\r\n */\r\nexport const isBoolean = (value: unknown): value is boolean => {\r\n return typeof value === 'boolean' || getTag(value) === '[object Boolean]';\r\n};\r\n\r\n/**\r\n * Checks if value is a symbol primitive or Symbol object\r\n * @param value - Value to check\r\n * @returns Type guard for symbol\r\n * @remarks Returns true for both primitive symbols and Symbol objects\r\n */\r\nexport const isSymbol = (value: unknown): value is symbol => {\r\n return typeof value === 'symbol' || getTag(value) === '[object Symbol]';\r\n};\r\n\r\n/**\r\n * Checks if value is strictly null\r\n * @param value - Value to check\r\n * @returns Type guard for null\r\n * @remarks Uses strict equality (value === null)\r\n */\r\nexport const isNull = (value: unknown): value is null => {\r\n return value === null;\r\n};\r\n\r\n/**\r\n * Checks if value is strictly undefined\r\n * @param value - Value to check\r\n * @returns Type guard for undefined\r\n * @remarks Uses strict equality (value === undefined)\r\n */\r\nexport const isUndefined = (value: unknown): value is undefined => {\r\n return value === undefined;\r\n};\r\n\r\n/**\r\n * Checks if value is null or undefined (loose equality)\r\n * @param value - Value to check\r\n * @returns Type guard for null | undefined\r\n * @remarks Uses loose equality (value == null)\r\n */\r\nexport const isNil = (value: unknown): value is null | undefined => {\r\n return value == null;\r\n};\r\n\r\n/**\r\n * Checks if value is NOT null or undefined\r\n * @param value - Value to check\r\n * @returns Type guard for NonNullable<unknown>\r\n * @remarks Opposite of isNil\r\n */\r\nexport const isNotNil = (value: unknown): value is NonNullable<unknown> => {\r\n return !isNil(value);\r\n};\r\n\r\n/**\r\n * Checks if value is NOT null or undefined with proper type narrowing\r\n * @template T - Type of value when not nullish\r\n * @param value - Value to check\r\n * @returns Type guard for T\r\n * @remarks Properly narrows generic types while filtering null/undefined\r\n */\r\nexport const isNotNullish = <T>(value: T | null | undefined): value is T => {\r\n return !isNil(value);\r\n};\r\n\r\n// ========================================\r\n// 复合类型检查\r\n// =========================================\r\n\r\n/**\r\n * Checks if value is a JavaScript primitive type\r\n * @param value - Value to check\r\n * @returns Type guard for primitive types\r\n * @remarks Returns true for string, number, boolean, symbol, bigint, null, undefined\r\n */\r\nexport const isPrimitive = (\r\n value: unknown,\r\n): value is string | number | boolean | symbol | bigint | null | undefined => {\r\n if (value === null) return true;\r\n const type = typeof value;\r\n return type !== 'object' && type !== 'function';\r\n};\r\n\r\n/**\r\n * Checks if value is an object (including functions)\r\n * @param value - Value to check\r\n * @returns Type guard for object\r\n * @remarks Returns true for objects and functions, false for null\r\n */\r\nexport const isObject = (value: unknown): value is object => {\r\n return (\r\n typeof value === 'function' || (typeof value === 'object' && value !== null)\r\n );\r\n};\r\n\r\n/**\r\n * Checks if value is a function\r\n * @param value - Value to check\r\n * @returns Type guard for function\r\n * @remarks Returns true for any function type\r\n */\r\nexport const isFunction = (\r\n value: unknown,\r\n): value is (...arg: unknown[]) => unknown => {\r\n return typeof value === 'function';\r\n};\r\n\r\n/**\r\n * Checks if value is an array\r\n * @param value - Value to check\r\n * @returns Type guard for array\r\n * @remarks Uses native Array.isArray for reliability\r\n */\r\nexport const isArray = (value: unknown): value is unknown[] =>\r\n Array.isArray(value);\r\n\r\n/**\r\n * Checks if value is a plain object (object created by {} or new Object)\r\n * @param value - Value to check\r\n * @returns Type guard for plain object\r\n * @remarks Returns false for arrays, dates, regexp, and custom class instances\r\n */\r\nexport const isPlainObject = (\r\n value: unknown,\r\n): value is Record<PropertyKey, unknown> => {\r\n if (getTag(value) !== '[object Object]') {\r\n return false;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n const proto = Object.getPrototypeOf(value);\r\n if (proto === null) {\r\n return true;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\r\n return proto === Object.prototype || proto.constructor === Object;\r\n};\r\n\r\n// ========================================\r\n// 数字相关检查\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is an integer\r\n * @param value - Value to check\r\n * @returns Type guard for integer number\r\n * @remarks Returns true for integer numbers, false for non-integer numbers\r\n */\r\nexport const isInteger = (value: unknown): value is number => {\r\n return isNumber(value) && Number.isInteger(value);\r\n};\r\n\r\n/**\r\n * Checks if value is a safe integer\r\n * @param value - Value to check\r\n * @returns Type guard for safe integer\r\n * @remarks Safe integers are integers between -(2^53-1) and 2^53-1\r\n */\r\nexport const isSafeInteger = (value: unknown): value is number => {\r\n return isNumber(value) && Number.isSafeInteger(value);\r\n};\r\n\r\n/**\r\n * Checks if value is a valid array-like length\r\n * @param value - Value to check\r\n * @returns Type guard for valid length number\r\n * @remarks Valid lengths are non-negative integers ≤ Number.MAX_SAFE_INTEGER\r\n */\r\nexport const isLength = (value: unknown): value is number => {\r\n return (\r\n typeof value === 'number' &&\r\n value > -1 &&\r\n value % 1 === 0 &&\r\n value <= Number.MAX_SAFE_INTEGER\r\n );\r\n};\r\n\r\n// ========================================\r\n// 内置对象检查\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is a Date object\r\n * @param value - Value to check\r\n * @returns Type guard for Date\r\n * @remarks Returns true for Date instances only\r\n */\r\nexport const isDate = (value: unknown): value is Date => {\r\n return getTag(value) === '[object Date]';\r\n};\r\n\r\n/**\r\n * Checks if value is a RegExp object\r\n * @param value - Value to check\r\n * @returns Type guard for RegExp\r\n * @remarks Returns true for RegExp instances only\r\n */\r\nexport const isRegExp = (value: unknown): value is RegExp => {\r\n return getTag(value) === '[object RegExp]';\r\n};\r\n\r\n/**\r\n * Checks if value is an Error object\r\n * @param value - Value to check\r\n * @returns Type guard for Error\r\n * @remarks Returns true for Error and DOMException instances\r\n */\r\nexport const isError = (value: unknown): value is Error => {\r\n const tag = getTag(value);\r\n return tag === '[object Error]' || tag === '[object DOMException]';\r\n};\r\n\r\n/**\r\n * Checks if value is a Map object\r\n * @param value - Value to check\r\n * @returns Type guard for Map<unknown, unknown>\r\n * @remarks Returns true for Map instances only\r\n */\r\nexport const isMap = (value: unknown): value is Map<unknown, unknown> => {\r\n return getTag(value) === '[object Map]';\r\n};\r\n\r\n/**\r\n * Checks if value is a Set object\r\n * @param value - Value to check\r\n * @returns Type guard for Set<unknown>\r\n * @remarks Returns true for Set instances only\r\n */\r\nexport const isSet = (value: unknown): value is Set<unknown> => {\r\n return getTag(value) === '[object Set]';\r\n};\r\n\r\n/**\r\n * Checks if value is a WeakMap object\r\n * @param value - Value to check\r\n * @returns Type guard for WeakMap<object, unknown>\r\n * @remarks Returns true for WeakMap instances only\r\n */\r\nexport const isWeakMap = (\r\n value: unknown,\r\n): value is WeakMap<object, unknown> => {\r\n return getTag(value) === '[object WeakMap]';\r\n};\r\n\r\n/**\r\n * Checks if value is a WeakSet object\r\n * @param value - Value to check\r\n * @returns Type guard for WeakSet<object>\r\n * @remarks Returns true for WeakSet instances only\r\n */\r\nexport const isWeakSet = (value: unknown): value is WeakSet<object> => {\r\n return getTag(value) === '[object WeakSet]';\r\n};\r\n\r\n/**\r\n * Checks if value is an ArrayBuffer object\r\n * @param value - Value to check\r\n * @returns Type guard for ArrayBuffer\r\n * @remarks Returns true for ArrayBuffer instances only\r\n */\r\nexport const isArrayBuffer = (value: unknown): value is ArrayBuffer => {\r\n return getTag(value) === '[object ArrayBuffer]';\r\n};\r\n\r\nconst TYPED_ARRAY_TAG =\r\n /^\\[object (?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)Array\\]$/;\r\n\r\n/**\r\n * Checks if value is a typed array\r\n * @param value - Value to check\r\n * @returns Type guard for ArrayBufferView\r\n * @remarks Supports all standard typed array types\r\n */\r\nexport const isTypedArray = (value: unknown): value is ArrayBufferView => {\r\n return isObject(value) && TYPED_ARRAY_TAG.test(getTag(value));\r\n};\r\n\r\n// ========================================\r\n// 浏览器/Node特定类型\r\n// ========================================\r\n\r\n/**\r\n * Checks if code is running in a browser environment\r\n * @returns True if running in browser with DOM access\r\n * @remarks Verifies both window and document exist and are properly connected\r\n */\r\nexport const isBrowser = (): boolean => {\r\n return (\r\n typeof window !== 'undefined' &&\r\n typeof document !== 'undefined' &&\r\n window.document === document\r\n );\r\n};\r\n\r\n/**\r\n * Checks if code is running in a client environment\r\n * @returns True if running in any client-side context\r\n * @remarks Less strict than isBrowser, checks for window or self\r\n */\r\nexport const isClient = (): boolean => {\r\n return typeof window !== 'undefined' || typeof self !== 'undefined';\r\n};\r\n\r\n/**\r\n * Checks if code is running in a Node.js environment\r\n * @returns True if running in Node.js\r\n * @remarks Checks for process.versions.node existence\r\n */\r\nexport const isNode = (): boolean => {\r\n return (\r\n typeof process !== 'undefined' &&\r\n process.versions != null &&\r\n process.versions.node != null\r\n );\r\n};\r\n\r\n/**\r\n * Checks if value is a Buffer (Node.js)\r\n * @param value - Value to check\r\n * @returns True if value is a Buffer\r\n * @remarks Uses Buffer.isBuffer if available, fails gracefully in browser\r\n */\r\nexport const isBuffer = (value: unknown): boolean => {\r\n try {\r\n if (\r\n value != null &&\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\r\n (value as any).constructor &&\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\r\n typeof (value as any).constructor.isBuffer === 'function'\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\r\n return (value as any).constructor.isBuffer(value);\r\n }\r\n } catch (e) {\r\n return false;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Checks if value is a Blob object\r\n * @param value - Value to check\r\n * @returns Type guard for Blob\r\n * @remarks Returns true for Blob instances only\r\n */\r\nexport const isBlob = (value: unknown): value is Blob => {\r\n return getTag(value) === '[object Blob]';\r\n};\r\n\r\n/**\r\n * Checks if value is a File object\r\n * @param value - Value to check\r\n * @returns Type guard for File\r\n * @remarks Returns true for File instances only\r\n */\r\nexport const isFile = (value: unknown): value is File => {\r\n return getTag(value) === '[object File]';\r\n};\r\n\r\n// ========================================\r\n// 迭代器检查\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is iterable (has Symbol.iterator)\r\n * @param value - Value to check\r\n * @returns Type guard for Iterable<unknown>\r\n * @remarks Returns true for arrays, strings, maps, sets, and custom iterables\r\n */\r\nexport const isIterable = (value: unknown): value is Iterable<unknown> => {\r\n return (\r\n !isNil(value) &&\r\n typeof (value as {[Symbol.iterator]?: unknown})[Symbol.iterator] ===\r\n 'function'\r\n );\r\n};\r\n\r\n/**\r\n * Checks if value is async iterable (has Symbol.asyncIterator)\r\n * @param value - Value to check\r\n * @returns Type guard for AsyncIterable<unknown>\r\n * @remarks Returns true for async generators and custom async iterables\r\n */\r\nexport const isAsyncIterable = (\r\n value: unknown,\r\n): value is AsyncIterable<unknown> => {\r\n return isObject(value) && Symbol.asyncIterator in value;\r\n};\r\n\r\n// ========================================\r\n// Promise检查\r\n// ========================================\r\n\r\nexport {isPromiseLike} from '../helper';\r\nimport {isPromiseLike} from '../helper';\r\n\r\n/**\r\n * Checks if value is a Promise\r\n * @param value - Value to check\r\n * @returns Type guard for Promise<unknown>\r\n * @remarks Returns true for native promises and promise-like objects\r\n */\r\nexport const isPromise = (value: unknown): value is Promise<unknown> => {\r\n return (\r\n value instanceof Promise ||\r\n getTag(value) === '[object Promise]' ||\r\n isPromiseLike(value)\r\n );\r\n};\r\n\r\n// ========================================\r\n// 实例检查\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is an instance of specified constructor\r\n * @template T - Expected instance type\r\n * @param value - Value to check\r\n * @param constructor - Constructor function\r\n * @returns Type guard for T\r\n * @remarks Uses instanceof operator with type safety\r\n */\r\nexport const isInstanceOf = <T>(\r\n value: unknown,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constructor: abstract new (...args: any[]) => T,\r\n): value is T => {\r\n return isObject(value) && value instanceof constructor;\r\n};\r\n\r\n// ========================================\r\n// 属性键检查\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is a valid property key (string, number, or symbol)\r\n * @param value - Value to check\r\n * @returns Type guard for PropertyKey\r\n * @remarks Returns true for values usable as object keys\r\n */\r\nexport const isPropertyKey = (value: unknown): value is PropertyKey => {\r\n return isString(value) || isNumber(value) || isSymbol(value);\r\n};\r\n\r\n// ========================================\r\n// 空值检查\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is empty (null, undefined, or has no elements/properties)\r\n * @param value - Value to check\r\n * @returns True if value is considered empty\r\n * @remarks Handles arrays, strings, maps, sets, and plain objects\r\n */\r\nexport const isEmpty = (value: unknown): boolean => {\r\n if (isNil(value)) return true;\r\n if (isArray(value) || isString(value)) return value.length === 0;\r\n if (isMap(value) || isSet(value)) return value.size === 0;\r\n if (isPlainObject(value)) return Object.keys(value).length === 0;\r\n return false;\r\n};\r\n\r\n/**\r\n * Checks if value is an empty plain object\r\n * @param value - Value to check\r\n * @returns Type guard for empty plain object\r\n * @remarks Returns true only for plain objects with no own enumerable properties\r\n */\r\nexport const isEmptyObject = (\r\n value: unknown,\r\n): value is Record<PropertyKey, unknown> => {\r\n return isPlainObject(value) && Object.keys(value).length === 0;\r\n};\r\n\r\n// ========================================\r\n// 序列化检查\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is JSON serializable\r\n * @param value - Value to check\r\n * @returns True if value can be serialized to JSON\r\n * @remarks Recursively checks arrays and objects, excludes functions and symbols\r\n */\r\nexport const isSerializable = (value: unknown): boolean => {\r\n if (\r\n value === undefined ||\r\n typeof value === 'symbol' ||\r\n typeof value === 'function'\r\n ) {\r\n return false;\r\n }\r\n\r\n if (isPrimitive(value)) return true;\r\n\r\n if (isArray(value)) {\r\n return value.every(isSerializable);\r\n }\r\n\r\n if (isPlainObject(value)) {\r\n return Object.values(value).every(isSerializable);\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * Checks if value is a valid JSON value\r\n * @param value - Value to check\r\n * @returns True if value is JSON-compatible\r\n * @remarks Less strict than isSerializable, allows undefined in some contexts\r\n */\r\nexport const isJSONValue = (value: unknown): boolean => {\r\n if (value === undefined || typeof value === 'symbol') return false;\r\n return isPrimitive(value) || isJSONObject(value) || isJSONArray(value);\r\n};\r\n\r\n/**\r\n * Checks if value is a JSON-serializable object\r\n * @param value - Value to check\r\n * @returns Type guard for JSON object\r\n * @remarks Returns true for plain objects with JSON-compatible values\r\n */\r\nexport const isJSONObject = (\r\n value: unknown,\r\n): value is Record<string, unknown> => {\r\n if (!isPlainObject(value)) return false;\r\n const entries = Object.entries(value);\r\n return entries.every(([_, val]) => isJSONValue(val));\r\n};\r\n\r\n/**\r\n * Checks if value is a JSON-serializable array\r\n * @param value - Value to check\r\n * @returns Type guard for JSON array\r\n * @remarks Returns true for arrays with JSON-compatible values\r\n */\r\nexport const isJSONArray = (value: unknown): value is unknown[] => {\r\n if (!isArray(value)) return false;\r\n return value.every(isJSONValue);\r\n};\r\n\r\n/**\r\n * Checks if value is a valid JSON string\r\n * @param value - Value to check\r\n * @returns Type guard for JSON string\r\n * @remarks Returns true for strings that parse to valid JSON\r\n */\r\nexport const isJSON = (value: unknown): value is string => {\r\n if (!isString(value)) return false;\r\n const str = value.trim();\r\n if (str.length === 0) return false;\r\n if (str === 'null' || str === 'true' || str === 'false') return true;\r\n if (\r\n (str.startsWith('{') && str.endsWith('}')) ||\r\n (str.startsWith('[') && str.endsWith(']'))\r\n ) {\r\n try {\r\n JSON.parse(str);\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n try {\r\n JSON.parse(str);\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\n// ========================================\r\n// 格式验证\r\n// ========================================\r\n\r\n/**\r\n * Checks if value is a valid email format string\r\n * @param value - Value to check\r\n * @returns Type guard for email string\r\n * @remarks Uses basic email regex validation\r\n */\r\nexport const isEmail = (value: unknown): value is string => {\r\n return isString(value) && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\r\n};\r\n\r\n/**\r\n * Checks if value is a valid URL string\r\n * @param value - Value to check\r\n * @returns Type guard for URL string\r\n * @remarks Uses URL constructor for validation\r\n */\r\nexport const isUrl = (value: unknown): value is string => {\r\n if (!isString(value)) return false;\r\n try {\r\n new URL(value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if value is a valid UUID string\r\n * @param value - Value to check\r\n * @returns Type guard for UUID string\r\n * @remarks Supports both uppercase and lowercase UUIDs\r\n */\r\nexport const isUUID = (value: unknown): value is string => {\r\n if (!isString(value)) return false;\r\n const UuidPattern =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\r\n return UuidPattern.test(value);\r\n};\r\n\r\n// ========================================\r\n// 深度相等检查\r\n// ========================================\r\n\r\n/**\r\n * Deep equality check with custom comparator\r\n * @param value - First value to compare\r\n * @param other - Second value to compare\r\n * @param customizer - Optional custom comparison function\r\n * @returns True if values are deeply equal\r\n * @remarks Handles circular references, NaN equality, and various object types\r\n */\r\nexport const isEqualWith = (\r\n value: unknown,\r\n other: unknown,\r\n customizer?: (val1: unknown, val2: unknown) => boolean | void,\r\n): boolean => {\r\n const stack = new WeakMap<object, Set<object>>();\r\n\r\n const baseEqual = (a: unknown, b: unknown): boolean => {\r\n // 1. 自定义比较逻辑\r\n if (customizer) {\r\n const result = customizer(a, b);\r\n if (result !== undefined) return result;\r\n }\r\n\r\n // 2. 基础引用相等及 NaN 处理\r\n if (a === b) return true;\r\n if (\r\n typeof a === 'number' &&\r\n typeof b === 'number' &&\r\n isNaN(a) &&\r\n isNaN(b)\r\n ) {\r\n return true;\r\n }\r\n if (a == null || b == null) return false;\r\n\r\n const tagA = getTag(a);\r\n const tagB = getTag(b);\r\n if (tagA !== tagB) return false;\r\n\r\n // 3. 循环引用检测\r\n if (typeof a === 'object' || typeof a === 'function') {\r\n const seenOther = stack.get(a);\r\n if (seenOther?.has(b)) return true;\r\n\r\n if (!seenOther) {\r\n stack.set(a, new Set([b]));\r\n } else {\r\n seenOther.add(b);\r\n }\r\n }\r\n\r\n // 4. 深度比较逻辑\r\n switch (tagA) {\r\n case '[object Date]':\r\n case '[object Number]':\r\n return +a === +b;\r\n case '[object RegExp]':\r\n case '[object String]':\r\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\r\n return String(a) === String(b);\r\n case '[object Array]': {\r\n const arrA = a as unknown[];\r\n const arrB = b as unknown[];\r\n if (arrA.length !== arrB.length) return false;\r\n return arrA.every((val, index) => baseEqual(val, arrB[index]));\r\n }\r\n case '[object Object]': {\r\n if (!isPlainObject(a) || !isPlainObject(b)) return false;\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n return keysA.every((key) => {\r\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\r\n return baseEqual(a[key], b[key]);\r\n });\r\n }\r\n case '[object Map]': {\r\n const mapA = a as Map<unknown, unknown>;\r\n const mapB = b as Map<unknown, unknown>;\r\n if (mapA.size !== mapB.size) return false;\r\n for (const [key, val] of mapA) {\r\n if (!mapB.has(key) || !baseEqual(val, mapB.get(key))) return false;\r\n }\r\n return true;\r\n }\r\n case '[object Set]': {\r\n const setA = a as Set<unknown>;\r\n const setB = b as Set<unknown>;\r\n if (setA.size !== setB.size) return false;\r\n // Set 的比较依旧比较棘手,因为顺序无关\r\n // 但使用了数组缓存来避免重复查找\r\n const bValues = Array.from(setB);\r\n for (const item of setA) {\r\n const idx = bValues.findIndex((bVal) => baseEqual(item, bVal));\r\n if (idx === -1) return false;\r\n bValues.splice(idx, 1);\r\n }\r\n return true;\r\n }\r\n case '[object ArrayBuffer]': {\r\n const bufA = new Uint8Array(a as ArrayBuffer);\r\n const bufB = new Uint8Array(b as ArrayBuffer);\r\n if (bufA.length !== bufB.length) return false;\r\n for (let i = 0; i < bufA.length; i++) {\r\n if (bufA[i] !== bufB[i]) return false;\r\n }\r\n return true;\r\n }\r\n default:\r\n return false;\r\n }\r\n };\r\n\r\n return baseEqual(value, other);\r\n};\r\n\r\n/**\r\n * Deep equality check without custom comparator\r\n * @param value - First value to compare\r\n * @param other - Second value to compare\r\n * @returns True if values are deeply equal\r\n * @remarks Convenience wrapper for isEqualWith without customizer\r\n */\r\nexport const isEqual = (value: unknown, other: unknown): boolean => {\r\n return isEqualWith(value, other);\r\n};\r\n","// ========================================\r\n// ./src/Utils/Object/base.ts\r\n// ========================================\r\n\r\nimport {isPlainObject} from '../Predicates';\r\nimport {camelCase, snakeCase} from '../String';\r\n\r\n/**\r\n * Transforms object keys using a mapper function.\r\n * @template T - Object type\r\n * @param obj - Source object\r\n * @param fn - Function that receives (value, key) and returns new key name\r\n * @returns New object with transformed keys (original values preserved)\r\n * @remarks If fn returns duplicate keys, later entries will overwrite earlier ones\r\n */\r\nexport const mapKeys = <T extends Record<string, unknown>>(\r\n obj: T,\r\n fn: (value: T[keyof T], key: keyof T) => string,\r\n): Record<string, T[keyof T]> => {\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([k, v]) => [\r\n fn(v as T[keyof T], k as keyof T),\r\n v as T[keyof T],\r\n ]),\r\n ) as Record<string, T[keyof T]>;\r\n};\r\n\r\n/**\r\n * Transforms object values while preserving keys.\r\n * @template T - Source object type\r\n * @template V - Transformed value type\r\n * @param obj - Source object\r\n * @param fn - Function that receives (value, key) and returns new value\r\n * @returns New object with same keys but transformed values\r\n */\r\nexport const mapValues = <T extends Record<string, unknown>, V>(\r\n obj: T,\r\n fn: (value: T[keyof T], key: keyof T) => V,\r\n): Record<keyof T, V> => {\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([k, v]) => [k, fn(v as T[keyof T], k as keyof T)]),\r\n ) as Record<keyof T, V>;\r\n};\r\n\r\n/**\r\n * Swaps object keys and values.\r\n * @template T - Object with string/number values\r\n * @param obj - Source object (values must be string or number)\r\n * @returns New object with keys and values swapped\r\n * @remarks Duplicate values in source will cause later keys to overwrite earlier ones\r\n */\r\nexport const invert = <T extends Record<string, string | number>>(\r\n obj: T,\r\n): Record<string, keyof T> => {\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([k, v]) => [v, k as keyof T]),\r\n );\r\n};\r\n\r\n/**\r\n * Creates new object with only specified keys.\r\n * @template T - Source object type\r\n * @template K - Selected keys\r\n * @param obj - Source object\r\n * @param keys - Array of keys to include\r\n * @returns New object containing only specified keys\r\n * @remarks Keys not present in source object are silently ignored\r\n */\r\nexport const pick = <T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[],\r\n): Pick<T, K> => {\r\n const result = {} as Pick<T, K>;\r\n for (const key of keys) {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Creates new object with keys satisfying predicate.\r\n * @template T - Source object type\r\n * @param obj - Source object\r\n * @param predicate - Function that receives (value, key) and returns boolean\r\n * @returns Partial object containing only entries where predicate returns true\r\n */\r\nexport const pickBy = <T extends Record<PropertyKey, unknown>>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean,\r\n): Partial<T> => {\r\n return Object.fromEntries(\r\n Object.entries(obj).filter(([key, value]) =>\r\n predicate(value as T[keyof T], key as keyof T),\r\n ),\r\n ) as Partial<T>;\r\n};\r\n\r\n/**\r\n * Creates new object excluding specified keys.\r\n * @template T - Source object type\r\n * @template K - Keys to exclude\r\n * @param obj - Source object\r\n * @param keys - Array of keys to exclude\r\n * @returns New object without specified keys\r\n * @remarks Non-enumerable properties are not included in result\r\n */\r\nexport const omit = <T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[],\r\n): Omit<T, K> => {\r\n const result = {} as Omit<T, K>;\r\n const skipSet = new Set<PropertyKey>(keys);\r\n\r\n for (const key of Object.keys(obj)) {\r\n if (!skipSet.has(key)) {\r\n (result as T)[key as keyof T] = obj[key as keyof T];\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Creates new object excluding keys where predicate returns true.\r\n * @template T - Source object type\r\n * @param obj - Source object\r\n * @param predicate - Function that receives (value, key) and returns boolean\r\n * @returns Partial object excluding entries where predicate returns true\r\n */\r\nexport const omitBy = <T extends Record<PropertyKey, unknown>>(\r\n obj: T,\r\n predicate: (value: T[keyof T], key: keyof T) => boolean,\r\n): Partial<T> => {\r\n return Object.fromEntries(\r\n Object.entries(obj).filter(\r\n ([key, value]) => !predicate(value as T[keyof T], key as keyof T),\r\n ),\r\n ) as Partial<T>;\r\n};\r\n\r\n/**\r\n * Finds first key where predicate returns true.\r\n * @template T - Source object type\r\n * @param obj - Source object\r\n * @param fn - Function that receives (value, key) and returns boolean\r\n * @returns First matching key, or undefined if none found\r\n * @remarks Only checks own enumerable properties\r\n */\r\nexport const findKey = <T extends object>(\r\n obj: T,\r\n fn: (value: T[keyof T], key: keyof T) => boolean,\r\n): keyof T | undefined => {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n if (fn(obj[key as keyof T], key as keyof T)) {\r\n return key as keyof T;\r\n }\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\n/** Symbol indicating merge should skip current property */\r\nexport const MERGE_SKIP = Symbol('Merge skip');\r\n/** Symbol indicating merge should use default logic for current property */\r\nexport const MERGE_DEFAULT = Symbol('Merge default');\r\n\r\n/**\r\n * Customizer function type for mergeWith.\r\n * @returns New value, MERGE_SKIP to skip, or MERGE_DEFAULT for default logic\r\n */\r\ntype MergeCustomizer = (\r\n target_value: unknown,\r\n source_value: unknown,\r\n key: string,\r\n target: unknown,\r\n source: unknown,\r\n) => unknown;\r\n\r\n/**\r\n * Internal merge implementation.\r\n * @template T - Target object type\r\n * @param target - Target object (will be mutated)\r\n * @param customizer - Optional customizer function\r\n * @param sources - Source objects to merge\r\n * @returns Mutated target object\r\n * @remarks Performs deep merge for plain objects, overwrites other values\r\n */\r\nexport const internalMerge = <T extends Record<string, unknown>>(\r\n target: T,\r\n customizer: MergeCustomizer | undefined,\r\n ...sources: Record<string, unknown>[]\r\n): T => {\r\n if (!sources.length) return target;\r\n\r\n for (const source of sources) {\r\n const stack: [Record<string, unknown>, Record<string, unknown>][] = [\r\n [target, source],\r\n ];\r\n\r\n while (stack.length > 0) {\r\n const [currTarget, currSource] = stack.pop()!;\r\n\r\n for (const key in currSource) {\r\n if (Object.prototype.hasOwnProperty.call(currSource, key)) {\r\n const sourceValue = currSource[key];\r\n const targetValue = currTarget[key];\r\n const result = sourceValue;\r\n\r\n // Execute customizer first if provided\r\n if (customizer) {\r\n const customResult = customizer(\r\n targetValue,\r\n sourceValue,\r\n key,\r\n currTarget,\r\n currSource,\r\n );\r\n if (customResult !== MERGE_DEFAULT) {\r\n if (customResult !== MERGE_SKIP) currTarget[key] = customResult;\r\n continue;\r\n }\r\n }\r\n\r\n // Default merge logic\r\n if (isPlainObject(result)) {\r\n if (!isPlainObject(targetValue)) {\r\n currTarget[key] = {};\r\n }\r\n stack.push([currTarget[key] as Record<string, unknown>, result]);\r\n } else {\r\n currTarget[key] = result;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return target;\r\n};\r\n\r\n/**\r\n * Deep merges source objects into target.\r\n * @template T - Target object type\r\n * @param target - Target object (will be cloned)\r\n * @param sources - Source objects to merge\r\n * @returns New deeply merged object (target is not mutated)\r\n * @remarks Uses structuredClone for deep cloning target\r\n */\r\nexport const merge = <T extends Record<string, unknown>>(\r\n target: T,\r\n ...sources: Record<string, unknown>[]\r\n): T => internalMerge(structuredClone(target), undefined, ...sources);\r\n\r\n/**\r\n * Deep merges with customizer function.\r\n * @template T - Target object type\r\n * @param target - Target object (will be cloned)\r\n * @param customizer - Customizer function for control over merging\r\n * @param sources - Source objects to merge\r\n * @returns New deeply merged object (target is not mutated)\r\n */\r\nexport const mergeWith = <T extends Record<string, unknown>>(\r\n target: T,\r\n customizer: MergeCustomizer,\r\n ...sources: Record<string, unknown>[]\r\n): T => internalMerge(structuredClone(target), customizer, ...sources);\r\n\r\n/**\r\n * Flattens nested object to single level.\r\n * @param obj - Object to flatten\r\n * @param separator - Separator for nested keys (default: '.')\r\n * @returns New flattened object\r\n * @remarks Empty objects are preserved as objects (not flattened)\r\n */\r\nexport const flattenObject = (\r\n obj: Record<string, unknown>,\r\n separator: string = '.',\r\n): Record<string, unknown> => {\r\n const result: Record<string, unknown> = {};\r\n const stack: [Record<string, unknown>, string][] = [[obj, '']];\r\n\r\n while (stack.length > 0) {\r\n const [curr, prefix] = stack.pop()!;\r\n\r\n for (const key in curr) {\r\n if (Object.prototype.hasOwnProperty.call(curr, key)) {\r\n const value = curr[key];\r\n const newKey = prefix ? `${prefix}${separator}${key}` : key;\r\n\r\n if (isPlainObject(value) && Object.keys(value).length > 0) {\r\n stack.push([value as Record<string, unknown>, newKey]);\r\n } else {\r\n result[newKey] = value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Recursively transforms keys in object/array structure.\r\n * @param obj - Input value\r\n * @param transformer - Function to transform key strings\r\n * @returns Transformed value\r\n * @remarks Only transforms plain objects and arrays; other values returned as-is\r\n */\r\nconst transformKeys = (\r\n obj: unknown,\r\n transformer: (str: string) => string,\r\n): unknown => {\r\n if (obj === null || typeof obj !== 'object') return obj;\r\n\r\n if (Array.isArray(obj))\r\n return obj.map((item) => transformKeys(item, transformer));\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n const prototype = Object.getPrototypeOf(obj);\r\n if (prototype !== Object.prototype && prototype !== null) return obj;\r\n\r\n return Object.fromEntries(\r\n Object.entries(obj).map(([key, value]) => [\r\n transformer(key),\r\n transformKeys(value, transformer),\r\n ]),\r\n );\r\n};\r\n\r\n/**\r\n * Recursively converts object keys to camelCase.\r\n * @template T - Desired return type\r\n * @param obj - Input value\r\n * @returns Value with keys transformed to camelCase\r\n */\r\nexport const toCamelCaseKeys = <T = unknown>(obj: unknown): T =>\r\n transformKeys(obj, camelCase) as T;\r\n\r\n/**\r\n * Recursively converts object keys to snake_case.\r\n * @template T - Desired return type\r\n * @param obj - Input value\r\n * @returns Value with keys transformed to snake_case\r\n */\r\nexport const toSnakeCaseKeys = <T = unknown>(obj: unknown): T =>\r\n transformKeys(obj, snakeCase) as T;\r\n","// ========================================\r\n// ./src/Utils/Object/clone.ts\r\n// ========================================\r\n\r\nimport {getTag} from '../Predicates';\r\n\r\n/**\r\n * Special symbol indicating that a value should be skipped during cloning.\r\n * When returned by a customizer or encountered as a cloned value, the property will be omitted.\r\n * @example\r\n * const obj = { a: 1, b: 2 };\r\n * const cloned = cloneDeepWith(obj, (value) => value === 1 ? CLONE_FILTER : CLONE_DEFAULT);\r\n * // Result: { b: 2 }\r\n */\r\nexport const CLONE_FILTER = Symbol('Clone filter');\r\n\r\n/**\r\n * Special symbol indicating that the default cloning logic should be used.\r\n * When returned by a customizer, the cloner will continue with its standard cloning procedure.\r\n */\r\nexport const CLONE_DEFAULT = Symbol('Clone default');\r\n\r\n/**\r\n * Special symbol indicating that an empty slot should be created.\r\n * When returned by a customizer for array elements, the position will be kept as an empty slot.\r\n * @example\r\n * const arr = [1, 2, 3];\r\n * const cloned = cloneDeepWith(arr, (value, index) => {\r\n * if (index === 1) return CLONE_HOLE; // Keep index 1 as empty slot\r\n * return CLONE_DEFAULT;\r\n * });\r\n * // Result: [1, empty, 3] (sparse array, length: 3)\r\n * // cloned[1] === undefined, but 1 in cloned === false\r\n */\r\nexport const CLONE_HOLE = Symbol('Clone hole');\r\n\r\n/**\r\n * Creates a shallow copy of a value.\r\n * @template T - Type of value to clone\r\n * @param value - Value to clone\r\n * @returns Shallow clone of the value\r\n * @remarks\r\n * - For primitive values (null, undefined, strings, numbers, booleans, symbols, bigints):\r\n * Returns the value directly (no actual cloning needed)\r\n * - For arrays: Creates a new array with the same elements (reference copy)\r\n * - For plain objects: Creates a new object with the same enumerable properties (reference copy)\r\n * - For other object types (Dates, RegExps, etc.): Returns a shallow copy using spread operator\r\n * which may not preserve special behaviors\r\n * @example\r\n * const arr = [1, 2, { a: 3 }];\r\n * const clonedArr = clone(arr);\r\n * clonedArr[2].a = 99; // Also modifies original array's object\r\n */\r\nexport const clone = <T>(value: T): T => {\r\n if (value === null || typeof value !== 'object') return value;\r\n if (Array.isArray(value)) return [...value] as T;\r\n if (value instanceof Date) return new Date(value.getTime()) as T;\r\n if (value instanceof RegExp)\r\n return new RegExp(value.source, value.flags) as T;\r\n return {...value} as T;\r\n};\r\n\r\n/**\r\n * Checks if the given key is a valid array index.\r\n * @param k - The key to check (must be a string or number)\r\n * @param n - Optional maximum index (defaults to 0, meaning no upper bound)\r\n * @returns True if the key is a valid array index, false otherwise\r\n */\r\nexport const isArrayIndex = (k: PropertyKey, n = 0): boolean =>\r\n typeof k !== 'symbol'\r\n ? ((n = Number(k)), n >>> 0 === n && n !== 0xffffffff && String(n) === k)\r\n : false;\r\n\r\n/**\r\n * Customizer function for controlling cloning behavior.\r\n * @param value - Current value being cloned\r\n * @param key - Property key of the value (undefined for root)\r\n * @param object - Parent object containing the value (undefined for root)\r\n * @param stack - WeakMap tracking already visited objects for circular reference detection\r\n * @returns\r\n * - `CLONE_FILTER`: Skip this property (omit from result)\r\n * - `CLONE_DEFAULT`: Use default cloning logic\r\n * - Any other value: Use as the cloned result\r\n */\r\nexport type CloneCustomizer = (\r\n value: unknown,\r\n key: PropertyKey | undefined,\r\n object: object | undefined,\r\n stack: WeakMap<object, unknown>,\r\n) => unknown;\r\n\r\n/**\r\n * Represents a frame in the cloning stack for iterative processing.\r\n */\r\ninterface CloneFrame {\r\n source: object;\r\n target: object;\r\n tag: string;\r\n depth: number;\r\n}\r\n\r\n// Precompiled regex for performance optimization\r\nconst TYPED_ARRAY_TAG =\r\n /^\\[object (?:Int8|Uint8|Uint8Clamped|Int16|Uint16|Int32|Uint32|Float32|Float64|BigInt64|BigUint64)Array\\]$/;\r\n\r\n// Generic structure for TypedArray, used for precise type assertions\r\ninterface TypedArrayLike {\r\n buffer: ArrayBuffer;\r\n byteOffset: number;\r\n length: number;\r\n constructor: new (\r\n buffer: ArrayBuffer,\r\n byteOffset: number,\r\n length: number,\r\n ) => TypedArrayLike;\r\n}\r\n\r\n/**\r\n * Internal base cloning implementation using an iterative approach to avoid call stack limits.\r\n * @template T\r\n * @param value - The value to clone\r\n * @param customizer - Optional customizer function for controlling cloning behavior\r\n * @param seen - WeakMap for tracking visited objects to detect circular references\r\n * @param depth - Maximum cloning depth\r\n * @param key - Current property key (undefined for root)\r\n * @param parent - Parent object (undefined for root)\r\n * @param stack - Stack for iterative processing of nested objects\r\n * @returns The cloned value\r\n */\r\nfunction _baseClone<T>(\r\n value: T,\r\n customizer: CloneCustomizer | undefined,\r\n seen: WeakMap<object, unknown>,\r\n depth: number,\r\n key: PropertyKey | undefined = undefined,\r\n parent: object | undefined = undefined,\r\n stack: CloneFrame[] = [],\r\n): T {\r\n if (depth <= 0) return value;\r\n\r\n if (customizer) {\r\n const result = customizer(value, key, parent, seen);\r\n if (result !== CLONE_DEFAULT) {\r\n return result as T;\r\n }\r\n }\r\n\r\n if (value === null || typeof value !== 'object') return value;\r\n\r\n if (seen.has(value)) return seen.get(value) as T;\r\n\r\n const tag = getTag(value);\r\n\r\n if (\r\n tag === '[object Promise]' ||\r\n tag === '[object Function]' ||\r\n typeof value === 'function'\r\n ) {\r\n return value;\r\n }\r\n\r\n let result: unknown;\r\n\r\n switch (tag) {\r\n case '[object ArrayBuffer]': {\r\n const buffer = value as unknown as ArrayBuffer;\r\n result = buffer.slice(0);\r\n seen.set(value, result);\r\n return result as T;\r\n }\r\n\r\n case '[object WeakMap]': {\r\n result = new WeakMap();\r\n seen.set(value, result);\r\n return result as T;\r\n }\r\n\r\n case '[object WeakSet]': {\r\n result = new WeakSet();\r\n seen.set(value, result);\r\n return result as T;\r\n }\r\n\r\n case '[object Date]': {\r\n result = new Date((value as unknown as Date).getTime());\r\n break;\r\n }\r\n\r\n case '[object RegExp]': {\r\n const r = value as unknown as RegExp;\r\n result = new RegExp(r.source, r.flags);\r\n (result as RegExp).lastIndex = r.lastIndex;\r\n break;\r\n }\r\n\r\n case '[object Error]': {\r\n const e = value as unknown as Error;\r\n // 保留原型链\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n result = Object.create(Object.getPrototypeOf(e));\r\n // 获取源对象所有自身的属性描述符(包括 code, message, name, stack 等)\r\n const descriptors = Object.getOwnPropertyDescriptors(e);\r\n // 将这些描述符定义到新对象上\r\n Object.defineProperties(result, descriptors);\r\n break;\r\n }\r\n\r\n case '[object Array]': {\r\n result = [];\r\n break;\r\n }\r\n\r\n case '[object Map]': {\r\n result = new Map();\r\n break;\r\n }\r\n\r\n case '[object Set]': {\r\n result = new Set();\r\n break;\r\n }\r\n\r\n case '[object DataView]': {\r\n const dv = value as unknown as DataView;\r\n const buf = _baseClone(\r\n dv.buffer,\r\n customizer,\r\n seen,\r\n depth - 1,\r\n 'buffer',\r\n dv,\r\n stack,\r\n );\r\n result = new DataView(buf as ArrayBuffer, dv.byteOffset, dv.byteLength);\r\n break;\r\n }\r\n\r\n default: {\r\n if (TYPED_ARRAY_TAG.test(tag)) {\r\n const ta = value as unknown as TypedArrayLike;\r\n const buf = _baseClone(\r\n ta.buffer,\r\n customizer,\r\n seen,\r\n depth - 1,\r\n 'buffer',\r\n ta,\r\n stack,\r\n );\r\n result = new ta.constructor(buf, ta.byteOffset, ta.length);\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n result = Object.create(Object.getPrototypeOf(value));\r\n }\r\n break;\r\n }\r\n }\r\n\r\n seen.set(value, result);\r\n\r\n stack.push({\r\n source: value as object,\r\n target: result as object,\r\n tag,\r\n depth: depth - 1,\r\n });\r\n\r\n return result as T;\r\n}\r\n\r\n/**\r\n * Helper function: clones enumerable properties of an object (including string keys and Symbol keys).\r\n * @param source - The source object to clone properties from\r\n * @param target - The target object to clone properties to\r\n * @param depth - Current cloning depth\r\n * @param customizer - Optional customizer function for controlling cloning behavior\r\n * @param seen - WeakMap for tracking visited objects\r\n * @param stack - Stack for iterative processing of nested objects\r\n */\r\nfunction cloneProperties(\r\n source: object,\r\n target: object,\r\n depth: number,\r\n customizer: CloneCustomizer | undefined,\r\n seen: WeakMap<object, unknown>,\r\n stack: CloneFrame[],\r\n): void {\r\n const isArray = Array.isArray(source);\r\n\r\n // Handle string keys\r\n const keys = Object.keys(source);\r\n const keysLength = keys.length;\r\n for (let i = 0; i < keysLength; i++) {\r\n const k = keys[i];\r\n if (isArray && isArrayIndex(k)) continue;\r\n\r\n const clonedValue = _baseClone(\r\n (source as Record<PropertyKey, unknown>)[k],\r\n customizer,\r\n seen,\r\n depth,\r\n k,\r\n source,\r\n stack,\r\n );\r\n\r\n if (clonedValue !== CLONE_FILTER) {\r\n (target as Record<PropertyKey, unknown>)[k] = clonedValue;\r\n }\r\n }\r\n\r\n // Handle Symbol keys\r\n const symbols = Object.getOwnPropertySymbols(source);\r\n const symbolsLength = symbols.length;\r\n for (let i = 0; i < symbolsLength; i++) {\r\n const k = symbols[i];\r\n const descriptor = Object.getOwnPropertyDescriptor(source, k);\r\n if (descriptor?.enumerable) {\r\n const clonedValue = _baseClone(\r\n (source as Record<PropertyKey, unknown>)[k],\r\n customizer,\r\n seen,\r\n depth,\r\n k,\r\n source,\r\n stack,\r\n );\r\n\r\n if (clonedValue !== CLONE_FILTER) {\r\n (target as Record<PropertyKey, unknown>)[k] = clonedValue;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Processes the stack of frames to perform deep cloning iteratively.\r\n * @param stack - Stack of frames to process\r\n * @param customizer - Optional customizer function for controlling cloning behavior\r\n * @param seen - WeakMap for tracking visited objects\r\n */\r\nfunction processStack(\r\n stack: CloneFrame[],\r\n customizer: CloneCustomizer | undefined,\r\n seen: WeakMap<object, unknown>,\r\n): void {\r\n while (stack.length > 0) {\r\n const frame = stack.pop()!;\r\n const {source, target, tag, depth} = frame;\r\n\r\n switch (tag) {\r\n case '[object Array]': {\r\n const arr = source as unknown[];\r\n const tgt = target as unknown[];\r\n const arrLength = arr.length;\r\n\r\n tgt.length = 0;\r\n\r\n for (let i = 0; i < arrLength; i++) {\r\n if (!(i in arr)) {\r\n tgt.length++;\r\n continue;\r\n }\r\n\r\n const clonedItem = _baseClone(\r\n arr[i],\r\n customizer,\r\n seen,\r\n depth,\r\n i,\r\n arr,\r\n stack,\r\n );\r\n\r\n if (clonedItem === CLONE_FILTER) {\r\n continue;\r\n }\r\n\r\n if (clonedItem === CLONE_HOLE) {\r\n tgt.length++;\r\n } else {\r\n tgt.push(clonedItem);\r\n }\r\n }\r\n\r\n cloneProperties(source, target, depth, customizer, seen, stack);\r\n break;\r\n }\r\n\r\n case '[object Map]': {\r\n const map = source as Map<unknown, unknown>;\r\n const tgt = target as Map<unknown, unknown>;\r\n\r\n map.forEach((v, k) => {\r\n const clonedKey = _baseClone(\r\n k,\r\n customizer,\r\n seen,\r\n depth,\r\n k as PropertyKey,\r\n map,\r\n stack,\r\n );\r\n\r\n if (clonedKey !== CLONE_FILTER) {\r\n const clonedVal = _baseClone(\r\n v,\r\n customizer,\r\n seen,\r\n depth,\r\n k as PropertyKey,\r\n map,\r\n stack,\r\n );\r\n if (clonedVal !== CLONE_FILTER) {\r\n tgt.set(clonedKey, clonedVal);\r\n }\r\n }\r\n });\r\n\r\n cloneProperties(source, target, depth, customizer, seen, stack);\r\n break;\r\n }\r\n\r\n case '[object Set]': {\r\n const set = source as Set<unknown>;\r\n const tgt = target as Set<unknown>;\r\n\r\n set.forEach((v) => {\r\n const clonedVal = _baseClone(\r\n v,\r\n customizer,\r\n seen,\r\n depth,\r\n v as PropertyKey,\r\n set,\r\n stack,\r\n );\r\n if (clonedVal !== CLONE_FILTER) {\r\n tgt.add(clonedVal);\r\n }\r\n });\r\n\r\n cloneProperties(source, target, depth, customizer, seen, stack);\r\n break;\r\n }\r\n\r\n default: {\r\n cloneProperties(source, target, depth, customizer, seen, stack);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a deep clone of a value.\r\n * @template T - Type of value to clone\r\n * @param value - Value to clone\r\n * @param depth - Maximum cloning depth (default: Infinity)\r\n * @returns Deep clone of the value\r\n */\r\nexport const cloneDeep = <T>(value: T, depth: number = Infinity): T => {\r\n const stack: CloneFrame[] = [];\r\n const seen = new WeakMap<object, unknown>();\r\n const result = _baseClone(\r\n value,\r\n undefined,\r\n seen,\r\n depth,\r\n undefined,\r\n undefined,\r\n stack,\r\n );\r\n processStack(stack, undefined, seen);\r\n return result;\r\n};\r\n\r\n/**\r\n * Creates a deep clone of a value with custom transformation logic.\r\n * @template T - Type of value to clone\r\n * @param value - Value to clone\r\n * @param customizer - Customizer function for controlling cloning behavior\r\n * @param depth - Maximum cloning depth (default: Infinity)\r\n * @returns Deep clone of the value with custom transformations\r\n */\r\nexport const cloneDeepWith = <T>(\r\n value: T,\r\n customizer: CloneCustomizer,\r\n depth: number = Infinity,\r\n): T => {\r\n const stack: CloneFrame[] = [];\r\n const seen = new WeakMap<object, unknown>();\r\n const result = _baseClone(\r\n value,\r\n customizer,\r\n seen,\r\n depth,\r\n undefined,\r\n undefined,\r\n stack,\r\n );\r\n processStack(stack, customizer, seen);\r\n return result;\r\n};\r\n"],"names":["execute_pipeline","initial_value","fns","result","fn","execute_async_pipeline","i","isPromiseLike","async_result","j","run","input","pipe","identity","args","first_result","subsequent_fns","runAsync","pipeAsync","__","curry","length","ParameterError","makeCurried","prev_args","holes","next_args","ptr","h","val","x","SKIPPED","useRAF","Debounced","wait","leading","trailing","max_wait","time","this_arg","time_since_last_call","wait_remain","time_since_last_invoke","max_wait_remain","instance","now","timeout","context","is_invokable","createDebounce","options","maxWait","use_raf","wait_time","wrapper","dispose","createThrottle","NO_ERROR","defer","task","callbacks","register","result_value","error_arg","callback_errors","dynamicAwait","e","all_errors","getTag","value","isString","isNumber","isFinite","isBoolean","isSymbol","isNull","isUndefined","isNil","isNotNil","isNotNullish","isPrimitive","type","isObject","isFunction","isArray","isPlainObject","proto","isInteger","isSafeInteger","isLength","isDate","isRegExp","isError","tag","isMap","isSet","isWeakMap","isWeakSet","isArrayBuffer","TYPED_ARRAY_TAG","isTypedArray","isBrowser","isClient","isNode","isBuffer","isBlob","isFile","isIterable","isAsyncIterable","isPromise","isInstanceOf","constructor","isPropertyKey","isEmpty","isEmptyObject","isSerializable","isJSONValue","isJSONObject","isJSONArray","_","isJSON","str","isEmail","isUrl","isUUID","isEqualWith","other","customizer","stack","baseEqual","a","b","tagA","tagB","seenOther","arrA","arrB","index","keysA","keysB","key","mapA","mapB","setA","setB","bValues","item","idx","bVal","bufA","bufB","isEqual","mapKeys","obj","k","v","mapValues","invert","pick","keys","pickBy","predicate","omit","skipSet","omitBy","findKey","MERGE_SKIP","MERGE_DEFAULT","internalMerge","target","sources","source","currTarget","currSource","sourceValue","targetValue","customResult","merge","mergeWith","flattenObject","separator","curr","prefix","newKey","transformKeys","transformer","prototype","toCamelCaseKeys","camelCase","toSnakeCaseKeys","snakeCase","CLONE_FILTER","CLONE_DEFAULT","CLONE_HOLE","clone","isArrayIndex","n","_baseClone","seen","depth","parent","r","descriptors","dv","buf","ta","cloneProperties","keysLength","clonedValue","symbols","symbolsLength","processStack","frame","arr","tgt","arrLength","clonedItem","map","clonedKey","clonedVal","set","cloneDeep","cloneDeepWith"],"mappings":"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"}
|