mirror of
https://github.com/bendtherules/react-fiber-traverse.git
synced 2026-08-19 00:33:38 +00:00
Allow customised order in traverseGenerator
This commit is contained in:
+40
-11
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user