import { checkArray, checkFunction } from "../_check" import { slice } from "../_util" import { EventStream } from "../EventStream" import { Observable } from "../Observable" import { never } from "../sources/never" import { map } from "./map" import { toEventStream } from "./toEventStream" import { _when } from "./when" export function zipAsArray(streams: [Observable]): EventStream<[A]> export function zipAsArray(streams: [Observable, Observable]): EventStream<[A, B]> export function zipAsArray( streams: [Observable, Observable, Observable], ): EventStream<[A, B, C]> export function zipAsArray( streams: [Observable, Observable, Observable, Observable], ): EventStream<[A, B, C, D]> export function zipAsArray( streams: [Observable, Observable, Observable, Observable, Observable], ): EventStream<[A, B, C, D, E]> export function zipAsArray( streams: [ Observable, Observable, Observable, Observable, Observable, Observable ], ): EventStream<[A, B, C, D, E, F]> export function zipAsArray(streams: Array>): EventStream { checkArray(streams) switch (streams.length) { case 0: return never() case 1: return map(x => [x], toEventStream(streams[0])) as EventStream<[any]> default: return _when([streams.map(toEventStream), slice], false) } } export function zipWith( f: (a: A) => ResultType, streams: [Observable], ): EventStream export function zipWith( f: (a: A, b: B) => ResultType, streams: [Observable, Observable], ): EventStream export function zipWith( f: (a: A, b: B, c: C) => ResultType, streams: [Observable, Observable, Observable], ): EventStream export function zipWith( f: (a: A, b: B, c: C, d: D) => ResultType, streams: [Observable, Observable, Observable, Observable], ): EventStream export function zipWith( f: (a: A, b: B, c: C, d: D, e: E) => ResultType, streams: [Observable, Observable, Observable, Observable, Observable], ): EventStream export function zipWith( f: (a: A, b: B, c: C, d: D, e: E, f: F) => ResultType, streams: [ Observable, Observable, Observable, Observable, Observable, Observable ], ): EventStream export function zipWith( f: (...args: any[]) => ResultType, streams: Array>, ): EventStream { checkArray(streams) checkFunction(f) switch (streams.length) { case 0: return never() case 1: return map(f, toEventStream(streams[0])) as EventStream default: return _when([streams.map(toEventStream), f], true) } }