Commit graph

21 commits

Author SHA1 Message Date
95d81d0338 feat: Implement Vector type (#28)
All checks were successful
/ test (push) Successful in 18s
The Vector type is simply a generic type for built-in JavaScript Arrays. The parameter type is the type of all of the entries of the Array. The Vector type also supports inhomogeneous arrays by using the special type `Unknown` as the argument type, but note that when computing with inhomogeneous arrays, method dispatch must be performed separately for every entry in a calculation, making all operations considerably slower than on homogeneous Vector instances.

Note also that arithmetic operations on nested Vectors, e.g. `Vector(Vector(NumberT))` are defined so as to interpret such entities as ordinary matrices, represented in row-major format (i.e., the component `Vector(NumberT)` items of such an entity are the _rows_ of the matrix.

Reviewed-on: #28
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-05-07 00:03:49 +00:00
0765ba7202 feat: Add return typing strategies and implement sqrt with them (#26)
All checks were successful
/ test (push) Successful in 17s
Resolves #25

Reviewed-on: #26
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-28 16:29:33 +00:00
aad62df8ac feat: methods on Complex (#24)
All checks were successful
/ test (push) Successful in 17s
Adds all of the pocomath functions on Complex that do not depend on any unimplemented types or config properties, except quotient and roundquotient, where the design is murky. To get this working, adds some additional features:
  * Allows conversions to generic types, with the matched type
    determined from the return value of the built convertor
  * Adds predicate-based type patterns
  * Adds conversion from any non-complex type T to Complex(T)
  * Adds check for recursive loops in resolve (a key/signature depending on itself)

Reviewed-on: #24
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-25 14:17:34 +00:00
0ff00ff8cb refactor: require match to merge any function (#23)
All checks were successful
/ test (push) Successful in 16s
Resolves #12.

Reviewed-on: #23
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-24 00:16:04 +00:00
236f46c0c0 refactor: change onType to match and take only one pattern and result (#22)
All checks were successful
/ test (push) Successful in 17s
Pursuant to #12. Besides changing the name of onType to match, and only allowing one pattern and result in `match()`,
this PR also arranges that in place of an onType with lots of alternating PATTERN, VALUE, PATTERN, VALUE arguments, one now exports an _array_ of `match(PATTERN, VALUE)` items.

Doesn't quite fully resolve #12, because there is still the question of whether `match(...)` can be left out for a behavior that literally matches anything (current behavior), or whether `match(Passthru, behavior)` should be required for such cases.

Reviewed-on: #22
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-22 05:01:21 +00:00
491e207fad feat: Add generic types and Complex numbers (#21)
All checks were successful
/ test (push) Successful in 18s
Generic types can be called with argument(s) to produce a new type object, and if all types supplied as arguments are concrete, then the result will be a concrete type. The test of a generic type must determine if the entity is an instance of any specialization of the type; and it must also have a `refine` method that takes such an instance and returns its fully-specialized concrete type. It must also have a method `specializesTo` that takes a concrete type and returns whether that concrete type is a specialization of this generic type.

This commit also defines a generic Complex number type, that can have any type as its Component type (including another Complex number, to create e.g. quaternions), and defines the conversion/constructor function `complex`.

Reviewed-on: #21
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-22 01:48:51 +00:00
70ce01d12b feat: config and approximate equality (#19)
All checks were successful
/ test (push) Successful in 17s
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.

Reviewed-on: #19
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-16 04:23:48 +00:00
27fa4b0193 feat: Introduce BooleanT and boolean functions (#17)
All checks were successful
/ test (push) Successful in 17s
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>
2025-04-13 16:29:51 +00:00
14011984a0 chore: fix wrong use-node-version (#16)
All checks were successful
/ test (push) Successful in 16s
Reviewed-on: #16
Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
Co-committed-by: Jos de Jong <wjosdejong@gmail.com>
2025-04-10 18:25:40 +00:00
de870f2adc chore: enforce using Node.js 22, fixing #13, ignore IDE files (#15)
All checks were successful
/ test (push) Successful in 10s
Reviewed-on: #15
Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
Co-committed-by: Jos de Jong <wjosdejong@gmail.com>
2025-04-10 18:16:38 +00:00
2f9071af1b doc: Fix git URL in README (#11)
All checks were successful
/ test (push) Successful in 11s
Reviewed-on: #11
Co-authored-by: glen <glen@studioinfinity.org>
Co-committed-by: glen <glen@studioinfinity.org>
2025-04-08 23:29:58 +00:00
05ff078529 feat: add a first generic method, square (#10)
All checks were successful
/ test (push) Successful in 10s
Resolves #2.

Reviewed-on: #10
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-08 23:25:01 +00:00
1a6890f458 test: Add tests for all existing functionality, correcting issues (#9)
All checks were successful
/ test (push) Successful in 11s
Resolves #8.

Reviewed-on: #9
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-08 22:42:53 +00:00
64f99c0f2d test: Run pnpm test in CI on all PRs and pushes to main (#7)
All checks were successful
/ test (push) Successful in 10s
Resolves #6.

Reviewed-on: #7
Co-authored-by: Glen Whitney <glen@studioinfinity.org>
Co-committed-by: Glen Whitney <glen@studioinfinity.org>
2025-04-08 02:38:28 +00:00
036def4a0c test: Set up a mocha test harness (#5)
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>
2025-04-07 16:18:46 +00:00
79c6d44fda feat: First working TypeDispatcher, supporting plain functions on Number (#4)
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>
2025-04-07 05:11:50 +00:00
69ef928b6e refactor: Switch to 'map-like object keyed by string and type vector' format
See https://code.studioinfinity.org/glen/nanomath/wiki/Item-Specifications.
  Also stubs out the TypeDispatcher, mocking the merge function, so we
  can see that all of the proper things will be added.

  Ready for initial implementation of the TypeDispatcher.
2025-04-02 11:22:53 -07:00
040ec377a1 feat: add type definition and other function categories for number 2025-03-30 20:00:07 -07:00
183a894868 feat: add arithmetic functions for number 2025-03-29 17:12:35 -07:00
fea0d3ac91 doc: Initialize pnpm and flesh out README 2025-03-29 16:39:29 -07:00
ab3c620cb9 Initial commit 2025-03-29 16:57:23 +00:00