q-proxyable
Version:
normal utils by qianzhixiang
90 lines (89 loc) • 3.25 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.Computed = exports.State = void 0;
var defineProperty_1 = require("./defineProperty");
var event_1 = require("./event");
var utils_1 = require("./utils");
var STATE_ABLE_SYMBOL = Symbol('STATE_ABLE_SYMBOL');
var COMPUTE_ABLE_SYMBOK = Symbol('COMPUTE_ABLE_SYMBOK');
function State() {
return function (target, key) {
var value = target[key];
function setProperty() {
if (!this[STATE_ABLE_SYMBOL] || this[STATE_ABLE_SYMBOL].instance !== this) {
var proto = utils_1.resetProto(this);
proto[STATE_ABLE_SYMBOL] = {
instance: this,
proto: proto,
keys: new Set(),
};
}
var store = this[STATE_ABLE_SYMBOL];
if (!store.keys.has(key)) {
store.keys.add(key);
defineProperty_1.ProxyableSinglePropertyByDefineProperty(this, key);
}
}
Object.defineProperty(target, key, {
get: function () {
setProperty.apply(this);
return value;
},
set: function (v) {
value = v;
setProperty.apply(this);
},
});
};
}
exports.State = State;
function Computed() {
return function (target, key, descriptor) {
var origin = descriptor.value;
function compute(store) {
return function () {
var args = arguments;
var unsub = store.emitter.onGet(function (t, k, v) {
if (!store.map.has(t)) {
store.map.set(t, []);
}
store.map.get(t).push(k);
});
store.value = origin && origin.apply(this, args);
unsub();
var onsetSub = store.emitter.onSet(function (t, k, v) {
if (store.map.has(t) && store.map.get(t).includes(k)) {
store.map.clear();
onsetSub();
store.inited = false;
}
});
};
}
descriptor.value = function () {
var _a;
if (!this[COMPUTE_ABLE_SYMBOK] || !this[COMPUTE_ABLE_SYMBOK][key]) {
var proto = utils_1.resetProto(this);
proto[COMPUTE_ABLE_SYMBOK] = (_a = {},
_a[key] = {
proto: proto,
inited: false,
value: null,
emitter: new event_1.ProxyEmitter(),
map: new Map(),
},
_a);
}
var store = this[COMPUTE_ABLE_SYMBOK][key];
if (store.inited) {
return store.value;
}
else {
compute(store).apply(this, arguments);
store.inited = true;
return store.value;
}
};
};
}
exports.Computed = Computed;
;