| /** |
| * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> |
| * Build: `lodash modularize exports="node" -o ./compat/` |
| * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> |
| * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> |
| * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
| * Available under MIT license <http://lodash.com/license> |
| */ |
| var isFunction = require('../objects/isFunction'); |
| |
| /** |
| * Creates a function that is the composition of the provided functions, |
| * where each function consumes the return value of the function that follows. |
| * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`. |
| * Each function is executed with the `this` binding of the composed function. |
| * |
| * @static |
| * @memberOf _ |
| * @category Functions |
| * @param {...Function} [func] Functions to compose. |
| * @returns {Function} Returns the new composed function. |
| * @example |
| * |
| * var realNameMap = { |
| * 'pebbles': 'penelope' |
| * }; |
| * |
| * var format = function(name) { |
| * name = realNameMap[name.toLowerCase()] || name; |
| * return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase(); |
| * }; |
| * |
| * var greet = function(formatted) { |
| * return 'Hiya ' + formatted + '!'; |
| * }; |
| * |
| * var welcome = _.compose(greet, format); |
| * welcome('pebbles'); |
| * // => 'Hiya Penelope!' |
| */ |
| function compose() { |
| var funcs = arguments, |
| length = funcs.length; |
| |
| while (length--) { |
| if (!isFunction(funcs[length])) { |
| throw new TypeError; |
| } |
| } |
| return function() { |
| var args = arguments, |
| length = funcs.length; |
| |
| while (length--) { |
| args = [funcs[length].apply(this, args)]; |
| } |
| return args[0]; |
| }; |
| } |
| |
| module.exports = compose; |