import { IterableActivity, Source, isSource, ScalarActivity } from "../activities/activity"; const GeneratorFunction = (function* () { }).constructor; function chainGen(...items: (IterableActivity | ScalarActivity)[]): IterableActivity { if (items[items.length - 1] instanceof GeneratorFunction) { return function* (source) { // @ts-ignore let tail: IterableIterator = source; for (const activity of items) { // @ts-ignore tail = activity(tail); } yield* tail; }; } else { return function (source) { // @ts-ignore let tail: IterableIterator = source; for (const activity of items) { // @ts-ignore tail = activity(tail); } return tail; }; } } // TODO: Switch to TS Variadic Types in 4.0 export function pipe(head: IterableActivity): IterableActivity; export function pipe(head: ScalarActivity): ScalarActivity; export function pipe(source: Source): IterableIterator; export function pipe(head: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity): IterableIterator; export function pipe(source: Source, head: ScalarActivity): U; export function pipe(head: IterableActivity, i1: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, i1: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity, tail: IterableActivity): IterableIterator; export function pipe(source: Source, head: IterableActivity, tail: ScalarActivity): U; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, tail: IterableActivity): IterableIterator; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, tail: ScalarActivity): U; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, tail: IterableActivity): IterableIterator; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, tail: ScalarActivity): U; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, tail: IterableActivity): IterableIterator; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, tail: ScalarActivity): U; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, tail: IterableActivity): IterableIterator; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, tail: ScalarActivity): U; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, tail: IterableActivity): IterableIterator; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, tail: ScalarActivity): U; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, i7: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, i7: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, tail: IterableActivity): IterableIterator; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, tail: ScalarActivity): U; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, i7: IterableActivity, i8: IterableActivity, tail: IterableActivity): IterableActivity; export function pipe(head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, i7: IterableActivity, i8: IterableActivity, tail: ScalarActivity): ScalarActivity; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, i7: IterableActivity, tail: IterableActivity): IterableIterator; export function pipe(source: Source, head: IterableActivity, i1: IterableActivity, i2: IterableActivity, i3: IterableActivity, i4: IterableActivity, i5: IterableActivity, i6: IterableActivity, i7: IterableActivity, tail: ScalarActivity): U; export function pipe(s_or_ia: Source | IterableActivity, ...items: (IterableActivity | ScalarActivity)[]): IterableActivity | ScalarActivity | IterableIterator { return isSource(s_or_ia) ? chainGen(...items)(s_or_ia) : chainGen(s_or_ia, ...items); } // Maintain backward compatibility export const chain = pipe;