69 lines
1.3 KiB
JavaScript
69 lines
1.3 KiB
JavaScript
|
/*!
|
||
|
* regex-cache <https://github.com/jonschlinkert/regex-cache>
|
||
|
*
|
||
|
* Copyright (c) 2015-2017, Jon Schlinkert.
|
||
|
* Released under the MIT License.
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
var equal = require('is-equal-shallow');
|
||
|
var basic = {};
|
||
|
var cache = {};
|
||
|
|
||
|
/**
|
||
|
* Expose `regexCache`
|
||
|
*/
|
||
|
|
||
|
module.exports = regexCache;
|
||
|
|
||
|
/**
|
||
|
* Memoize the results of a call to the new RegExp constructor.
|
||
|
*
|
||
|
* @param {Function} fn [description]
|
||
|
* @param {String} str [description]
|
||
|
* @param {Options} options [description]
|
||
|
* @param {Boolean} nocompare [description]
|
||
|
* @return {RegExp}
|
||
|
*/
|
||
|
|
||
|
function regexCache(fn, str, opts) {
|
||
|
var key = '_default_', regex, cached;
|
||
|
|
||
|
if (!str && !opts) {
|
||
|
if (typeof fn !== 'function') {
|
||
|
return fn;
|
||
|
}
|
||
|
return basic[key] || (basic[key] = fn(str));
|
||
|
}
|
||
|
|
||
|
var isString = typeof str === 'string';
|
||
|
if (isString) {
|
||
|
if (!opts) {
|
||
|
return basic[str] || (basic[str] = fn(str));
|
||
|
}
|
||
|
key = str;
|
||
|
} else {
|
||
|
opts = str;
|
||
|
}
|
||
|
|
||
|
cached = cache[key];
|
||
|
if (cached && equal(cached.opts, opts)) {
|
||
|
return cached.regex;
|
||
|
}
|
||
|
|
||
|
memo(key, opts, (regex = fn(str, opts)));
|
||
|
return regex;
|
||
|
}
|
||
|
|
||
|
function memo(key, opts, regex) {
|
||
|
cache[key] = {regex: regex, opts: opts};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Expose `cache`
|
||
|
*/
|
||
|
|
||
|
module.exports.cache = cache;
|
||
|
module.exports.basic = basic;
|