formula

GitHub release (latest by date including pre-releases) GitHub (Pre-)Release Date GitHub last commit GitHub

formula is a parser and evaluator for math functions and formulae. It lets you declare variables which function as mutable inputs for expressions that can be re-computed as the inputs are changed.

Documentation

See documentation.

Usage

TypeScript

Install by typing

npm install @vinctus/formula

The typings are built-in. Use the following import in your code:

import { Formulae } from '@vinctus/formula'

Scala

Include the following in your project/plugins.sbt:

addSbtPlugin("com.codecommit" % "sbt-github-packages" % "0.5.3")

Include the following in your build.sbt:

resolvers += Resolver.githubPackages("vinctustech")

libraryDependencies += "io.github.vinctustech" %%% "formula" % "0.0.34"

Use the following import in your code:

import io.github.vinctustech.formula.Formulae

The obligatory “Hello World” example

Although formula is mainly for doing math, it can handle strings and also boolean values in a limited way. For example, you might want a certain text to vary depending on some condition. The following is a vanilla React 18 example.

import React, { FC, useState } from 'react'
import { createRoot } from 'react-dom/client'
import { Formulae } from '@vinctus/formula'

const f = new Formulae(`
    const positive = 'Hello World!'
    const negative = 'Goodbye World!'
    const min = 0
    const max = 100
    const initial = min
    
    var input = initial
    
    def radians = (input - min)/max*pi
    def output = cos(radians)
    def message = output >= 0 ? positive : negative
    `)

export const App: FC = () => {
  const [value, setValue] = useState<number>(f.get('initial'))

  f.set('input', () => value)

  return (
    <div style=>
      <h3>{f.formula('message')}</h3>
      <input
        type="range"
        min={f.get('min')}
        max={f.get('max')}
        value={value}
        onChange={(e) => {
          setValue(Number(e.target.value))
        }}
      />
      <p>
        <code>
          cos({f.get('radians')}) = {f.formula('output')}
        </code>
      </p>
    </div>
  )
}

createRoot(document.getElementById('app')!).render(<App />)

License

ISC

Syntax

formulae
declaration
expression
disjunctive
conjunctive
relational
additive
multiplicative
prefix
exponentiation
postfix
applicative
primary

Built-in Functions

abs(x)
absolute value of x
acos(x)
inverse cosine (in radians) of x
asin(x)
inverse sin (in radians) of x
atan(x)
inverse tangent (in radians) of x
atan2(x,y)
counterclockwise angle (in radians) between the positive x-axis and the point (x, y)
ceil(x)
smallest integer greater than or equal to x
cos(x)
cosine of x
exp(x)
e raised to the power of x
floor(x)
largest integer less than or equal to x
log(x)
base 10 logarithm of x
ln(x)
natural logarithm of x
pow(x,y)
x raised to the power of y
round(x)
nearest integer to x
sign(x)
sign of x
sin(x)
sine of x
sqrt(x)
square root of x
tan(x)
tangent of x

Built-in Constants

e
ℇ is the base of the natural logarithm
pi
π is the ratio of a circle's circumference to its diameter