Allow customised order in traverseGenerator

This commit is contained in:
2019-08-02 00:56:21 +05:30
parent 3a7bf374bd
commit 7938a4ab2c
+40 -11
View File
@@ -13,21 +13,50 @@ function traverse(node: FiberNode, fn: (node: FiberNode) => any) {
} }
function* traverseGenerator( function* traverseGenerator(
node: FiberNode node: FiberNode,
// { {
// order = "pre" order = ["self", "child", "sibling"]
// }: { order: "in" | "pre" | "post" } }: { order?: ["self", "child", "sibling"] } = {}
): IterableIterator<FiberNode> { ): IterableIterator<FiberNode> {
const { skipChild, skipSibling } = yield node; let skipChild = false,
skipSibling = false;
if (!skipChild && node.child !== null) { function* traverseSelf() {
const nextNode = node.child; const controlInput:
yield* traverseGenerator(nextNode); | { skipChild: boolean; skipSibling: boolean }
| undefined = yield node;
if (controlInput !== undefined) {
({ skipChild = skipChild, skipSibling = skipSibling } = controlInput);
}
} }
if (!skipSibling && node.sibling !== null) { function* traverseChild() {
const nextNode = node.sibling; if (!skipChild && node.child !== null) {
yield* traverseGenerator(nextNode); const nextNode = node.child;
yield* traverseGenerator(nextNode, { order });
}
}
function* traverseSibling() {
if (!skipSibling && node.sibling !== null) {
const nextNode = node.sibling;
yield* traverseGenerator(nextNode, { order });
}
}
const traverseMap = {
self: traverseSelf,
child: traverseChild,
sibling: traverseSibling
};
// For each item mentioned in order, find generator functions to run
const orderedGenerators = order.map((step) => traverseMap[step]).filter(tmp => tmp!==undefined);
// Now run each generator till end
for (const eachGen of orderedGenerators) {
yield* eachGen();
} }
} }