UNPKG

mathjs

Version:

Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser and offers an integrated solution to work with numbers, big numbers, complex numbers, units, and matrices.

94 lines (84 loc) 2.48 kB
module.exports = function (math) { var string = require('../util/string'); /** * @constructor Selector * Wrap any value in a Selector, allowing to perform chained operations on * the value. * * All methods available in the math.js library can be called upon the selector, * and then will be evaluated with the value itself as first argument. * The selector can be closed by executing selector.done(), which will return * the final value. * * The Selector has a number of special functions: * - done() Finalize the chained operation and return the * selectors value. * - valueOf() The same as done() * - toString() Returns a string representation of the selectors value. * * @param {*} [value] */ function Selector (value) { if (!(this instanceof Selector)) { throw new SyntaxError('Constructor must be called with the new operator'); } if (value instanceof Selector) { this.value = value.value; } else { this.value = value; } } /** * Close the selector. Returns the final value. * Does the same as method valueOf() * @returns {*} value */ Selector.prototype.done = function () { return this.value; }; /** * Close the selector. Returns the final value. * Does the same as method done() * @returns {*} value */ Selector.prototype.valueOf = function () { return this.value; }; /** * Get a string representation of the value in the selector * @returns {String} */ Selector.prototype.toString = function () { return string.format(this.value); }; /** * Create a proxy method for the selector * @param {String} name * @param {*} value The value or function to be proxied */ function createProxy(name, value) { var slice = Array.prototype.slice; if (typeof value === 'function') { // a function Selector.prototype[name] = function () { var args = [this.value].concat(slice.call(arguments, 0)); return new Selector(value.apply(this, args)); } } else { // a constant Selector.prototype[name] = new Selector(value); } } Selector.createProxy = createProxy; /** * initialise the Chain prototype with all functions and constants in math */ for (var prop in math) { if (math.hasOwnProperty(prop)) { createProxy(prop, math[prop]); } } return Selector; };