| 'use strict'; |
| |
| var regex = require('regex-not'); |
| var Cache = require('fragment-cache'); |
| |
| /** |
| * Utils |
| */ |
| |
| var utils = module.exports; |
| var cache = utils.cache = new Cache(); |
| |
| /** |
| * Cast `val` to an array |
| * @return {Array} |
| */ |
| |
| utils.arrayify = function(val) { |
| if (!Array.isArray(val)) { |
| return [val]; |
| } |
| return val; |
| }; |
| |
| /** |
| * Memoize a generated regex or function |
| */ |
| |
| utils.memoize = function(type, pattern, options, fn) { |
| var key = utils.createKey(type + pattern, options); |
| |
| if (cache.has(type, key)) { |
| return cache.get(type, key); |
| } |
| |
| var val = fn(pattern, options); |
| if (options && options.cache === false) { |
| return val; |
| } |
| |
| cache.set(type, key, val); |
| return val; |
| }; |
| |
| /** |
| * Create the key to use for memoization. The key is generated |
| * by iterating over the options and concatenating key-value pairs |
| * to the pattern string. |
| */ |
| |
| utils.createKey = function(pattern, options) { |
| var key = pattern; |
| if (typeof options === 'undefined') { |
| return key; |
| } |
| for (var prop in options) { |
| key += ';' + prop + '=' + String(options[prop]); |
| } |
| return key; |
| }; |
| |
| /** |
| * Create the regex to use for matching text |
| */ |
| |
| utils.createRegex = function(str) { |
| var opts = {contains: true, strictClose: false}; |
| return regex(str, opts); |
| }; |