96 lines
3.1 KiB
Plaintext
96 lines
3.1 KiB
Plaintext
import { identity } from './identity';
|
|
import { UnaryFunction } from '../types';
|
|
|
|
export function pipe(): typeof identity;
|
|
export function pipe<T, A>(fn1: UnaryFunction<T, A>): UnaryFunction<T, A>;
|
|
export function pipe<T, A, B>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>): UnaryFunction<T, B>;
|
|
export function pipe<T, A, B, C>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>): UnaryFunction<T, C>;
|
|
export function pipe<T, A, B, C, D>(
|
|
fn1: UnaryFunction<T, A>,
|
|
fn2: UnaryFunction<A, B>,
|
|
fn3: UnaryFunction<B, C>,
|
|
fn4: UnaryFunction<C, D>
|
|
): UnaryFunction<T, D>;
|
|
export function pipe<T, A, B, C, D, E>(
|
|
fn1: UnaryFunction<T, A>,
|
|
fn2: UnaryFunction<A, B>,
|
|
fn3: UnaryFunction<B, C>,
|
|
fn4: UnaryFunction<C, D>,
|
|
fn5: UnaryFunction<D, E>
|
|
): UnaryFunction<T, E>;
|
|
export function pipe<T, A, B, C, D, E, F>(
|
|
fn1: UnaryFunction<T, A>,
|
|
fn2: UnaryFunction<A, B>,
|
|
fn3: UnaryFunction<B, C>,
|
|
fn4: UnaryFunction<C, D>,
|
|
fn5: UnaryFunction<D, E>,
|
|
fn6: UnaryFunction<E, F>
|
|
): UnaryFunction<T, F>;
|
|
export function pipe<T, A, B, C, D, E, F, G>(
|
|
fn1: UnaryFunction<T, A>,
|
|
fn2: UnaryFunction<A, B>,
|
|
fn3: UnaryFunction<B, C>,
|
|
fn4: UnaryFunction<C, D>,
|
|
fn5: UnaryFunction<D, E>,
|
|
fn6: UnaryFunction<E, F>,
|
|
fn7: UnaryFunction<F, G>
|
|
): UnaryFunction<T, G>;
|
|
export function pipe<T, A, B, C, D, E, F, G, H>(
|
|
fn1: UnaryFunction<T, A>,
|
|
fn2: UnaryFunction<A, B>,
|
|
fn3: UnaryFunction<B, C>,
|
|
fn4: UnaryFunction<C, D>,
|
|
fn5: UnaryFunction<D, E>,
|
|
fn6: UnaryFunction<E, F>,
|
|
fn7: UnaryFunction<F, G>,
|
|
fn8: UnaryFunction<G, H>
|
|
): UnaryFunction<T, H>;
|
|
export function pipe<T, A, B, C, D, E, F, G, H, I>(
|
|
fn1: UnaryFunction<T, A>,
|
|
fn2: UnaryFunction<A, B>,
|
|
fn3: UnaryFunction<B, C>,
|
|
fn4: UnaryFunction<C, D>,
|
|
fn5: UnaryFunction<D, E>,
|
|
fn6: UnaryFunction<E, F>,
|
|
fn7: UnaryFunction<F, G>,
|
|
fn8: UnaryFunction<G, H>,
|
|
fn9: UnaryFunction<H, I>
|
|
): UnaryFunction<T, I>;
|
|
export function pipe<T, A, B, C, D, E, F, G, H, I>(
|
|
fn1: UnaryFunction<T, A>,
|
|
fn2: UnaryFunction<A, B>,
|
|
fn3: UnaryFunction<B, C>,
|
|
fn4: UnaryFunction<C, D>,
|
|
fn5: UnaryFunction<D, E>,
|
|
fn6: UnaryFunction<E, F>,
|
|
fn7: UnaryFunction<F, G>,
|
|
fn8: UnaryFunction<G, H>,
|
|
fn9: UnaryFunction<H, I>,
|
|
...fns: UnaryFunction<any, any>[]
|
|
): UnaryFunction<T, unknown>;
|
|
|
|
/**
|
|
* pipe() can be called on one or more functions, each of which can take one argument ("UnaryFunction")
|
|
* and uses it to return a value.
|
|
* It returns a function that takes one argument, passes it to the first UnaryFunction, and then
|
|
* passes the result to the next one, passes that result to the next one, and so on.
|
|
*/
|
|
export function pipe(...fns: Array<UnaryFunction<any, any>>): UnaryFunction<any, any> {
|
|
return pipeFromArray(fns);
|
|
}
|
|
|
|
/** @internal */
|
|
export function pipeFromArray<T, R>(fns: Array<UnaryFunction<T, R>>): UnaryFunction<T, R> {
|
|
if (fns.length === 0) {
|
|
return identity as UnaryFunction<any, any>;
|
|
}
|
|
|
|
if (fns.length === 1) {
|
|
return fns[0];
|
|
}
|
|
|
|
return function piped(input: T): R {
|
|
return fns.reduce((prev: any, fn: UnaryFunction<T, R>) => fn(prev), input as any);
|
|
};
|
|
}
|