66 lines
1.8 KiB
JavaScript
66 lines
1.8 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.createLeafCount = void 0;
|
||
|
|
||
|
var _factory = require("../../utils/factory.js");
|
||
|
|
||
|
var name = 'leafCount';
|
||
|
var dependencies = ['parse', 'typed'];
|
||
|
var createLeafCount = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
||
|
var parse = _ref.parse,
|
||
|
typed = _ref.typed;
|
||
|
|
||
|
// This does the real work, but we don't have to recurse through
|
||
|
// a typed call if we separate it out
|
||
|
function countLeaves(node) {
|
||
|
var count = 0;
|
||
|
node.forEach(function (n) {
|
||
|
count += countLeaves(n);
|
||
|
});
|
||
|
return count || 1;
|
||
|
}
|
||
|
/**
|
||
|
* Gives the number of "leaf nodes" in the parse tree of the given expression
|
||
|
* A leaf node is one that has no subexpressions, essentially either a
|
||
|
* symbol or a constant. Note that `5!` has just one leaf, the '5'; the
|
||
|
* unary factorial operator does not add a leaf. On the other hand,
|
||
|
* function symbols do add leaves, so `sin(x)/cos(x)` has four leaves.
|
||
|
*
|
||
|
* The `simplify()` function should generally not increase the `leafCount()`
|
||
|
* of an expression, although currently there is no guarantee that it never
|
||
|
* does so. In many cases, `simplify()` reduces the leaf count.
|
||
|
*
|
||
|
* Syntax:
|
||
|
*
|
||
|
* leafCount(expr)
|
||
|
*
|
||
|
* Examples:
|
||
|
*
|
||
|
* math.leafCount('x') // 1
|
||
|
* math.leafCount(math.parse('a*d-b*c')) // 4
|
||
|
* math.leafCount('[a,b;c,d][0,1]') // 6
|
||
|
*
|
||
|
* See also:
|
||
|
*
|
||
|
* simplify
|
||
|
*
|
||
|
* @param {Node|string} expr The expression to count the leaves of
|
||
|
*
|
||
|
* @return {number} The number of leaves of `expr`
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
return typed(name, {
|
||
|
string: function string(expr) {
|
||
|
return this(parse(expr));
|
||
|
},
|
||
|
Node: function Node(expr) {
|
||
|
return countLeaves(expr);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
exports.createLeafCount = createLeafCount;
|