traverseGenerator - Add option to skip traversing siblings for first node

Which is usually expected, when we think of it as a recursive traversal
This commit is contained in:
2019-09-11 16:18:40 +05:30
parent aced1be6e8
commit 0bc8c1af99
+15 -5
View File
@@ -63,11 +63,15 @@ import { FiberNode } from "./mocked-types";
function* traverseGenerator( function* traverseGenerator(
node: FiberNode, node: FiberNode,
{ {
order = ["self", "child", "sibling"] order = ["self", "child", "sibling"],
}: { order?: Array<"self" | "child" | "sibling"> } = {} skipSiblingForStartNode = true
}: {
order?: Array<"self" | "child" | "sibling">;
skipSiblingForStartNode?: boolean;
} = {}
): IterableIterator<FiberNode> { ): IterableIterator<FiberNode> {
let skipChild = false, let skipChild = false,
skipSibling = false; skipSibling = skipSiblingForStartNode;
function* traverseSelf() { function* traverseSelf() {
const controlInput: const controlInput:
@@ -82,14 +86,20 @@ function* traverseGenerator(
function* traverseChild() { function* traverseChild() {
if (!skipChild && node.child !== null) { if (!skipChild && node.child !== null) {
const nextNode = node.child; const nextNode = node.child;
yield* traverseGenerator(nextNode, { order }); yield* traverseGenerator(nextNode, {
order,
skipSiblingForStartNode: false
});
} }
} }
function* traverseSibling() { function* traverseSibling() {
if (!skipSibling && node.sibling !== null) { if (!skipSibling && node.sibling !== null) {
const nextNode = node.sibling; const nextNode = node.sibling;
yield* traverseGenerator(nextNode, { order }); yield* traverseGenerator(nextNode, {
order,
skipSiblingForStartNode: false
});
} }
} }