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