import type { MakeProm, λ } from "./types"; /** * Given a list of functions returns a function that will execute the given * functions one after another, always passing the result of the previous * function as an argument to the next function. * * If one of the given functions returns a promise, the promise will be resolved * before being passed to the next function. * * @example * ``` * const join = (...chars: string[]) => chars.join('') * pipe(join, parseInt)('1', '2', '3') // -> 123 * * const square = (n: number) => n ** 2 * * // this is equivalent to: square(square(square(2))) * pipe(square, square, square)(2) // -> 256 * * // also works with promises: * fetchNumber :: async () => Promise * pipe(fetchNumber, n => n.toString()) // async () => Promise * ``` */ declare const pipe: , ...λ[]]>(...funs: CheckPipe, Parameters>, false> extends never ? never : T) => PipedFun; export default pipe; /** * Like `pipe` but takes an argument as its first parameter and invokes the pipe * with it. * * Note: unlike in `pipe`, the first function of the pipe must take exactly one * argument. * * @see {@link pipe} * * @example * ``` * applyPipe(2, double, square, half) // -> 8 * ``` */ export declare const applyPipe: , ...λ[]]>(arg: Parameters[0], ...funs: CheckPipe, Parameters>, false> extends never ? never : T) => CheckPipe, Parameters>, false>; declare type PipedFun = PipeReturn extends never ? never : ((...args: Parameters) => PipeReturn); declare type PipeReturn = CheckPipe, Parameters>>; declare type FunDef = [Return: any, Args: any[]]; declare type CheckPipe = F extends [any, any, ...any[]] ? (Resolved extends Parameters ? CheckPipe extends Promise ? true : false> : never) : Resolved extends Parameters ? (Async extends true ? MakeProm> : ReturnType) : never; declare type Resolved = { [K in keyof T]: T[K] extends Promise ? I : T[K]; }; declare type ReturnTypes = { [K in keyof T]: ReturnType; }; declare type CarryReturn = Returns extends [ infer A, ...infer B ] ? [[A, Args], ...CarryReturn] : [];