/
zipWith.ts
64 lines (57 loc) · 1.9 KB
/
zipWith.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { isAsyncIterable, isIterable } from "../_internal/utils";
import map from "./map";
import zip from "./zip";
/**
* Returns Iterable/AsyncIterable out of the two supplied by applying `f` to each same positioned pair in Iterable/AsyncIterable.
*
* @example
* ```ts
* const iter = zipWith((a,b) => [a,b], [1,2,3], ['a','b','c']);
* iter.next(); // {value: [1, 'a'] , done: false}
* iter.next(); // {value: [2, 'b'] , done: false}
* iter.next(); // {value: [3, 'c'] , done: false}
* iter.next(); // {value: undefined , done: true}
* ```
*/
function zipWith<A, B, C>(
f: (a: A, b: B) => C,
iterable1: Iterable<A>,
iterable2: Iterable<B>,
): IterableIterator<C>;
function zipWith<A, B, C>(
f: (a: A, b: B) => C,
iterable1: Iterable<A>,
iterable2: AsyncIterable<B>,
): AsyncIterableIterator<C>;
function zipWith<A, B, C>(
f: (a: A, b: B) => C,
iterable1: AsyncIterable<A>,
iterable2: Iterable<B>,
): AsyncIterableIterator<C>;
function zipWith<A, B, C>(
f: (a: A, b: B) => C,
iterable1: AsyncIterable<A>,
iterable2: AsyncIterable<B>,
): AsyncIterableIterator<C>;
function zipWith<A, B, C>(
f: (a: A, b: B) => C,
iterable1: Iterable<A> | AsyncIterable<A>,
iterable2: Iterable<B> | AsyncIterable<B>,
): IterableIterator<C> | AsyncIterableIterator<C> {
if (isIterable(iterable1) && isIterable(iterable2)) {
return map(([a, b]) => f(a, b), zip(iterable1, iterable2));
}
if (isIterable(iterable1) && isAsyncIterable(iterable2)) {
return map(([a, b]) => f(a, b), zip(iterable1, iterable2));
}
if (isAsyncIterable(iterable1) && isIterable(iterable2)) {
return map(([a, b]) => f(a, b), zip(iterable1, iterable2));
}
if (isAsyncIterable(iterable1) && isAsyncIterable(iterable2)) {
return map(([a, b]) => f(a, b), zip(iterable1, iterable2));
}
throw new TypeError(
"'iterable1' and 'iterable2' must be type of Iterable or AsyncIterable",
);
}
export default zipWith;