oxjs/source/Ox/js/Function.js

30 lines
785 B
JavaScript

'use strict';
/*@
Ox.cache <f> Memoize a function
<script>
Ox.test.fn = Ox.cache(function(n) { return n * Math.random(); });
</script>
> Ox.test.fn(10) == Ox.test.fn(10);
true
> Ox.test.fn(10) == Ox.test.fn.clear()(10);
false
@*/
Ox.cache = function(fn) {
var cache = {},
ret = function() {
var key = JSON.stringify(Ox.makeArray(arguments));
return key in cache ? cache[key]
: (cache[key] = fn.apply(this, arguments));
};
ret.clear = function() {
if (arguments.length == 0) {
cache = {};
} else {
Ox.toArray(arguments).forEach(function(key) {
delete cache[key];
});
}
return ret;
}
return ret;
};