/
traverse.ts
42 lines (38 loc) · 1.03 KB
/
traverse.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import type { MachinatNode } from '../types';
import { isElement, isFragmentType, isEmpty } from '../utils/isX';
import type { TraverseNodeCallback } from './types';
const ITER_SEPARATOR = ':';
const traverse = <Context>(
children: MachinatNode,
prefix: string,
context: Context,
callback: TraverseNodeCallback<Context>
): number => {
let count = 0;
if (Array.isArray(children)) {
for (let i = 0; i < children.length; i += 1) {
const child = children[i];
count += traverse(child, prefix + ITER_SEPARATOR + i, context, callback);
}
} else if (isElement(children) && isFragmentType(children)) {
if (children.props) {
count += traverse(
children.props.children,
prefix + ITER_SEPARATOR,
context,
callback
);
}
} else if (!isEmpty(children)) {
callback(
children,
prefix.charAt(prefix.length - 1) === ':'
? `${prefix + ITER_SEPARATOR}0`
: prefix,
context
);
return 1;
}
return count;
};
export default traverse;