From e5ec1083e37c1f311d342dcec4827ac8b29f40e0 Mon Sep 17 00:00:00 2001 From: Glen Whitney Date: Fri, 25 Mar 2022 02:46:49 -0700 Subject: [PATCH] feat: Selective loader that extends all/only existing number methods to complex Plus a test example where an instance is initialized to have only addition, and then that instance is extended to complex numbers, at which point it has number and complex addition but not negation or subtraction (at all). --- complex/extendByComplex.js | 23 +++++++++++++++++++++++ poortf.js | 4 ++++ test/custom.js | 22 ++++++++++++++++++++-- 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 complex/extendByComplex.js diff --git a/complex/extendByComplex.js b/complex/extendByComplex.js new file mode 100644 index 0000000..33ce590 --- /dev/null +++ b/complex/extendByComplex.js @@ -0,0 +1,23 @@ +import { isTF } from '../poortf.js' +import createComplex from './complex.js' + +/* Add all the complex methods for the number methods that are + * already in the instance: */ +export default async function extend(pmath) { + for (const item in pmath) { + if (isTF(pmath[item])) { + // might be a number method, try importing + const modulePath = `./${item}.js` + try { + const { default: create } = await import(modulePath) + create(pmath) + } catch (err) { + // Guess it wasn't a number method; no worries + } + } + } + createComplex(pmath) +} + + + diff --git a/poortf.js b/poortf.js index cd2f8f5..0b212d7 100644 --- a/poortf.js +++ b/poortf.js @@ -25,3 +25,7 @@ export default function poortf (name, imps) { return fn } + +export function isTF(x) { + return typeof x === 'function' && 'imps' in x && Array.isArray(x.imps) +} diff --git a/test/custom.js b/test/custom.js index 3ac22e9..c14e849 100644 --- a/test/custom.js +++ b/test/custom.js @@ -1,14 +1,17 @@ import assert from 'assert' import math from '../picomath.js' import picoInstance from '../picomathInstance.js' -import createNumber from '../number/all.js' +import createNumbers from '../number/all.js' +import createNumber from '../number/number.js' +import createAdd from '../number/add.js' import createComplex from '../complex/all.js' +import extendByComplex from '../complex/extendByComplex.js' describe('Custom instances', () => { it("doesn't matter what order you assemble", () => { const bw = picoInstance('backwards') createComplex(bw) - createNumber(bw) + createNumbers(bw) assert.strictEqual(bw.subtract(16, bw.add(3,4,2)), 7) assert.strictEqual(bw.negate(bw.number('8')), -8) @@ -18,4 +21,19 @@ describe('Custom instances', () => { math.complex(11, -4)) // note both instances coexist assert.deepStrictEqual(bw.negate(math.complex(3, '8')).im, -8) }) + + it("can selectively import in cute ways", async function () { + const cherry = picoInstance('cherry') + createNumber(cherry) + createAdd(cherry) + await extendByComplex(cherry) + // Now we have an instance that supports addition for number and complex + // and little else: + assert.strictEqual(cherry.add(3, 4, 2), 9) + assert.deepStrictEqual( + cherry.add(cherry.complex(3, 3), 4, cherry.complex(2, 2)), + math.complex(9,5)) + assert.strictEqual('subtract' in cherry, false) + assert.strictEqual('negate' in cherry, false) + }) })