memoize
Cachea los resultados de una función unaria, indexados por su argumento.
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.
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é