75 lines
1.7 KiB
JavaScript
75 lines
1.7 KiB
JavaScript
"use strict";
|
|
var src$es5$$ = require("./es5");
|
|
exports["default"] = createFormatCache;
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
function createFormatCache(FormatConstructor) {
|
|
var cache = src$es5$$.objCreate(null);
|
|
|
|
return function () {
|
|
var args = Array.prototype.slice.call(arguments);
|
|
var cacheId = getCacheId(args);
|
|
var format = cacheId && cache[cacheId];
|
|
|
|
if (!format) {
|
|
format = new (src$es5$$.bind.apply(FormatConstructor, [null].concat(args)))();
|
|
|
|
if (cacheId) {
|
|
cache[cacheId] = format;
|
|
}
|
|
}
|
|
|
|
return format;
|
|
};
|
|
}
|
|
|
|
// -- Utilities ----------------------------------------------------------------
|
|
|
|
function getCacheId(inputs) {
|
|
// When JSON is not available in the runtime, we will not create a cache id.
|
|
if (typeof JSON === 'undefined') { return; }
|
|
|
|
var cacheId = [];
|
|
|
|
var i, len, input;
|
|
|
|
for (i = 0, len = inputs.length; i < len; i += 1) {
|
|
input = inputs[i];
|
|
|
|
if (input && typeof input === 'object') {
|
|
cacheId.push(orderedProps(input));
|
|
} else {
|
|
cacheId.push(input);
|
|
}
|
|
}
|
|
|
|
return JSON.stringify(cacheId);
|
|
}
|
|
|
|
function orderedProps(obj) {
|
|
var props = [],
|
|
keys = [];
|
|
|
|
var key, i, len, prop;
|
|
|
|
for (key in obj) {
|
|
if (obj.hasOwnProperty(key)) {
|
|
keys.push(key);
|
|
}
|
|
}
|
|
|
|
var orderedKeys = keys.sort();
|
|
|
|
for (i = 0, len = orderedKeys.length; i < len; i += 1) {
|
|
key = orderedKeys[i];
|
|
prop = {};
|
|
|
|
prop[key] = obj[key];
|
|
props[i] = prop;
|
|
}
|
|
|
|
return props;
|
|
}
|
|
|
|
//# sourceMappingURL=memoizer.js.map
|