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)
}
}