@dhmk/atom
Version:
Lightweight mobx-like observable values, computed values and side-effects
69 lines (68 loc) • 1.96 kB
JavaScript
import { ValueAtom } from "../atoms/value";
var ID_ATOM = Symbol();
var makeMutable = function (name) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var self = this;
self[name].apply(self, args);
self[ID_ATOM].set({});
};
};
var makePure = function (name) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var self = this;
self[ID_ATOM].get();
return self[name].apply(self, args);
};
};
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#copying_methods_and_mutating_methods
var mutableMethods = [
"copyWithin",
"fill",
"pop",
"push",
"reverse",
"shift",
"sort",
"splice",
"unshift",
];
var patchedMethods = Object.create(null);
for (var _i = 0, _a = Object.getOwnPropertyNames(Array.prototype); _i < _a.length; _i++) {
var k = _a[_i];
var v = Array.prototype[k];
if (typeof v === "function") {
patchedMethods[k] = mutableMethods.includes(k)
? makeMutable(k)
: makePure(k);
}
}
export default function observableArray(x) {
var idAtom = new ValueAtom({});
x[ID_ATOM] = idAtom;
return new Proxy(x, {
get: function (t, p) {
if (patchedMethods[p])
return patchedMethods[p].bind(x);
if (p === "length" || !isNaN(p))
idAtom.get();
return t[p];
},
set: function (t, p, v) {
if (p === "length" || !isNaN(p)) {
var prev = t[p];
if (prev !== v)
idAtom.set({});
}
t[p] = v;
return true;
},
});
}