export const memoize = ( fn, keyFn ) => { if( !keyFn ){ keyFn = function(){ if( arguments.length === 1 ){ return arguments[0]; } else if( arguments.length === 0 ){ return 'undefined'; } let args = []; for( let i = 0; i < arguments.length; i++ ){ args.push( arguments[ i ] ); } return args.join( '$' ); }; } let memoizedFn = function(){ let self = this; let args = arguments; let ret; let k = keyFn.apply( self, args ); let cache = memoizedFn.cache; if( !(ret = cache[ k ]) ){ ret = cache[ k ] = fn.apply( self, args ); } return ret; }; memoizedFn.cache = {}; return memoizedFn; };