memoize

Cachea los resultados de una función unaria, indexados por su argumento.

R Function(A) memoize<A, R>(R Function(A) f)

Lección

memoize(f) envuelve f en una caché: la primera vez que se llama con un argumento dado, ejecuta f y recuerda el resultado; toda llamada posterior con un argumento igual según == devuelve el resultado cacheado al instante, sin volver a llamar a f. Recurre a ella cuando f sea costosa (un cálculo pesado, una llamada de red) y sea probable que se llame repetidamente con las mismas entradas.

El memoize de FxDart es solo unario e indexa la caché por el ==/hashCode del argumento. La versión de FxTS es variádica e indexa por la lista completa de argumentos mediante una caché respaldada por WeakMap; Dart no tiene un equivalente directo (no hay genéricos variádicos, y las claves débiles al estilo WeakMap no están disponibles para objetos arbitrarios), así que las funciones de varios argumentos necesitan memoizarse sobre una única clave compuesta (un record funciona bien).

Como R no tiene restricciones, f puede devolver un Future: memoizar una operación asíncrona cachea el Future en sí, de modo que una segunda llamada devuelve de inmediato un future ya completado en lugar de rehacer el trabajo.

Demo 1 · Fundamentos

Demo 2 · Memoizar una consulta asíncrona

La segunda llamada a fetchUser(1) devuelve el Future cacheado y ya completado, sin esperar los 150 ms:

Pruébalo tú

Ejercicio: envuelve con memoize esta función «lenta» que eleva al cubo, para que llamarla dos veces con 3 ejecute el cálculo real una sola vez.

Relacionado: delay & sleep — usados arriba para simular una llamada asíncrona lenta · debounce — limita la frecuencia de las llamadas en lugar de cachearlas · identity — la función más simple posible que envolver · always — un valor constante, sin necesidad de caché