'use strict'; /* Expose. */ module.exports = visit; var is = require('unist-util-is'); /* Visit. */ function visit(tree, test, visitor, reverse) { if (typeof test === 'function' && typeof visitor !== 'function') { reverse = visitor; visitor = test; test = null; } one(tree); /* Visit a single node. */ function one(node, index, parent) { var result; index = index || (parent ? 0 : null); if (!test || node.type === test || is(test, node, index, parent || null)) { result = visitor(node, index, parent || null); } if (node.children && result !== false) { return all(node.children, node); } return result; } /* Visit children in `parent`. */ function all(children, parent) { var step = reverse ? -1 : 1; var max = children.length; var min = -1; var index = (reverse ? max : min) + step; var child; while (index > min && index < max) { child = children[index]; if (child && one(child, index, parent) === false) { return false; } index += step; } return true; } }