Code coverage report for nodash/lib/match.js

Statements: 100% (33 / 33)      Branches: 100% (23 / 23)      Functions: 100% (5 / 5)      Lines: 100% (33 / 33)      Ignored: none     

All files » nodash/lib/ » match.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66      1   1 12 3 1   2 2     10     1 8 1   7 7 9 9 4     3     1 24   24   12   8   3 1       3       5   9 15 15 15 9 1   8              
/* vim: set et sw=2 ts=2: */
'use strict';
 
module.exports = function () {
 
  function matchString(pattern, arg, result) {
    if (pattern[0] === '$') {
      if (pattern[1] === '$') {
        pattern = pattern.slice(1);
      } else {
        result[pattern] = arg;
        return true;
      }
    }
    return pattern === arg;
  }
 
  function matchObject(pattern, arg, result) {
    if (pattern === null || arg === null || arg === undefined) {
      return pattern === arg;
    }
    var keys = Object.keys(pattern);
    for (var i = 0; i < keys.length; i += 1) {
      var key = keys[i];
      if (!matchR(pattern[key], arg[key], result)) {
        return false;
      }
    }
    return true;
  }
 
  function matchR(pattern, arg, result) {
    var patternType = typeof pattern;
 
    switch (patternType) {
      case 'string':
        return matchString(pattern, arg, result);
      case 'object':
        return matchObject(pattern, arg, result);
      case 'number':
        if (isNaN(pattern) && isNaN(arg)) {
          return true;
        }
        /* falls through */
      default:
        return pattern === arg;
    }
  }
 
  return {
    match: function (pattern, arg) {
      for (var i = 0; i < pattern.length; i += 1) {
        var result = {};
        var p = pattern[i];
        if (matchR(p[0], arg, result)) {
          if (typeof p[1] === 'function') {
            return p[1](result);
          }
          return p[1];
        }
      }
    }
  };
 
};