import { FN_PLACEHOLDER } from '../const/FN_PLACEHOLDER'; import { Fn } from '../../types'; /** * 返回T的子集 从最后一个元素开始 * @param T 参数数组 */ export declare type CurryPartialArr = T extends [...infer As, infer A] ? T | CurryPartialArr : [ ]; /** * 返回可能的参数组合 * @param T 参数的数组 * @param P 占位符 */ export declare type CurryPlaceholderArr = T extends [infer A1] ? T : T extends [infer A1, ...infer As] ? [ A1, ...CurryPlaceholderArr ] | [P, ...CurryPlaceholderArr] : [ ]; /** * 剩余需要传递的参数 * @param Expected 需要的参数 * @param Provided 已经传递的参数 */ export declare type CurryRemainingParameters = Expected extends [infer E1, ...infer EX] ? Provided extends [infer P1, ...infer PX] ? P1 extends FN_PLACEHOLDER ? [ E1, ...CurryRemainingParameters ] : CurryRemainingParameters : Expected : [ ]; export declare type CurryCurriedPlaceholderArgs = CurryPlaceholderArr>; export declare type CurryCurriedFunction = , T extends CurryCurriedPlaceholderArgs>(...args: T) => T extends Exp ? R : CurryCurriedFunction; export interface Curry { (fn: F): CurryCurriedFunction, [], ReturnType>; (fn: F, arity: number): CurryCurriedFunction>; placeholder: FN_PLACEHOLDER; } /** * @category Function * @param {function} fn * @param {number} arity * @returns {function} */ export declare const curry: Curry;