You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.6 KiB
60 lines
1.6 KiB
var apply = require('./_apply'), |
|
arrayMap = require('./_arrayMap'), |
|
baseIteratee = require('./_baseIteratee'), |
|
baseRest = require('./_baseRest'); |
|
|
|
/** Error message constants. */ |
|
var FUNC_ERROR_TEXT = 'Expected a function'; |
|
|
|
/** |
|
* Creates a function that iterates over `pairs` and invokes the corresponding |
|
* function of the first predicate to return truthy. The predicate-function |
|
* pairs are invoked with the `this` binding and arguments of the created |
|
* function. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @since 4.0.0 |
|
* @category Util |
|
* @param {Array} pairs The predicate-function pairs. |
|
* @returns {Function} Returns the new composite function. |
|
* @example |
|
* |
|
* var func = _.cond([ |
|
* [_.matches({ 'a': 1 }), _.constant('matches A')], |
|
* [_.conforms({ 'b': _.isNumber }), _.constant('matches B')], |
|
* [_.stubTrue, _.constant('no match')] |
|
* ]); |
|
* |
|
* func({ 'a': 1, 'b': 2 }); |
|
* // => 'matches A' |
|
* |
|
* func({ 'a': 0, 'b': 1 }); |
|
* // => 'matches B' |
|
* |
|
* func({ 'a': '1', 'b': '2' }); |
|
* // => 'no match' |
|
*/ |
|
function cond(pairs) { |
|
var length = pairs == null ? 0 : pairs.length, |
|
toIteratee = baseIteratee; |
|
|
|
pairs = !length ? [] : arrayMap(pairs, function(pair) { |
|
if (typeof pair[1] != 'function') { |
|
throw new TypeError(FUNC_ERROR_TEXT); |
|
} |
|
return [toIteratee(pair[0]), pair[1]]; |
|
}); |
|
|
|
return baseRest(function(args) { |
|
var index = -1; |
|
while (++index < length) { |
|
var pair = pairs[index]; |
|
if (apply(pair[0], this, args)) { |
|
return apply(pair[1], this, args); |
|
} |
|
} |
|
}); |
|
} |
|
|
|
module.exports = cond;
|
|
|