1 changed files with 83 additions and 0 deletions
@ -0,0 +1,83 @@
|
||||
/* |
||||
Copyright (c) 2014, Yahoo! Inc. All rights reserved. |
||||
Copyrights licensed under the New BSD License. |
||||
See the accompanying LICENSE file for terms. |
||||
*/ |
||||
|
||||
/* jshint esnext: true */ |
||||
|
||||
"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
|
||||
Loading…
Reference in new issue