@loken/hierarchies
Version:
Library for working with hierarchies of identifiers and identifiable objects.
46 lines (38 loc) • 1.16 kB
text/typescript
import { SequenceSignal } from './sequence-signal.js';
import type { NextElement, SequenceTraversal, SignalElement } from './sequence.types.js';
/**
* Generate a sequence of elements starting with the `first` element and traversing according to the options.
*/
export const traverseSequence = <TEl>(options: SequenceTraversal<TEl>): Generator<TEl, void, undefined> => {
if (options.signal !== undefined)
return traverseSignalSequence(options);
else
return traverseFullSequence(options);
};
/** @internalexport */
export function* traverseSignalSequence<TEl>(options: {
first: TEl | undefined;
signal: SignalElement<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())
yield res[0];
signal.cleanup();
res = signal.tryGetNext();
}
};
/** @internalexport */
export function* traverseFullSequence<TEl>(options: {
first: TEl | undefined;
next: NextElement<TEl>;
}) {
let current = options.first;
while (current !== undefined) {
yield current;
current = options.next(current);
}
};