import { Awaitable } from 'justypes' import { isAsyncIterable } from '@src/is-async-iterable.js' export function dropUntilAsync( iterable: Iterable | AsyncIterable , predicate: (element: Awaited, index: number) => Awaitable ): AsyncIterableIterator> { if (isAsyncIterable(iterable)) { return dropUntilAsyncIterable(iterable, predicate) } else { return dropUntilIterable(iterable, predicate) } } async function* dropUntilAsyncIterable( iterable: AsyncIterable , predicate: (element: Awaited, index: number) => Awaitable ): AsyncIterableIterator> { const iterator = iterable[Symbol.asyncIterator]() let done: boolean | undefined try { let index = 0 let value: T while ({ value, done } = await iterator.next(), !done) { if (await predicate(await value, index++)) break } while (!done) { yield value ;({ value, done } = await iterator.next()) } } finally { if (!done) await iterator.return?.() } } async function* dropUntilIterable( iterable: Iterable , predicate: (element: Awaited, index: number) => Awaitable ): AsyncIterableIterator> { const iterator = iterable[Symbol.iterator]() let done: boolean | undefined try { let index = 0 let value: T while ({ value, done } = iterator.next(), !done) { if (await predicate(await value, index++)) break } while (!done) { yield value ;({ value, done } = iterator.next()) } } finally { if (!done) iterator.return?.() } }