UNPKG

q-proxyable

Version:
90 lines (89 loc) 3.25 kB
"use strict"; 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;