time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

cond.js (1613B)


      1 var apply = require('./_apply'),
      2     arrayMap = require('./_arrayMap'),
      3     baseIteratee = require('./_baseIteratee'),
      4     baseRest = require('./_baseRest');
      5 
      6 /** Error message constants. */
      7 var FUNC_ERROR_TEXT = 'Expected a function';
      8 
      9 /**
     10  * Creates a function that iterates over `pairs` and invokes the corresponding
     11  * function of the first predicate to return truthy. The predicate-function
     12  * pairs are invoked with the `this` binding and arguments of the created
     13  * function.
     14  *
     15  * @static
     16  * @memberOf _
     17  * @since 4.0.0
     18  * @category Util
     19  * @param {Array} pairs The predicate-function pairs.
     20  * @returns {Function} Returns the new composite function.
     21  * @example
     22  *
     23  * var func = _.cond([
     24  *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
     25  *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
     26  *   [_.stubTrue,                      _.constant('no match')]
     27  * ]);
     28  *
     29  * func({ 'a': 1, 'b': 2 });
     30  * // => 'matches A'
     31  *
     32  * func({ 'a': 0, 'b': 1 });
     33  * // => 'matches B'
     34  *
     35  * func({ 'a': '1', 'b': '2' });
     36  * // => 'no match'
     37  */
     38 function cond(pairs) {
     39   var length = pairs == null ? 0 : pairs.length,
     40       toIteratee = baseIteratee;
     41 
     42   pairs = !length ? [] : arrayMap(pairs, function(pair) {
     43     if (typeof pair[1] != 'function') {
     44       throw new TypeError(FUNC_ERROR_TEXT);
     45     }
     46     return [toIteratee(pair[0]), pair[1]];
     47   });
     48 
     49   return baseRest(function(args) {
     50     var index = -1;
     51     while (++index < length) {
     52       var pair = pairs[index];
     53       if (apply(pair[0], this, args)) {
     54         return apply(pair[1], this, args);
     55       }
     56     }
     57   });
     58 }
     59 
     60 module.exports = cond;