import { Source, Sink, Operator } from './types'; interface UnaryFn { (source: T): R; } /** Chain calls operators on a given source and returns the last result. * @param args - A source, then a variable number of transform functions * * @remarks * The `pipe` utility can be called with a {@link Source} then one or more unary transform functions. * Each transform function will be called in turn with the last function's return value, starting * with the source passed as the first argument to `pipe`. * * It's used to transform a source with a list of {@link Operator | Operators}. The last argument may * also be a {@link Sink} that returns something else than a Source. * * @example * * ```ts * pipe( * fromArray([1, 2, 3]), * map(x => x * 2), * subscribe(console.log) * ); * ``` * * @see {@link https://github.com/tc39/proposal-pipeline-operator} for the JS Pipeline Operator spec, for which this is a replacement utility for. */ interface pipe { /* pipe definitions for source + operators composition */ (source: Source, op1: UnaryFn, Source>): Source; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source> ): Source; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source> ): Source; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source> ): Source; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, op5: UnaryFn, Source> ): Source; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, op5: UnaryFn, Source>, op6: UnaryFn, Source> ): Source; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, op5: UnaryFn, Source>, op6: UnaryFn, Source>, op7: UnaryFn, Source> ): Source; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, op5: UnaryFn, Source>, op6: UnaryFn, Source>, op7: UnaryFn, Source>, op8: UnaryFn, Source> ): Source; /* pipe definitions for source + operators + consumer composition */ (source: Source, consumer: UnaryFn, R>): R; ( source: Source, op1: UnaryFn, Source>, consumer: UnaryFn, R> ): R; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, consumer: UnaryFn, R> ): R; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, consumer: UnaryFn, R> ): R; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, consumer: UnaryFn, R> ): R; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, op5: UnaryFn, Source>, consumer: UnaryFn, R> ): R; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, op5: UnaryFn, Source>, op6: UnaryFn, Source>, consumer: UnaryFn, R> ): R; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, op5: UnaryFn, Source>, op6: UnaryFn, Source>, op7: UnaryFn, Source>, consumer: UnaryFn, R> ): R; ( source: Source, op1: UnaryFn, Source>, op2: UnaryFn, Source>, op3: UnaryFn, Source>, op4: UnaryFn, Source>, op5: UnaryFn, Source>, op6: UnaryFn, Source>, op7: UnaryFn, Source>, op8: UnaryFn, Source>, consumer: UnaryFn, R> ): R; } const pipe: pipe = (...args: Function[]): any => { let x = args[0]; for (let i = 1, l = args.length; i < l; i++) x = args[i](x); return x; }; export { pipe };