feat: Generic numerical types
Inspired by https://github.com/josdejong/mathjs/discussions/2212 and https://github.com/josdejong/mathjs/issues/2585. Provides a simple adapter function `adapted` which takes a class implementing an arithmetical datatype and returns a PocomathInstance with a new type for that class, invoking the methods of the class in a standard way for the Pocomath/mathjs operations. (That instance can then be installed in another to add the new type to any instance you like, including the default one.) Uses this facility to bring fraction.js Fraction into Pocomath, and tests the resulting type. Currently the "standard" interface for an arithmetical type is heavily modeled after the design of fraction.js, but with experience with other 3rd-party types it could be streamlined to something pretty generic (and the Fraction adaptation could be patched to conform to the resulting "standard"). Or a proposal along the lines of https://github.com/josdejong/mathjs/discussions/2212 could be adopted, and a shim could be added to fraction.js to conform to **that** standard. Resolves #30.
This commit is contained in:
parent
199ffd2654
commit
bcbb24acd2
15 changed files with 278 additions and 19 deletions
|
@ -263,6 +263,7 @@ export default class PocomathInstance {
|
|||
* @param {{test: any => bool, // the predicate for the type
|
||||
* from: Record<string, <that type> => <type name>> // conversions
|
||||
* before: string[] // lower priority types
|
||||
* refines: string // The type this is a subtype of
|
||||
* }} specification
|
||||
*
|
||||
* The second parameter of this function specifies the structure of the
|
||||
|
@ -711,7 +712,12 @@ export default class PocomathInstance {
|
|||
if (argType === 'any') {
|
||||
throw TypeError(
|
||||
`In call to ${name}, incompatible template arguments: `
|
||||
+ args.map(a => JSON.stringify(a)).join(', '))
|
||||
// + args.map(a => JSON.stringify(a)).join(', ')
|
||||
// unfortunately barfs on bigints. Need a better formatter
|
||||
// wish we could just use the one that console.log uses;
|
||||
// is that accessible somehow?
|
||||
+ args.map(a => a.toString()).join(', ')
|
||||
+ ' of types ' + argTypes.join(', ') + argType)
|
||||
}
|
||||
argTypes.push(argType)
|
||||
}
|
||||
|
@ -947,7 +953,7 @@ export default class PocomathInstance {
|
|||
} else {
|
||||
throw new Error(
|
||||
'Implement inexact self-reference in typed-function for '
|
||||
+ neededSig)
|
||||
+ `${name}(${neededSig})`)
|
||||
}
|
||||
}
|
||||
const refs = imps[aSignature].builtRefs
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue