Remainder
Remainder
is a curried constructor used to create a JS/JSON configuration
object that represents a remainder operation.
The first parameter to Remainder
determines the datatype of the
return value of the remainder operation: Number
(float) or Integer
.
The second parameter is the dividend
; the third is the divisor
. Both are operations, which must eventually evaluate to
values. The divisor will eventually be divided into the dividend to produce
the modulus (result).
The dividend and divisor operations (multiply, subtract, etc.) may be nested to any depth, but the bottom (leaf) nodes must return values. Values are injected with injectors.
Because Remainder
is curried, we can simplify our code by partial
application, for example, const Rem = Remainder("Integer")
.
This returns a function that takes the dividend and divisor operations and
returns a Remainder configuration for working with integers.
See below for an example.
The remainder
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] }
.
composeOperators
works by recursing down through the
operation
object, calling the correct operator function based on
the tag
(e.g., "Remainder"), 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 Remainder
operation object. We call the calculate
function and pass it an
(optional) argument to run our operation(s) and calculate the modulus.
Here our dividend operation is a nested multiplication operation of three
constants (using Constant
).
Our divisor 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.
Also, play around with positive and negative dividends and divisors, then compare
with
Modulo
.