utils.js
 1  'use strict';
 2  
 3  var regex = require('regex-not');
 4  var Cache = require('fragment-cache');
 5  
 6  /**
 7   * Utils
 8   */
 9  
10  var utils = module.exports;
11  var cache = utils.cache = new Cache();
12  
13  /**
14   * Cast `val` to an array
15   * @return {Array}
16   */
17  
18  utils.arrayify = function(val) {
19    if (!Array.isArray(val)) {
20      return [val];
21    }
22    return val;
23  };
24  
25  /**
26   * Memoize a generated regex or function
27   */
28  
29  utils.memoize = function(type, pattern, options, fn) {
30    var key = utils.createKey(type + pattern, options);
31  
32    if (cache.has(type, key)) {
33      return cache.get(type, key);
34    }
35  
36    var val = fn(pattern, options);
37    if (options && options.cache === false) {
38      return val;
39    }
40  
41    cache.set(type, key, val);
42    return val;
43  };
44  
45  /**
46   * Create the key to use for memoization. The key is generated
47   * by iterating over the options and concatenating key-value pairs
48   * to the pattern string.
49   */
50  
51  utils.createKey = function(pattern, options) {
52    var key = pattern;
53    if (typeof options === 'undefined') {
54      return key;
55    }
56    for (var prop in options) {
57      key += ';' + prop + '=' + String(options[prop]);
58    }
59    return key;
60  };
61  
62  /**
63   * Create the regex to use for matching text
64   */
65  
66  utils.createRegex = function(str) {
67    var opts = {contains: true, strictClose: false};
68    return regex(str, opts);
69  };