import * as is from '../is'; import * as util from '../util'; let cache = function( fn, name ){ return function traversalCache( arg1, arg2, arg3, arg4 ){ let selectorOrEles = arg1; let eles = this; let key; if( selectorOrEles == null ){ key = ''; } else if( is.elementOrCollection( selectorOrEles ) && selectorOrEles.length === 1 ){ key = selectorOrEles.id(); } if( eles.length === 1 && key ){ let _p = eles[0]._private; let tch = _p.traversalCache = _p.traversalCache || {}; let ch = tch[ name ] = tch[ name ] || []; let hash = util.hashString( key ); let cacheHit = ch[ hash ]; if( cacheHit ){ return cacheHit; } else { return ( ch[ hash ] = fn.call( eles, arg1, arg2, arg3, arg4 ) ); } } else { return fn.call( eles, arg1, arg2, arg3, arg4 ); } }; }; export default cache;