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 function length is always 0.
  • 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 );
}