fontoxpath
Version:
A minimalistic XPath 3.1 engine in JavaScript
29 lines (27 loc) • 871 B
JavaScript
import createChildGenerator from './createChildGenerator';
import { DONE_TOKEN, ready } from './iterators';
import createNodeValue from '../dataTypes/createNodeValue';
export default function createDescendantGenerator (domFacade, node) {
/**
* @type {!Array<!Iterator<!Node>>}
*/
const descendantIteratorStack = [createChildGenerator(domFacade, node)];
return {
next: () => {
if (!descendantIteratorStack.length) {
return DONE_TOKEN;
}
let value = descendantIteratorStack[0].next();
while (value.done) {
descendantIteratorStack.shift();
if (!descendantIteratorStack.length) {
return DONE_TOKEN;
}
value = descendantIteratorStack[0].next();
}
// Iterator over these children next
descendantIteratorStack.unshift(createChildGenerator(domFacade, value.value));
return ready(createNodeValue(value.value));
}
};
}