import { isIterator } from './isIterator'; import { isPromise } from './isPromise'; import type { MaybePromise } from './MaybePromise'; type IteratorLike = Iterable | Iterator; type AsyncIteratorLike = AsyncIterable | AsyncIterator | AsyncIterableIterator | IteratorLike; export type { AsyncIteratorLike }; export function nextOfAsyncIterator( it: MaybePromise | Iterable | AsyncIterator | Iterator | T>, ): MaybePromise<[value: T, done?: boolean]> { if (isPromise(it)) { return it.then((v) => nextOfAsyncIterator(v)); } if (isIterator(it)) { let next = it.next(); if (isPromise(next)) { return next.then((v) => [v.value, v.done]); } return [next.value, next.done]; } if (it && typeof it === 'object') { if (Symbol.iterator in it) { return nextOfAsyncIterator(it[Symbol.iterator]()); } if (Symbol.asyncIterator in it) { return nextOfAsyncIterator(it[Symbol.asyncIterator]()); } } return [it]; }