'use strict'; /*@ Ox.cache <f> Memoize a function <script> var f = Ox.cache(function(n) { return n * Math.random(); }); </script> > f(10) == f(10); true > f(10) == f.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; };