Location: A review of cardiac cellular electrophysiology models @ 1f3e877163d4 / dojo-presentation / js / dojo / dojox / lang / aspect / memoizer.js

Author:
David Nickerson <david.nickerson@gmail.com>
Date:
2021-09-16 01:19:58+12:00
Desc:
update MNT model: * exposing membrane potential at the top level; * adding SED-ML; Using OpenCOR snapshot release 2021-09-14
Permanent Source URI:
https://staging.physiomeproject.org/workspace/a1/rawfile/1f3e877163d4caa8e1e97a9fc195f610d0e59095/dojo-presentation/js/dojo/dojox/lang/aspect/memoizer.js

dojo.provide("dojox.lang.aspect.memoizer");

(function(){
	var aop = dojox.lang.aspect;

	var memoize1 = {
		around: function(key){
			var ctx = aop.getContext(), self = ctx.joinPoint, that = ctx.instance, t, u, ret;
			if((t = that.__memoizerCache) && (t = t[self.targetName]) && (key in t)){
				return t[key];
			}
			var ret = aop.proceed.apply(null, arguments);
			if(!(t = that.__memoizerCache)){ t = that.__memoizerCache = {}; }
			if(!(u = t[self.targetName])){ u = t[self.targetName] = {}; }
			return u[key] = ret;
		}
	};

	var memoizeN = function(/*Function*/keyMaker){
		return {
			around: function(/*arguments*/){
				var ctx = aop.getContext(), self = ctx.joinPoint, that = ctx.instance, t, u, ret,
					key  = keyMaker.apply(that, arguments);
				if((t = that.__memoizerCache) && (t = t[self.targetName]) && (key in t)){
					return t[key];
				}
				var ret = aop.proceed.apply(null, arguments);
				if(!(t = that.__memoizerCache)){ t = that.__memoizerCache = {}; }
				if(!(u = t[self.targetName])){ u = t[self.targetName] = {}; }
				return u[key] = ret;
			}
		};
	};

	aop.memoizer = function(/*Function?*/ keyMaker){
		// summary:
		//		Returns an object, which can be used to count calls to methods.
		//
		// keyMaker:
		//		the function, which takes method's arguments and returns a key,
		//		which can be used to index the result.

		return arguments.length == 0 ? memoize1 : memoizeN(keyMaker);	// Object
	};
})();