Skip to content

Commit f09741d

Browse files
committed
simplify cache usage
1 parent 4df625b commit f09741d

File tree

1 file changed

+29
-51
lines changed

1 file changed

+29
-51
lines changed

src/index.ts

+29-51
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ const IS_TARGET_COPIED_PROPERTY = 'f';
1010
const PROXY_PROPERTY = 'p';
1111
const PROXY_CACHE_PROPERTY = 'c';
1212
const TARGET_CACHE_PROPERTY = 't';
13-
const NEXT_OBJECT_PROPERTY = 'n';
14-
const CHANGED_PROPERTY = 'g';
1513
const HAS_KEY_PROPERTY = 'h';
1614
const ALL_OWN_KEYS_PROPERTY = 'w';
1715
const HAS_OWN_KEY_PROPERTY = 'o';
@@ -252,14 +250,6 @@ const isAllOwnKeysChanged = (prevObj: object, nextObj: object) => {
252250
);
253251
};
254252

255-
type ChangedCache = WeakMap<
256-
object,
257-
{
258-
[NEXT_OBJECT_PROPERTY]: object;
259-
[CHANGED_PROPERTY]: boolean;
260-
}
261-
>;
262-
263253
/**
264254
* Compare changes on objects.
265255
*
@@ -299,7 +289,7 @@ export const isChanged = (
299289
prevObj: unknown,
300290
nextObj: unknown,
301291
affected: WeakMap<object, unknown>,
302-
cache?: WeakMap<object, unknown>,
292+
cache?: WeakMap<object, unknown>, // for object with cycles
303293
isEqual: (a: unknown, b: unknown) => boolean = Object.is,
304294
): boolean => {
305295
if (isEqual(prevObj, nextObj)) {
@@ -309,53 +299,41 @@ export const isChanged = (
309299
const used = (affected as Affected).get(getOriginalObject(prevObj));
310300
if (!used) return true;
311301
if (cache) {
312-
const hit = (cache as ChangedCache).get(prevObj);
313-
if (hit && hit[NEXT_OBJECT_PROPERTY] === nextObj) {
314-
return hit[CHANGED_PROPERTY];
302+
const hit = cache.get(prevObj);
303+
if (hit === nextObj) {
304+
return false;
315305
}
316306
// for object with cycles
317-
(cache as ChangedCache).set(prevObj, {
318-
[NEXT_OBJECT_PROPERTY]: nextObj,
319-
[CHANGED_PROPERTY]: false,
320-
});
307+
cache.set(prevObj, nextObj);
321308
}
322309
let changed: boolean | null = null;
323-
try {
324-
for (const key of used[HAS_KEY_PROPERTY] || []) {
325-
changed = Reflect.has(prevObj, key) !== Reflect.has(nextObj, key);
326-
if (changed) return changed;
327-
}
328-
if (used[ALL_OWN_KEYS_PROPERTY] === true) {
329-
changed = isAllOwnKeysChanged(prevObj, nextObj);
330-
if (changed) return changed;
331-
} else {
332-
for (const key of used[HAS_OWN_KEY_PROPERTY] || []) {
333-
const hasPrev = !!Reflect.getOwnPropertyDescriptor(prevObj, key);
334-
const hasNext = !!Reflect.getOwnPropertyDescriptor(nextObj, key);
335-
changed = hasPrev !== hasNext;
336-
if (changed) return changed;
337-
}
338-
}
339-
for (const key of used[KEYS_PROPERTY] || []) {
340-
changed = isChanged(
341-
(prevObj as any)[key],
342-
(nextObj as any)[key],
343-
affected,
344-
cache,
345-
isEqual,
346-
);
310+
for (const key of used[HAS_KEY_PROPERTY] || []) {
311+
changed = Reflect.has(prevObj, key) !== Reflect.has(nextObj, key);
312+
if (changed) return changed;
313+
}
314+
if (used[ALL_OWN_KEYS_PROPERTY] === true) {
315+
changed = isAllOwnKeysChanged(prevObj, nextObj);
316+
if (changed) return changed;
317+
} else {
318+
for (const key of used[HAS_OWN_KEY_PROPERTY] || []) {
319+
const hasPrev = !!Reflect.getOwnPropertyDescriptor(prevObj, key);
320+
const hasNext = !!Reflect.getOwnPropertyDescriptor(nextObj, key);
321+
changed = hasPrev !== hasNext;
347322
if (changed) return changed;
348323
}
349-
if (changed === null) changed = true;
350-
return changed;
351-
} finally {
352-
if (cache) {
353-
cache.set(prevObj, {
354-
[NEXT_OBJECT_PROPERTY]: nextObj,
355-
[CHANGED_PROPERTY]: changed,
356-
});
357-
}
358324
}
325+
for (const key of used[KEYS_PROPERTY] || []) {
326+
changed = isChanged(
327+
(prevObj as any)[key],
328+
(nextObj as any)[key],
329+
affected,
330+
cache,
331+
isEqual,
332+
);
333+
if (changed) return changed;
334+
}
335+
if (changed === null) changed = true;
336+
return changed;
359337
};
360338

361339
// explicitly track object with memo

0 commit comments

Comments
 (0)