import { isntChar } from 'extra-utils' import { isIterable } from '@src/is-iterable.js' export function flattenBy( iterable: Iterable , predicate: (element: unknown, level: number) => unknown ): IterableIterator { return flatten(iterable, predicate, 1) } function* flatten( iterable: Iterable , predicate: (element: unknown, level: number) => unknown , level: number ): IterableIterator { for (const element of iterable) { if (isFiniteIterable(element) && predicate(element, level)) { yield* flatten(element, predicate, level + 1) } else { yield element as T } } } function isFiniteIterable(val: unknown): val is Iterable { return isIterable(val) && isntChar(val) }