MCPcopy Create free account
hub / github.com/R-js/libRmath.js / recursiveDescend

Function recursiveDescend

scripts/nodeWalker.ts:18–44  ·  view source on GitHub ↗
(startNode: GeneralValue, selector: (node: GeneralValue) => GeneralValue | undefined, collector: GeneralValue[] = [])

Source from the content-addressed store, hash-verified

16}
17
18export function recursiveDescend(startNode: GeneralValue, selector: (node: GeneralValue) => GeneralValue | undefined, collector: GeneralValue[] = []) {
19 // special treatment if it is an array
20 if (Array.isArray(startNode) && startNode.length > 0) {
21 for (const node of startNode) {
22 recursiveDescend(node, selector, collector);
23 }
24 return collector;
25 }
26 // it is an object we are interested in?
27 if (selector(startNode)) {
28 if (collector.indexOf(startNode) === -1) {
29 collector.push(startNode);
30 }
31 else {
32 return collector; // terminate, avoid endless looping because of circular reference
33 }
34 }
35 // recursiveDescend if possible
36 if (!isScalar(startNode)) {
37 for (const value of Object.values(startNode)) {
38 recursiveDescend(value, selector, collector);
39 }
40 return collector;
41 }
42 // its a scalar
43 // do nothing
44}

Callers 1

createCompilerFunction · 0.90

Calls 1

isScalarFunction · 0.85

Tested by

no test coverage detected