Function handleCurriedIsomorphicIterable

  • Takes a generator for iterables, then a generator for async iterables and last 2 iterables, using the proper generator automatically.

    Example

    const handle = handleCurriedIsomorphicIterable(
    iterable2 => iterable1 => function* () {
    yield* iterable2;
    yield* iterable1;
    }
    )(
    iterable2 => iterable1 => async function* () {
    yield* iterable2;
    yield* iterable1;
    }
    );

    handle(nonAsyncIterable)(nonAsyncIterable); // IterableIterator
    handle(asyncIterable)(nonAsyncIterable); // AsyncIterableIterator

    Type Parameters

    • Iterable2Item = unknown

    • Iterable1Item = unknown

    • Output = unknown

    Parameters

    • iterator: Unary<Iterable<Iterable2Item>, Unary<Iterable<Iterable1Item>, Function<ReadOnlyArray<never>, Generator<Output, void, void>>>>

      Function to be used with non async iterables.

    Returns ((asyncIterator) => (<Iterable2>(iterable2) => (<Iterable1>(iterable1) => Iterable2 extends {
            [asyncIterator]() => AsyncIterator<Iterable2Item, any, undefined>;
        }
        ? {
            [asyncIterator]() => AsyncIterableIterator<Output>;
            next(...args) => Promise<IteratorResult<Output, any>>;
            return?(value?) => Promise<IteratorResult<Output, any>>;
            throw?(e?) => Promise<IteratorResult<Output, any>>;
        }
        : Iterable1 extends {
                [asyncIterator]() => AsyncIterator<Iterable1Item, any, undefined>;
            }
            ? {
                [asyncIterator]() => AsyncIterableIterator<Output>;
                next(...args) => Promise<IteratorResult<Output, any>>;
                return?(value?) => Promise<IteratorResult<Output, any>>;
                throw?(e?) => Promise<IteratorResult<Output, any>>;
            }
            : {
                [iterator]() => IterableIterator<Output>;
                next(...args) => IteratorResult<Output, any>;
                return?(value?) => IteratorResult<Output, any>;
                throw?(e?) => IteratorResult<Output, any>;
            })))

    Curried function with iterator in context.

      • (asyncIterator): (<Iterable2>(iterable2) => (<Iterable1>(iterable1) => Iterable2 extends {
                [asyncIterator]() => AsyncIterator<Iterable2Item, any, undefined>;
            }
            ? {
                [asyncIterator]() => AsyncIterableIterator<Output>;
                next(...args) => Promise<IteratorResult<Output, any>>;
                return?(value?) => Promise<IteratorResult<Output, any>>;
                throw?(e?) => Promise<IteratorResult<Output, any>>;
            }
            : Iterable1 extends {
                    [asyncIterator]() => AsyncIterator<Iterable1Item, any, undefined>;
                }
                ? {
                    [asyncIterator]() => AsyncIterableIterator<Output>;
                    next(...args) => Promise<IteratorResult<Output, any>>;
                    return?(value?) => Promise<IteratorResult<Output, any>>;
                    throw?(e?) => Promise<IteratorResult<Output, any>>;
                }
                : {
                    [iterator]() => IterableIterator<Output>;
                    next(...args) => IteratorResult<Output, any>;
                    return?(value?) => IteratorResult<Output, any>;
                    throw?(e?) => IteratorResult<Output, any>;
                }))
      • Parameters

        • asyncIterator: Unary<IsomorphicIterable<Iterable2Item>, Unary<IsomorphicIterable<Iterable1Item>, Function<ReadOnlyArray<never>, AsyncGenerator<Output, void, void>>>>

        Returns (<Iterable2>(iterable2) => (<Iterable1>(iterable1) => Iterable2 extends {
                [asyncIterator]() => AsyncIterator<Iterable2Item, any, undefined>;
            }
            ? {
                [asyncIterator]() => AsyncIterableIterator<Output>;
                next(...args) => Promise<IteratorResult<Output, any>>;
                return?(value?) => Promise<IteratorResult<Output, any>>;
                throw?(e?) => Promise<IteratorResult<Output, any>>;
            }
            : Iterable1 extends {
                    [asyncIterator]() => AsyncIterator<Iterable1Item, any, undefined>;
                }
                ? {
                    [asyncIterator]() => AsyncIterableIterator<Output>;
                    next(...args) => Promise<IteratorResult<Output, any>>;
                    return?(value?) => Promise<IteratorResult<Output, any>>;
                    throw?(e?) => Promise<IteratorResult<Output, any>>;
                }
                : {
                    [iterator]() => IterableIterator<Output>;
                    next(...args) => IteratorResult<Output, any>;
                    return?(value?) => IteratorResult<Output, any>;
                    throw?(e?) => IteratorResult<Output, any>;
                }))

          • <Iterable2>(iterable2): (<Iterable1>(iterable1) => Iterable2 extends {
                    [asyncIterator]() => AsyncIterator<Iterable2Item, any, undefined>;
                }
                ? {
                    [asyncIterator]() => AsyncIterableIterator<Output>;
                    next(...args) => Promise<IteratorResult<Output, any>>;
                    return?(value?) => Promise<IteratorResult<Output, any>>;
                    throw?(e?) => Promise<IteratorResult<Output, any>>;
                }
                : Iterable1 extends {
                        [asyncIterator]() => AsyncIterator<Iterable1Item, any, undefined>;
                    }
                    ? {
                        [asyncIterator]() => AsyncIterableIterator<Output>;
                        next(...args) => Promise<IteratorResult<Output, any>>;
                        return?(value?) => Promise<IteratorResult<Output, any>>;
                        throw?(e?) => Promise<IteratorResult<Output, any>>;
                    }
                    : {
                        [iterator]() => IterableIterator<Output>;
                        next(...args) => IteratorResult<Output, any>;
                        return?(value?) => IteratorResult<Output, any>;
                        throw?(e?) => IteratorResult<Output, any>;
                    })
          • Type Parameters

            • Iterable2 extends IsomorphicIterable<Iterable2Item>

            Parameters

            • iterable2: Iterable2

            Returns (<Iterable1>(iterable1) => Iterable2 extends {
                    [asyncIterator]() => AsyncIterator<Iterable2Item, any, undefined>;
                }
                ? {
                    [asyncIterator]() => AsyncIterableIterator<Output>;
                    next(...args) => Promise<IteratorResult<Output, any>>;
                    return?(value?) => Promise<IteratorResult<Output, any>>;
                    throw?(e?) => Promise<IteratorResult<Output, any>>;
                }
                : Iterable1 extends {
                        [asyncIterator]() => AsyncIterator<Iterable1Item, any, undefined>;
                    }
                    ? {
                        [asyncIterator]() => AsyncIterableIterator<Output>;
                        next(...args) => Promise<IteratorResult<Output, any>>;
                        return?(value?) => Promise<IteratorResult<Output, any>>;
                        throw?(e?) => Promise<IteratorResult<Output, any>>;
                    }
                    : {
                        [iterator]() => IterableIterator<Output>;
                        next(...args) => IteratorResult<Output, any>;
                        return?(value?) => IteratorResult<Output, any>;
                        throw?(e?) => IteratorResult<Output, any>;
                    })

              • <Iterable1>(iterable1): Iterable2 extends {
                        [asyncIterator]() => AsyncIterator<Iterable2Item, any, undefined>;
                    }
                    ? {
                        [asyncIterator]() => AsyncIterableIterator<Output>;
                        next(...args) => Promise<IteratorResult<Output, any>>;
                        return?(value?) => Promise<IteratorResult<Output, any>>;
                        throw?(e?) => Promise<IteratorResult<Output, any>>;
                    }
                    : Iterable1 extends {
                            [asyncIterator]() => AsyncIterator<Iterable1Item, any, undefined>;
                        }
                        ? {
                            [asyncIterator]() => AsyncIterableIterator<Output>;
                            next(...args) => Promise<IteratorResult<Output, any>>;
                            return?(value?) => Promise<IteratorResult<Output, any>>;
                            throw?(e?) => Promise<IteratorResult<Output, any>>;
                        }
                        : {
                            [iterator]() => IterableIterator<Output>;
                            next(...args) => IteratorResult<Output, any>;
                            return?(value?) => IteratorResult<Output, any>;
                            throw?(e?) => IteratorResult<Output, any>;
                        }
              • Type Parameters

                • Iterable1 extends IsomorphicIterable<Iterable1Item>

                Parameters

                • iterable1: Iterable1

                Returns Iterable2 extends {
                        [asyncIterator]() => AsyncIterator<Iterable2Item, any, undefined>;
                    }
                    ? {
                        [asyncIterator]() => AsyncIterableIterator<Output>;
                        next(...args) => Promise<IteratorResult<Output, any>>;
                        return?(value?) => Promise<IteratorResult<Output, any>>;
                        throw?(e?) => Promise<IteratorResult<Output, any>>;
                    }
                    : Iterable1 extends {
                            [asyncIterator]() => AsyncIterator<Iterable1Item, any, undefined>;
                        }
                        ? {
                            [asyncIterator]() => AsyncIterableIterator<Output>;
                            next(...args) => Promise<IteratorResult<Output, any>>;
                            return?(value?) => Promise<IteratorResult<Output, any>>;
                            throw?(e?) => Promise<IteratorResult<Output, any>>;
                        }
                        : {
                            [iterator]() => IterableIterator<Output>;
                            next(...args) => IteratorResult<Output, any>;
                            return?(value?) => IteratorResult<Output, any>;
                            throw?(e?) => IteratorResult<Output, any>;
                        }