cond.js 1.6 KB

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