iterable/asyncIterable.ts

import { EachIterableCallbackType, ReduceIterableCallbackType, takeIterableF } from "./iterable";
import { CheckPromiseIterableType } from "../types";
/**
 * @namespace asyncIterable
 */

/**
 * @memberof asyncIterable
 * @typedef
 */
export type AsyncIterableType<T> = AsyncIterable<T> | Iterable<T>;
/**
 * @memberof asyncIterable
 * @typedef
 */
export type AsyncIteratorType<T> = AsyncIterator<T> | Iterator<T>;
/**
 * @memberof asyncIterable
 */
export async function eachAsyncIterableF<T extends Iterable<any>>(
  callbackFn: EachIterableCallbackType<T, void>, iterable: T) {
  for await (const value of iterable) {
    callbackFn(await value, iterable);
  }
  return iterable;
}
/**
 * @memberof asyncIterable
 */
export async function* mapAsyncIterableF<T extends Iterable<any>, U>(
  callbackFn: EachIterableCallbackType<T, U>, iterable: T) {
  for await (const value of iterable) {
    yield callbackFn(await value, iterable);
  }
}
/**
 * @memberof asyncIterable
 */
export async function* filterAsyncIterableF<T extends Iterable<any>>(
  callbackFn: EachIterableCallbackType<T, boolean>, iterable: T) {
  for await (const value of iterable) {
    const v = await value;

    callbackFn(v, iterable) && (yield v);
  }
}
/**
 * @memberof asyncIterable
 */
export async function reduceAsyncIterableF<T, U extends Iterable<any>>(
  callbackFn: ReduceIterableCallbackType<T, CheckPromiseIterableType<U>, U>,
  initial: T,
  iterable: U) {
  let cur = initial;

  for await (const value of iterable) {
    const v = await value;

    cur = callbackFn(cur, v, iterable);
  }
  return cur;
}

/**
 * @memberof asyncIterable
 */
export function syncIterable<T>(iterable: AsyncIterableType<T>) {
  return takeIterableF(Infinity, iterable);
}