@micosmo/core
Version:
Core Javascript language extensions
61 lines (54 loc) • 1.73 kB
JavaScript
/*
* private.js
*
* Private space management for private object properties.
*
* Warning: Influence instances have their own private and protected scope support. This does not
* stop the use of this facility but it is not visible or managed by Influence.
*/
;
const SpaceMaps = new WeakMap(); // Map of object to privateSpace membership
module.exports = {
newPrivateSpace
};
function newPrivateSpace() {
const privateSpace = new WeakMap();
function fPrivate(o) {
return privateSpace.get(o) || newPrivateObject(o, privateSpace);
}
fPrivate.setObject = function (o, oPrivate) {
if (oPrivate && privateSpace.has(o))
privateSpace.set(o, oPrivate);
else
oPrivate = newPrivateObject(o, privateSpace, oPrivate);
return o;
}
fPrivate.exists = function (o) {
return privateSpace.has(o);
}
return fPrivate;
}
function newPrivateObject(o, privateSpace, oPrivate = {}) {
// Not a member of this private space so will have to add the target object
// and it's associated new private object, as well as record the private space
// in the SpaceMaps
let spaceMap = SpaceMaps.get(o);
if (!spaceMap)
SpaceMaps.set(o, (spaceMap = []));
spaceMap.push(privateSpace);
privateSpace.set(o, oPrivate);
return (oPrivate);
}
// Replication of private space objects for this public object
newPrivateSpace.replicate = function(ctxt, from, to) {
const fSpaceMap = SpaceMaps.get(from);
if (fSpaceMap) {
const tSpaceMap = [];
SpaceMaps.set(to, tSpaceMap);
fSpaceMap.forEach(ps => {
tSpaceMap.push(ps);
ps.set(to, ctxt.replicate(ps.get(from)));
})
}
return to;
}