| '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); | 
| }; |