feat: Template operations #41

Merged
glen merged 10 commits from template_operations into main 2022-08-01 10:09:32 +00:00
2 changed files with 21 additions and 1 deletions
Showing only changes of commit 1076c3c727 - Show all commits

View File

@ -26,6 +26,7 @@ export default class PocomathInstance {
'install', 'install',
'installType', 'installType',
'name', 'name',
'typeOf',
'Types', 'Types',
'undefinedTypes' 'undefinedTypes'
]) ])
@ -153,7 +154,13 @@ export default class PocomathInstance {
if (type === 'any' || this._templateParam(type)) continue if (type === 'any' || this._templateParam(type)) continue
this.installType(type, spec) this.installType(type, spec)
} }
this._installFunctions(other._imps) const migrateImps = {}
for (const operator in other._imps) {
if (operator != 'typeOf') { // skip the builtin, we already have it
migrateImps[operator] = other._imps[operator]
}
}
this._installFunctions(migrateImps)
} }
/** /**
@ -305,6 +312,10 @@ export default class PocomathInstance {
// rebundle anything that uses the new type: // rebundle anything that uses the new type:
this._invalidateDependents(':' + type) this._invalidateDependents(':' + type)
// update the typeOf function
const imp = {}
imp[type] = {uses: new Set(), does: () => () => type}
this._installFunctions({typeOf: imp})
} }
/* Returns a list of all types that have been mentioned in the /* Returns a list of all types that have been mentioned in the

View File

@ -10,6 +10,15 @@ describe('The default full pocomath instance "math"', () => {
assert.strictEqual(undef.length, 0) assert.strictEqual(undef.length, 0)
}) })
it('has a built-in typeOf operator', () => {
assert.strictEqual(math.typeOf(42), 'NumInt')
assert.strictEqual(math.typeOf(-1.5), 'number')
assert.strictEqual(math.typeOf(-42n), 'bigint')
assert.strictEqual(math.typeOf(undefined), 'undefined')
assert.strictEqual(math.typeOf({re: 15n, im: -2n}), 'GaussianInteger')
assert.strictEqual(math.typeOf({re: 6.28, im: 2.72}), 'Complex')
})
it('can subtract numbers', () => { it('can subtract numbers', () => {
assert.strictEqual(math.subtract(12, 5), 7) assert.strictEqual(math.subtract(12, 5), 7)
}) })