Adds type constants zero and one, and allows you to obtain them
directly from a type object. This facility creates a behavior
with a parametric type: the type of `math.zero(T)` where `T` is a
Type object (i.e., has type `TypeOfTypes`) depends not just on that
type TypeOfTypes, but instead on the _value_ of the argument `T`. Since
nanomath is not (yet?) equipped to handle typing such a method, we just
set its return type to a new constant NotAType that (hopefully) does not
work with the rest of the type system. Also allows you to compute `zero`
and `one` from an example value, rather than from the type object itself.
Adds utility function `isZero` to test if a value is zero.
As usual so far, the additions uncovered some remaining bugs, which
this PR fixes. For example, there was a problem in that resolution of
the `one` method was failing because the `Any` pattern was blocking
matching of the `TypeOfTypes` pattern. Although we may eventually need to
sort the patterns for a given method to maintain a reasonable matching
order, for now the solution was just to move the two patterns into the
same source file and explicitly order them. (With the way onType and
Implementations are currently implemented, the proper ordering is more
general to more specific, i.e. later implementations supersede earlier
ones.
Adds many new tests, as always.
Establishes a global config object for a TypeDispatcher instance, so far
with just properties representing comparison tolerances. Begins a
"relational" group of functions with basic approximate equality, and
an initial primitive ordering comparison. Ensures that methods that
depend on properties of `config` will be properly updated when those
properties change.
This PR adds a boolean section, as well as an isNaN predicate on numbers. In a TypeDispatcher, when BooleanT is present, isNaN returns a BooleanT. However, in a numbers-only TypeDispatcher, it returns 1 or 0 instead. Moreover, when booleans are subsequently added to a numbers-only instance, isNaN properly reconfigures itself to return BooleanT.
No predicates that depend on approximate equality testing or a configuration object are implemented in this PR.
This PR also implements type matching and dispatching with implicit conversions, and adds an implicit conversion from BooleanT to NumberT.
Reviewed-on: #17
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
We use [mocha](https://mochajs.org/) as the test framework, as it is
the tool used by mathjs and we would like to make tests as similar
as possible. However, to tighten the linkage between source code and
tests, we adopt a somewhat different file organization: unit tests
for a given source file `blah/foo.js` are in `blah/__test__/foo.spec.js`.
To run all unit tests, execute the script `pnpm test`.
Resolves#3.
Reviewed-on: glen/nanomath#5
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
Resolves#1.
A hand test showed this code can add two plus two, always a major milestone. So we will skip review on this PR since there is currently no testing framework, and proceed immediately to addressing #3.
Reviewed-on: glen/nanomath#4
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>