Skip to content
forked from elastic/tinymath

A tiny arithmetic expression evaluator with pluggable functions

License

Notifications You must be signed in to change notification settings

wdzysm/tinymath

 
 

Repository files navigation

⚠️ Deprecated ⚠️

To our knowledge the tinymatch module was only used by kibana and as such we've moved it into the Kibana repo to make it easier to manage for us. We no longer plan to update this repository or the packages on npm.

Tinymath

Apache License Build Status npm

Tinymath is a tiny arithmetic and function evaluator for simple numbers and arrays. Named properties can be accessed from an optional scope parameter and new functions can be added without rebuilding. Enjoy.

NOTE: Tinymath requires an ES6 or newer environment. You can use it with your build system of choice to run in older environments.

See Function Documentation for details on built-in functions available in Tinymath.

import { evaluate } from tinymath

// Simple math
evaluate('10 + 20'); // 30
evaluate('round(3.141592)') // 3

// Named properties
evaluate('foo + 20', {foo: 5}); // 25

// Arrays
evaluate('bar + 20', {bar: [1, 2, 3]}); // [21, 22, 23]
evaluate('bar + baz', {bar: [1, 2, 3], baz: [4, 5, 6]}); // [5, 7, 9]
evaluate('multiply(bar, baz) / 10', {bar: [1, 2, 3], baz: [4, 5, 6]}); // [0.4, 1, 1.8]

Adding Functions

Functions can be injected, and built in function overwritten, via the 3rd argument to evaluate:

import { evaluate } from tinymath

evaluate('plustwo(foo)', {foo: 5}, {
    plustwo: function(a) {
        return a + 2;
    }
}); // 7

Parsing

You can get to the parsed AST by importing parse

import { parse } from tinymath

parse('1 + random()')
/*
{
   "name": "add",
   "args": [
      1,
      {
         "name": "random",
         "args": []
      }
   ]
}
*/

Notes

  • Floating point operations have the normal Javascript limitations

About

A tiny arithmetic expression evaluator with pluggable functions

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 100.0%