deep-iterator
Version:
Deep iteration of any object or iterable collection.
36 lines (33 loc) • 1.12 kB
JavaScript
import * as search from './search';
import RootNode from './root-node';
import makeSeen from './seen';
export default function* deepIterator(rootElement, options = {}) {
const config = {
onlyLeaves: false,
circularReference: 'leaf',
search: 'dfsPreOrder',
iterateOverObject: true,
skipIteration: () => false
};
if (options.onlyLeaves !== undefined) {
config.onlyLeaves = options.onlyLeaves;
}
if (options.circularReference !== undefined) {
config.circularReference = options.circularReference;
}
if (options.iterateOverObject !== undefined) {
config.iterateOverObject = options.iterateOverObject;
}
if (options.skipIteration !== undefined) {
config.skipIteration = options.skipIteration;
}
if (options.search !== undefined) {
if (!(options.search in search)) {
throw new Error(`The search algorithm ${options.search} is incorrect.`);
}
config.search = options.search;
}
const node = new RootNode(rootElement, config);
const seen = makeSeen(config.circularReference);
yield* search[config.search](node, config.onlyLeaves, seen);
}