'use strict'
function factory (type, config, load, typed) {
const Node = load(require('./Node'))
/**
* @constructor ParenthesisNode
* @extends {Node}
* A parenthesis node describes manual parenthesis from the user input
* @param {Node} content
* @extends {Node}
*/
function ParenthesisNode (content) {
if (!(this instanceof ParenthesisNode)) {
throw new SyntaxError('Constructor must be called with the new operator')
}
// validate input
if (!type.isNode(content)) {
throw new TypeError('Node expected for parameter "content"')
}
this.content = content
}
ParenthesisNode.prototype = new Node()
ParenthesisNode.prototype.type = 'ParenthesisNode'
ParenthesisNode.prototype.isParenthesisNode = true
/**
* Compile a node into a JavaScript function.
* This basically pre-calculates as much as possible and only leaves open
* calculations which depend on a dynamic scope with variables.
* @param {Object} math Math.js namespace with functions and constants.
* @param {Object} argNames An object with argument names as key and `true`
* as value. Used in the SymbolNode to optimize
* for arguments from user assigned functions
* (see FunctionAssignmentNode) or special symbols
* like `end` (see IndexNode).
* @return {function} Returns a function which can be called like:
* evalNode(scope: Object, args: Object, context: *)
*/
ParenthesisNode.prototype._compile = function (math, argNames) {
return this.content._compile(math, argNames)
}
/**
* Get the content of the current Node.
* @return {Node} content
* @override
**/
ParenthesisNode.prototype.getContent = function () {
return this.content.getContent()
}
/**
* Execute a callback for each of the child nodes of this node
* @param {function(child: Node, path: string, parent: Node)} callback
*/
ParenthesisNode.prototype.forEach = function (callback) {
callback(this.content, 'content', this)
}
/**
* Create a new ParenthesisNode having it's childs be the results of calling
* the provided callback function for each of the childs of the original node.
* @param {function(child: Node, path: string, parent: Node) : Node} callback
* @returns {ParenthesisNode} Returns a clone of the node
*/
ParenthesisNode.prototype.map = function (callback) {
const content = callback(this.content, 'content', this)
return new ParenthesisNode(content)
}
/**
* Create a clone of this node, a shallow copy
* @return {ParenthesisNode}
*/
ParenthesisNode.prototype.clone = function () {
return new ParenthesisNode(this.content)
}
/**
* Get string representation
* @param {Object} options
* @return {string} str
* @override
*/
ParenthesisNode.prototype._toString = function (options) {
if ((!options) || (options && !options.parenthesis) || (options && options.parenthesis === 'keep')) {
return '(' + this.content.toString(options) + ')'
}
return this.content.toString(options)
}
/**
* Get a JSON representation of the node
* @returns {Object}
*/
ParenthesisNode.prototype.toJSON = function () {
return {
mathjs: 'ParenthesisNode',
content: this.content
}
}
/**
* Instantiate an ParenthesisNode from its JSON representation
* @param {Object} json An object structured like
* `{"mathjs": "ParenthesisNode", "content": ...}`,
* where mathjs is optional
* @returns {ParenthesisNode}
*/
ParenthesisNode.fromJSON = function (json) {
return new ParenthesisNode(json.content)
}
/**
* Get HTML representation
* @param {Object} options
* @return {string} str
* @override
*/
ParenthesisNode.prototype.toHTML = function (options) {
if ((!options) || (options && !options.parenthesis) || (options && options.parenthesis === 'keep')) {
return '(' + this.content.toHTML(options) + ')'
}
return this.content.toHTML(options)
}
/**
* Get LaTeX representation
* @param {Object} options
* @return {string} str
* @override
*/
ParenthesisNode.prototype._toTex = function (options) {
if ((!options) || (options && !options.parenthesis) || (options && options.parenthesis === 'keep')) {
return `\\left(${this.content.toTex(options)}\\right)`
}
return this.content.toTex(options)
}
return ParenthesisNode
}
exports.name = 'ParenthesisNode'
exports.path = 'expression.node'
exports.factory = factory