import { Operator, Producer, Consumer, Subject, Dispose } from './types'; // Consumer at the end, returning a dispose // prettier-ignore export function pipe(source: Producer | Subject, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, consumer: Consumer

): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, o17: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, o17: Operator, o18: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, o17: Operator, o18: Operator, o19: Operator, consumer: Consumer): Dispose; // prettier-ignore export function pipe(source: Producer | Subject, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, o17: Operator, o18: Operator, o19: Operator, o20: Operator, consumer: Consumer): Dispose; // Returning a new callbag // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator): Producer

; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, o17: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, o17: Operator, o18: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, o17: Operator, o18: Operator, o19: Operator): Producer; // prettier-ignore export function pipe(source: Producer | Subject, o1: Operator, o2: Operator, o3: Operator, o4: Operator, o5: Operator, o6: Operator, o7: Operator, o8: Operator, o9: Operator, o10: Operator, o11: Operator, o12: Operator, o13: Operator, o14: Operator, o15: Operator, o16: Operator, o17: Operator, o18: Operator, o19: Operator, o20: Operator): Producer; export function pipe( source: Producer | Subject, ...ops: Array | Consumer> ): Producer | void { let res: any = source; for (let i = 0; i < ops.length; i++) { res = ops[i](res); } return res; }