UNPKG

@loken/hierarchies

Version:

Library for working with hierarchies of identifiers and identifiable objects.

53 lines (42 loc) 1.24 kB
import { SequenceSignal } from './sequence-signal.ts'; import type { NextElement, SequenceTraversal, SignalElement } from './sequence.types.ts'; /** * Flatten a sequence of elements starting with the `first` element and traversing according to the options. */ export const flattenSequence = <TEl>(options: SequenceTraversal<TEl>) => { if (options.signal !== undefined) return flattenSignalSequence(options); else return flattenFullSequence(options); }; /** @internalexport */ export const flattenSignalSequence = <TEl>(options: { first: TEl | undefined; signal: SignalElement<TEl>; }): TEl[] => { const result: TEl[] = []; const signal = new SequenceSignal<TEl>(options); const signalFn = options.signal; let res = signal.tryGetNext(); while (res[1]) { signalFn(res[0], signal); if (signal.shouldYield()) result.push(res[0]); signal.cleanup(); res = signal.tryGetNext(); } return result; }; /** @internalexport */ export const flattenFullSequence = <TEl>(options: { first: TEl | undefined; next: NextElement<TEl>; }): TEl[] => { const result: TEl[] = []; let current = options.first; while (current !== undefined) { result.push(current); current = options.next(current); } return result; };