feat: Allow self-reference in implementations (#4)
This PR also uses such self-reference to define negate and add for Complex numbers in a way that is independent of component types. Also adds a bigint type and verifies that pocomath will then handle Gaussian integers "for free". Ensures that if one function is invalidated, then any that depend on it will be. Co-authored-by: Glen Whitney <glen@studioinfinity.org> Reviewed-on: #4
This commit is contained in:
parent
77b04fbdbb
commit
84a8b9d5c4
13 changed files with 132 additions and 21 deletions
|
@ -29,5 +29,27 @@ describe('The default full pocomath instance "math"', () => {
|
|||
assert.deepStrictEqual(math.complex(2,3), norm13)
|
||||
assert.deepStrictEqual(math.complex(2), math.complex(2,0))
|
||||
assert.deepStrictEqual(math.add(2, math.complex(0,3)), norm13)
|
||||
assert.deepStrictEqual(
|
||||
math.subtract(16, math.add(3, math.complex(0,4), 2)),
|
||||
math.complex(11, -4))
|
||||
assert.strictEqual(math.negate(math.complex(3, 8)).im, -8)
|
||||
})
|
||||
|
||||
it('handles bigints', () => {
|
||||
assert.strictEqual(math.negate(5n), -5n)
|
||||
assert.strictEqual(math.subtract(12n, 5n), 7n)
|
||||
assert.strictEqual(math.add(15n, 25n, 35n), 75n)
|
||||
assert.strictEqual(math.add(10n, math.negate(3n)), 7n)
|
||||
})
|
||||
|
||||
it('handles Gaussian integers', () => {
|
||||
const norm13n = {re: 2n, im: 3n}
|
||||
assert.deepStrictEqual(math.complex(2n,3n), norm13n)
|
||||
assert.deepStrictEqual(math.complex(2n), math.complex(2n, 0n))
|
||||
assert.deepStrictEqual(math.add(2n, math.complex(0n, 3n)), norm13n)
|
||||
assert.deepStrictEqual(
|
||||
math.subtract(16n, math.add(3n, math.complex(0n,4n), 2n)),
|
||||
math.complex(11n, -4n))
|
||||
assert.strictEqual(math.negate(math.complex(3n, 8n)).im, -8n)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -1,14 +1,19 @@
|
|||
import assert from 'assert'
|
||||
import math from '../pocomath.mjs'
|
||||
import typed from 'typed-function'
|
||||
import PocomathInstance from '../PocomathInstance.mjs'
|
||||
import * as numbers from '../number/all.mjs'
|
||||
import * as complex from '../complex/all.mjs'
|
||||
import * as complexAdd from '../complex/add.mjs'
|
||||
import * as complexNegate from '../complex/negate.mjs'
|
||||
|
||||
const bw = new PocomathInstance('backwards')
|
||||
describe('A custom instance', () => {
|
||||
it("works when partially assembled", () => {
|
||||
bw.install(complex)
|
||||
assert.deepStrictEqual(bw.add(2, bw.complex(0, 3)), {re: 2, im: 3})
|
||||
assert.deepStrictEqual(bw.negate(2), bw.complex(-2,-0))
|
||||
assert.deepStrictEqual(bw.subtract(2, bw.complex(0, 3)), {re: 2, im: -3})
|
||||
})
|
||||
|
||||
it("can be assembled in any order", () => {
|
||||
|
@ -17,5 +22,20 @@ describe('A custom instance', () => {
|
|||
assert.strictEqual(bw.subtract(16, bw.add(3,4,2)), 7)
|
||||
assert.strictEqual(bw.negate('8'), -8)
|
||||
assert.deepStrictEqual(bw.add(bw.complex(1,3), 1), {re: 2, im: 3})
|
||||
assert.deepStrictEqual(
|
||||
bw.subtract(16, bw.add(3, bw.complex(0,4), 2)),
|
||||
math.complex(11, -4)) // note both instances coexist
|
||||
assert.deepStrictEqual(bw.negate(math.complex(3, '8')).im, -8)
|
||||
})
|
||||
|
||||
it("can be assembled piecemeal", () => {
|
||||
const pm = new PocomathInstance('piecemeal')
|
||||
pm.install(numbers)
|
||||
assert.strictEqual(pm.subtract(5, 10), -5)
|
||||
pm.install(complexAdd)
|
||||
pm.install(complexNegate)
|
||||
// Should be enough to allow complex subtraction, as subtract is generic
|
||||
assert.deepStrictEqual(
|
||||
pm.subtract({re:5, im:0}, {re:10, im:1}), {re:-5, im: -1})
|
||||
})
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue