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 );
    }