memoize
Memoize a function.
Usage
var memoize = require( '@stdlib/utils/memoize' );
memoize( fcn[, hashFunction] )
Memoizes a function.
var randu = require( '@stdlib/random/base/randu' );
function rand( n ) {
return n * randu();
}
var memoized = memoize( rand );
var v1 = memoized( 5 );
var v2 = memoized( 5 );
var bool = ( v1 === v2 );
// returns true
By default, the implementation serializes provided arguments as a string
and stores results using the string
as an identifier. To use a custom hash function, provide a hash function argument.
function add( obj ) {
return obj.x + obj.y + obj.z;
}
obj = {
'x': 3,
'y': 4,
'z': 5
};
// Default behavior...
var memoized = memoize( add );
var v1 = memoized( obj );
// returns 12
var str = obj.toString();
// returns '[object Object]'
var v2 = memoized.cache[ str ];
// returns 12
obj.x = 1000;
var v3 = memoized( obj );
// returns 12
// Custom hash function...
function hashFunction( args ) {
return JSON.stringify( args );
}
memoized = memoize( add, hashFunction );
v1 = memoized( obj );
// returns 1009
str = hashFunction( [ obj ] );
// returns '[{"x":1000,"y":4,"z":5}]'
v2 = memoized.cache[ str ];
// returns 1009
obj.x = 6;
v3 = memoized( obj );
// returns 15
memoized.cache
Results cache. Note that, while the property is read-only, cache contents may be modified independently of the memoized function.
function beep( x ) {
throw new Error( 'boop' );
}
var memoized = memoize( beep );
var cache = memoized.cache;
// returns {}
// Modify the cache:
cache[ 'bop' ] = 'bip';
var str = memoized( 'bop' );
// returns 'bip'
Notes
- The implementation does not set the
length
of the returned function. Accordingly, the returned functionlength
is always0
. - The evaluation context is always
null
.
Examples
var randu = require( '@stdlib/random/base/randu' );
var floor = require( '@stdlib/math/base/special/floor' );
var memoize = require( '@stdlib/utils/memoize' );
var fcn;
var n;
var v;
var i;
function rand( n ) {
return n * randu();
}
fcn = memoize( rand );
for ( i = 0; i < 100; i++ ) {
n = floor( randu() * 5 );
v = fcn( n );
console.log( 'rand(%d) = %d', n, v );
}