Power
Power is a curried constructor used to create a JS/JSON configuration
object that represents an exponential operation.
const Power =
(datatype = "Number") =>
base =>
exponent => ({
tag: "Power",
base,
exponent,
datatype,
})
export default Power
The first parameter to Power determines the datatype of the return
value of the division operation: Number (float) or Integer.
The second parameter is the base; the third is the exponent. Both are operations, which must eventually evaluate to
values. The base will be raised to the exponent to produce the result.
The base and exponent operations (multiply, subtract, etc.) may be nested to any depth, but the bottom (leaf) nodes must return values. Values are injected with injectors.
Because Power is curried, we can simplify our code by partial application,
for example, const Pow = Power("Integer"). This returns a
function that takes the base and exponent operations and returns a Power
configuration for working with integers.
See below for an example.
The power function
We pass our configuration object to composeOperators, which composes the operations and returns a single function. This
function takes an optional argument and returns the result of the
calculation as a Right, e.g., { right: 42 }, or a Left with an array of Error objects,
{ left: [Error] }.
const power = operation => (arg? => Either<Array<Error>, result>)
composeOperators works by recursing down through the
operation object, calling the correct operator function based on
the tag (e.g., "Power"), and composing the functions returned.
composeOperators then returns this composed function. See composeOperators for a more detailed explanation.
The injectors are not called until this composed calculate function
is run. Hence, evaluation is lazy: the values are not injected until the last
moment.
See the injectors for a complete list of how values may be injected. See the list of operators for the full range of available mathematical operations.
Example
We use composeOperators to create a calculate function, passing it our Power operation object. We call the calculate function and pass it an
(optional) argument to run our operation(s) and calculate the quotient.
Here our base operation is a nested multiplication operation of two
constants (using Constant).
Our exponent is also an operation that returns the argument passed to the
composed function (using FromArgument).
Try leaving one of the numbers undefined to see an Error returned.