UNPKG

@web3r/flowerkit

Version:

Tree-shakable JavaScript and TypeScript utility library for frontend/browser apps: DOM, events, arrays, objects, strings, date, JSON, and network helpers (ESM/CJS, SSR-friendly).

1 lines 2.69 kB
{"version":3,"file":"index.cjs","sources":[""],"sourcesContent":["export type TGetCurryFnArgs = Parameters<typeof getCurryFn>;\r\n\r\nexport type TGetCurryFnReturn = ReturnType<typeof getCurryFn>;\r\n\r\n/**\r\n * Curries a function, transforming it into a sequence of unary functions.\r\n * Collects arguments one by one until `arity` is reached, then invokes `fn`.\r\n *\r\n * @template {(...args: any[]) => any} T\r\n * @param {T} fn Function to curry\r\n * @param {number} [arity=fn.length] Number of arguments to collect before invoking\r\n * @returns {((arg: Parameters<T>[0]) => ReturnType<T> | any) & ((...args: Parameters<T>) => ReturnType<T>)}\r\n * @throws {TypeError} getCurryFn: fn must be a function\r\n * @throws {TypeError} getCurryFn: arity must be a non-negative integer\r\n *\r\n * @example\r\n * function sum(a: number, b: number) { return a + b; }\r\n * const curried = getCurryFn(sum);\r\n * curried(1)(2); // 3\r\n */\r\nexport const getCurryFn = <T extends (...args: any[]) => any>(\r\n fn: T,\r\n arity: number = fn.length\r\n): ((arg: Parameters<T>[0]) => ReturnType<T> | any) & ((...args: Parameters<T>) => ReturnType<T>) => {\r\n if (typeof fn !== \"function\") {\r\n throw new TypeError(\"getCurryFn: fn must be a function\");\r\n }\r\n if (typeof arity !== \"number\" || !Number.isFinite(arity) || arity < 0 || Math.floor(arity) !== arity) {\r\n throw new TypeError(\"getCurryFn: arity must be a non-negative integer\");\r\n }\r\n\r\n type TArg = Parameters<T>[number];\r\n\r\n const nextCurry = (prev: TArg[]): any => {\r\n return function curried(nextArg: TArg): any {\r\n const args = [ ...prev, nextArg ] as unknown as Parameters<T>;\r\n if (args.length >= arity) {\r\n return fn(...args);\r\n }\r\n return nextCurry(args as unknown as TArg[]);\r\n };\r\n };\r\n\r\n const entry = (...args: Parameters<T>): ReturnType<T> | any => {\r\n if (args.length >= arity) {\r\n return fn(...(args as Parameters<T>));\r\n }\r\n return nextCurry(args as unknown as TArg[]);\r\n };\r\n\r\n return entry as any;\r\n};\r\n"],"names":["getCurryFn","fn","arity","length","TypeError","Number","isFinite","Math","floor","nextCurry","prev","curried","nextArg","args","entry"],"mappings":";;;;;;;;;;;;;;;;GAoBO,MAAMA,WAAaA,CACxBC,GACAC,MAAgBD,GAAGE,UAEnB,UAAWF,KAAO,WAChB,MAAM,IAAIG,UAAU,qCAEtB,UAAWF,QAAU,WAAaG,OAAOC,SAASJ,QAAUA,MAAQ,GAAKK,KAAKC,MAAMN,SAAWA,MAC7F,MAAM,IAAIE,UAAU,oDAKtB,MAAMK,UAAaC,MACV,SAASC,QAAQC,SACtB,MAAMC,KAAO,IAAKH,KAAME,SACxB,GAAIC,KAAKV,QAAUD,MACjB,OAAOD,MAAMY,MAEf,OAAOJ,UAAUI,KACnB,EAGF,MAAMC,MAAQA,IAAID,QAChB,GAAIA,KAAKV,QAAUD,MACjB,OAAOD,MAAOY,MAEhB,OAAOJ,UAAUI,OAGnB,OAAOC"}