MCPcopy
hub / github.com/facebook/react / cache

Function cache

packages/react/src/ReactCacheImpl.js:55–128  ·  view source on GitHub ↗
(fn: (...A) => T)

Source from the content-addressed store, hash-verified

53}
54
55export function cache<A: Iterable<mixed>, T>(fn: (...A) => T): (...A) => T {
56 return function () {
57 const dispatcher = ReactSharedInternals.A;
58 if (!dispatcher) {
59 // If there is no dispatcher, then we treat this as not being cached.
60 // $FlowFixMe[incompatible-call]: We don't want to use rest arguments since we transpile the code.
61 return fn.apply(null, arguments);
62 }
63 const fnMap: WeakMap<any, CacheNode<T>> = dispatcher.getCacheForType(
64 createCacheRoot,
65 );
66 const fnNode = fnMap.get(fn);
67 let cacheNode: CacheNode<T>;
68 if (fnNode === undefined) {
69 cacheNode = createCacheNode();
70 fnMap.set(fn, cacheNode);
71 } else {
72 cacheNode = fnNode;
73 }
74 for (let i = 0, l = arguments.length; i < l; i++) {
75 const arg = arguments[i];
76 if (
77 typeof arg === 'function' ||
78 (typeof arg === 'object' && arg !== null)
79 ) {
80 // Objects go into a WeakMap
81 let objectCache = cacheNode.o;
82 if (objectCache === null) {
83 cacheNode.o = objectCache = new WeakMap();
84 }
85 const objectNode = objectCache.get(arg);
86 if (objectNode === undefined) {
87 cacheNode = createCacheNode();
88 objectCache.set(arg, cacheNode);
89 } else {
90 cacheNode = objectNode;
91 }
92 } else {
93 // Primitives go into a regular Map
94 let primitiveCache = cacheNode.p;
95 if (primitiveCache === null) {
96 cacheNode.p = primitiveCache = new Map();
97 }
98 const primitiveNode = primitiveCache.get(arg);
99 if (primitiveNode === undefined) {
100 cacheNode = createCacheNode();
101 primitiveCache.set(arg, cacheNode);
102 } else {
103 cacheNode = primitiveNode;
104 }
105 }
106 }
107 if (cacheNode.s === TERMINATED) {
108 return cacheNode.v;
109 }
110 if (cacheNode.s === ERRORED) {
111 throw cacheNode.v;
112 }

Calls 4

createCacheNodeFunction · 0.85
setMethod · 0.80
getMethod · 0.65
applyMethod · 0.45

Tested by

no test coverage detected