Generic memoization using Map and WeakMap.
npm install --save @starryinternet/map-memo Memoization in JavaScript has typically been limited to arguments with primitive values, or by utilizing hacks such as stringifying objects.
By storing arguments using a series of nested cache objects backed by Map and WeakMap, map-memo is able to memoize functions with any argument types.
'use strict'; const memoize = require('@starryinternet/map-memo'); function loop( fn, n ) { let v; for ( let i = 0; i < n; ++i ) { v = fn( i ); } return v; } let mem = memoize( loop ); console.log( mem( Math.sqrt, 1e9 ) ); // slow console.log( mem( Math.sqrt, 1e9 ) ); // fast!'use strict'; const memoize = require('@starryinternet/map-memo'); function getRandom() { return Math.random(); } let mem = memoize( getRandom, { ttl: 1000 } ); console.log( mem() ); console.log( mem() ); // Same value as above setTimeout( function() { console.log( mem() ); // Different value }, 1001 );'use strict'; const memoize = require('@starryinternet/map-memo'); function loopAsync( fn, n ) { return new Promise( ( resolve, reject ) => { let v; for ( let i = 0; i < n; ++i ) { v = fn( i ); } resolve( v ); }); } let mem = memoize( loopAsync ); mem( Math.sqrt, 1e9 ).then( result => { console.log( result ); // slow mem( Math.sqrt, 1e9 ).then( console.log ); // fast! });