feat: Allow reconfiguration of an existing picomath instance
Keeps track of which operations depend on the configuration and invalidates them for lazy reconfiguration when the config changes.
This commit is contained in:
parent
4213ade4ba
commit
d95e5ad930
@ -13,6 +13,7 @@ export default function create(pmath) {
|
|||||||
}
|
}
|
||||||
if (resolve && Math.abs(sum.im/sum.re) < 1e-10) return sum.re
|
if (resolve && Math.abs(sum.im/sum.re) < 1e-10) return sum.re
|
||||||
return sum
|
return sum
|
||||||
}])
|
}],
|
||||||
|
create, pmath) // register ourselves for invalidation and reconfiguration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,23 +2,43 @@
|
|||||||
import poortf from './poortf.js'
|
import poortf from './poortf.js'
|
||||||
|
|
||||||
export default function picomathInstance (instName, config) {
|
export default function picomathInstance (instName, config) {
|
||||||
/* Since we have to do it all the time, when we call a picomath instance
|
/* Since we have to do it all the time, when we call a picomath instance
|
||||||
* as a function, it takes a name and 0 or more implementations add adds
|
* as a function, it takes a name and 0 or more implementations add adds
|
||||||
* them to its poortf property named name, returning that property value.
|
* them to its poortf property named name, returning that property value.
|
||||||
*/
|
*/
|
||||||
function fn (name, imps, author, data) {
|
function fn (name, imps, author, data) {
|
||||||
if (name in fn) {
|
if (name in fn) {
|
||||||
fn[name].addImps(imps, author, data)
|
fn[name].addImps(imps, author, data)
|
||||||
} else {
|
} else {
|
||||||
fn[name] = poortf(name, imps, author, data)
|
fn[name] = poortf(name, imps, author, data)
|
||||||
}
|
}
|
||||||
return fn[name]
|
/* For PoC, just assume only reason to provide author info
|
||||||
}
|
* is to be invalidated when config changes
|
||||||
|
*/
|
||||||
|
if (author) {
|
||||||
|
if (!fn.configUsers.has(author)) {
|
||||||
|
fn.configUsers.set(author, new Set())
|
||||||
|
}
|
||||||
|
fn.configUsers.get(author).add(name)
|
||||||
|
}
|
||||||
|
return fn[name]
|
||||||
|
}
|
||||||
|
|
||||||
Object.defineProperty(fn, 'name', {value: instName})
|
Object.defineProperty(fn, 'name', {value: instName})
|
||||||
fn.config = config || { resolveComplex: false } // primitive default for POC
|
// There is an issue below of possible collision between the following
|
||||||
|
// property names and operation names. Since it would not be too hard to
|
||||||
return fn
|
// solve, we won't worry about it in this PoC.
|
||||||
|
fn.config = config || { resolveComplex: false } // primitive default for POC
|
||||||
|
fn.configUsers = new Map()
|
||||||
|
fn.reconfigure = config => {
|
||||||
|
for (const [author, names] of fn.configUsers.entries()) {
|
||||||
|
for (const name of names) {
|
||||||
|
fn[name].invalidate(author)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn.config = config
|
||||||
|
}
|
||||||
|
return fn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,4 +46,10 @@ describe('Custom instances', () => {
|
|||||||
assert.deepStrictEqual(math.add(math.complex(2,3), math.complex(2,-3)),
|
assert.deepStrictEqual(math.add(math.complex(2,3), math.complex(2,-3)),
|
||||||
math.complex(4,0))
|
math.complex(4,0))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("can be reconfigured", () => {
|
||||||
|
res.reconfigure({resolveComplex: false})
|
||||||
|
assert.deepStrictEqual(math.add(math.complex(2,3), math.complex(2,-3)),
|
||||||
|
math.complex(4,0))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user