[IMP] reactivity: slightly improve code and typing

This commit is contained in:
Géry Debongnie
2021-11-13 08:34:43 +01:00
committed by Samuel Degueldre
parent ad4673cb36
commit 4efe1ae166
2 changed files with 6 additions and 9 deletions
+5 -8
View File
@@ -13,9 +13,9 @@ const OBSERVER = Symbol("observer");
const KEYS = Symbol("keys"); const KEYS = Symbol("keys");
const ROOT = Symbol("root"); const ROOT = Symbol("root");
export function atom(source: any, observer: Observer) { export function atom<T>(source: T, observer: Observer): T {
if (isTrackable(source) && observerSourceAtom.has(observer)) { if (isTrackable(source) && observerSourceAtom.has(observer)) {
source = source[SOURCE] || source; source = (source as any)[SOURCE] || source;
const oldAtom = observerSourceAtom.get(observer)!.get(source); const oldAtom = observerSourceAtom.get(observer)!.get(source);
if (oldAtom) { if (oldAtom) {
return oldAtom; return oldAtom;
@@ -33,8 +33,7 @@ export function atom(source: any, observer: Observer) {
function createAtom(source: Source, observer: Observer): Atom { function createAtom(source: Source, observer: Observer): Atom {
const keys: Set<any> = new Set(); const keys: Set<any> = new Set();
let self: Atom; return new Proxy(source as any, {
const newAtom: Atom = new Proxy(source as any, {
set(target: any, key: string, value: any): boolean { set(target: any, key: string, value: any): boolean {
if (!(key in target)) { if (!(key in target)) {
target[key] = value; target[key] = value;
@@ -65,7 +64,7 @@ function createAtom(source: Source, observer: Observer): Atom {
} }
return true; return true;
}, },
get(target: any, key: any): any { get(target: any, key: any, proxy: any): any {
switch (key) { switch (key) {
case OBSERVER: case OBSERVER:
return observer; return observer;
@@ -81,7 +80,7 @@ function createAtom(source: Source, observer: Observer): Atom {
if (!atoms.has(key)) { if (!atoms.has(key)) {
atoms.set(key, new ObserverSet()); atoms.set(key, new ObserverSet());
} }
atoms.get(key)!.add(self); atoms.get(key)!.add(proxy);
keys.add(key); keys.add(key);
} }
// //
@@ -89,8 +88,6 @@ function createAtom(source: Source, observer: Observer): Atom {
} }
}, },
}); });
self = newAtom;
return newAtom;
} }
function isTrackable(value: any): boolean { function isTrackable(value: any): boolean {
+1 -1
View File
@@ -871,7 +871,7 @@ describe("Reactivity: atom", () => {
let n = 0; let n = 0;
const observer = () => n++; const observer = () => n++;
const unregisterObserver = registerObserver(observer); const unregisterObserver = registerObserver(observer);
const state = atom({ a: 1 }, observer); const state = atom({ a: 1 } as any, observer);
state.a = state.a; state.a = state.a;
await nextMicroTick(); await nextMicroTick();