UNPKG

foop

Version:

interfaces that describe their intentions.

154 lines (147 loc) 12.4 kB
var isPlaceholder = require('./isPlaceholder') var arity = require('./arity') /** * Returns a curried equivalent of the provided function, with the specified * arity. The curried function has two unusual capabilities. First, its * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the * following are equivalent: * * - `g(1)(2)(3)` * - `g(1)(2, 3)` * - `g(1, 2)(3)` * - `g(1, 2, 3)` * * Secondly, the special placeholder value [`R.__`](#__) may be used to specify * "gaps", allowing partial application of any combination of arguments, * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__), * the following are equivalent: * * - `g(1, 2, 3)` * - `g(_, 2, 3)(1)` * - `g(_, _, 3)(1)(2)` * - `g(_, _, 3)(1, 2)` * - `g(_, 2)(1)(3)` * - `g(_, 2)(1, 3)` * - `g(_, 2)(_, 3)(1)` * * @alias curryN * @alias partial * @since 5.0.0-beta.1 * * @param {number} length The arity of the curried function. * @param {Array} received An array of arguments received thus far. * @param {Function} fn The function to curry. * @return {Function} A new, curried function. * * @func * @memberOf fp * @ramda v0.5.0 * @category Function * @sig Number -> (* -> a) -> (* -> a) * * {@link https://github.com/andrewplummer/Sugar/blob/master/lib/function.js#L382 sugar-partial} * {@link http://documentcloud.github.io/underscore-contrib/#curry underscore-contrib-curry} * {@link https://github.com/lodash/lodash/blob/master/.internal/composeArgs.js lodash-compose-args} * {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L773 underscore-partial} * {@link https://github.com/ramda/ramda/blob/master/src/uncurryN.js ramda-uncurry} * {@link https://github.com/ramda/ramda/blob/master/src/curryN.js ramda-curry} * {@link https://github.com/lodash/lodash/blob/master/curry.js lodash-curry} * @see {@link ramda-curry} * @see {@link lodash-curry} * @see {@link ramda-uncurry} * @see {@link underscore-partial} * @see {@link sugar-partial} * * @types fp/curry * @tests fp/curry * * @example * * var sumArgs = (...args) => R.sum(args); * * var curriedAddFourNumbers = R.curryN(4, sumArgs); * var f = curriedAddFourNumbers(1, 2); * var g = f(3); * g(4); //=> 10 * */ function _curryN(length, received, fn) { return function() { var arguments$1 = arguments; var combined = [] var argsIdx = 0 var left = length var combinedIdx = 0 while (combinedIdx < received.length || argsIdx < arguments.length) { var result = (void 0) if ( combinedIdx < received.length && (!isPlaceholder(received[combinedIdx]) || argsIdx >= arguments$1.length) ) { result = received[combinedIdx] } else { result = arguments$1[argsIdx++] // argsIdx += 1 } combined[combinedIdx++] = result if (!isPlaceholder(result)) { left -= 1 } // combinedIdx += 1 } return left <= 0 ? fn.apply(this, combined) : arity(left, _curryN(length, combined, fn)) } } /** * Returns a curried equivalent of the provided function, with the specified * arity. The curried function has two unusual capabilities. First, its * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the * following are equivalent: * * - `g(1)(2)(3)` * - `g(1)(2, 3)` * - `g(1, 2)(3)` * - `g(1, 2, 3)` * * Secondly, the special placeholder value [`R.__`](#__) may be used to specify * "gaps", allowing partial application of any combination of arguments, * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__), * the following are equivalent: * * - `g(1, 2, 3)` * - `g(_, 2, 3)(1)` * - `g(_, _, 3)(1)(2)` * - `g(_, _, 3)(1, 2)` * - `g(_, 2)(1)(3)` * - `g(_, 2)(1, 3)` * - `g(_, 2)(_, 3)(1)` * * @func * @memberOf fp * @since v0.5.0 * @category Function * @sig Number -> (* -> a) -> (* -> a) * * @param {number} length The arity for the returned function. * @param {Function} fn The function to curry. * @return {Function} A new, curried function. * * @see ramda * * @example * * var sumArgs = (...args) => R.sum(args); * * var curriedAddFourNumbers = R.curryN(4, sumArgs); * var f = curriedAddFourNumbers(1, 2); * var g = f(3); * g(4); //=> 10 * */ module.exports = function curryN(length, fn) { return arity(length, _curryN(length, [], fn)) } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycnkuanMiLCJzb3VyY2VzIjpbImN1cnJ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGlzUGxhY2Vob2xkZXIgPSByZXF1aXJlKCcuL2lzUGxhY2Vob2xkZXInKVxuY29uc3QgYXJpdHkgPSByZXF1aXJlKCcuL2FyaXR5JylcblxuLyoqXG4gKiBSZXR1cm5zIGEgY3VycmllZCBlcXVpdmFsZW50IG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbiwgd2l0aCB0aGUgc3BlY2lmaWVkXG4gKiBhcml0eS4gVGhlIGN1cnJpZWQgZnVuY3Rpb24gaGFzIHR3byB1bnVzdWFsIGNhcGFiaWxpdGllcy4gRmlyc3QsIGl0c1xuICogYXJndW1lbnRzIG5lZWRuJ3QgYmUgcHJvdmlkZWQgb25lIGF0IGEgdGltZS4gSWYgYGdgIGlzIGBSLmN1cnJ5TigzLCBmKWAsIHRoZVxuICogZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxKSgyKSgzKWBcbiAqICAgLSBgZygxKSgyLCAzKWBcbiAqICAgLSBgZygxLCAyKSgzKWBcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqXG4gKiBTZWNvbmRseSwgdGhlIHNwZWNpYWwgcGxhY2Vob2xkZXIgdmFsdWUgW2BSLl9fYF0oI19fKSBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIFtgUi5fX2BdKCNfXyksXG4gKiB0aGUgZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqICAgLSBgZyhfLCAyLCAzKSgxKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxKSgyKWBcbiAqICAgLSBgZyhfLCBfLCAzKSgxLCAyKWBcbiAqICAgLSBgZyhfLCAyKSgxKSgzKWBcbiAqICAgLSBgZyhfLCAyKSgxLCAzKWBcbiAqICAgLSBgZyhfLCAyKShfLCAzKSgxKWBcbiAqXG4gKiBAYWxpYXMgY3VycnlOXG4gKiBAYWxpYXMgcGFydGlhbFxuICogQHNpbmNlIDUuMC4wLWJldGEuMVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIGFyaXR5IG9mIHRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gcmVjZWl2ZWQgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHJlY2VpdmVkIHRodXMgZmFyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3LCBjdXJyaWVkIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgZnBcbiAqIEByYW1kYSB2MC41LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gKCogLT4gYSkgLT4gKCogLT4gYSlcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FuZHJld3BsdW1tZXIvU3VnYXIvYmxvYi9tYXN0ZXIvbGliL2Z1bmN0aW9uLmpzI0wzODIgc3VnYXItcGFydGlhbH1cbiAqIHtAbGluayBodHRwOi8vZG9jdW1lbnRjbG91ZC5naXRodWIuaW8vdW5kZXJzY29yZS1jb250cmliLyNjdXJyeSB1bmRlcnNjb3JlLWNvbnRyaWItY3Vycnl9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvLmludGVybmFsL2NvbXBvc2VBcmdzLmpzIGxvZGFzaC1jb21wb3NlLWFyZ3N9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2Jsb2IvbWFzdGVyL3VuZGVyc2NvcmUuanMjTDc3MyB1bmRlcnNjb3JlLXBhcnRpYWx9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3JhbWRhL3JhbWRhL2Jsb2IvbWFzdGVyL3NyYy91bmN1cnJ5Ti5qcyByYW1kYS11bmN1cnJ5fVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9yYW1kYS9yYW1kYS9ibG9iL21hc3Rlci9zcmMvY3VycnlOLmpzIHJhbWRhLWN1cnJ5fVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvbWFzdGVyL2N1cnJ5LmpzIGxvZGFzaC1jdXJyeX1cbiAqIEBzZWUge0BsaW5rIHJhbWRhLWN1cnJ5fVxuICogQHNlZSB7QGxpbmsgbG9kYXNoLWN1cnJ5fVxuICogQHNlZSB7QGxpbmsgcmFtZGEtdW5jdXJyeX1cbiAqIEBzZWUge0BsaW5rIHVuZGVyc2NvcmUtcGFydGlhbH1cbiAqIEBzZWUge0BsaW5rIHN1Z2FyLXBhcnRpYWx9XG4gKlxuICogQHR5cGVzIGZwL2N1cnJ5XG4gKiBAdGVzdHMgZnAvY3VycnlcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHN1bUFyZ3MgPSAoLi4uYXJncykgPT4gUi5zdW0oYXJncyk7XG4gKlxuICogICAgICB2YXIgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeU4oNCwgc3VtQXJncyk7XG4gKiAgICAgIHZhciBmID0gY3VycmllZEFkZEZvdXJOdW1iZXJzKDEsIDIpO1xuICogICAgICB2YXIgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqXG4gKi9cbmZ1bmN0aW9uIF9jdXJyeU4obGVuZ3RoLCByZWNlaXZlZCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGNvbWJpbmVkID0gW11cbiAgICBsZXQgYXJnc0lkeCA9IDBcbiAgICBsZXQgbGVmdCA9IGxlbmd0aFxuICAgIGxldCBjb21iaW5lZElkeCA9IDBcblxuICAgIHdoaWxlIChjb21iaW5lZElkeCA8IHJlY2VpdmVkLmxlbmd0aCB8fCBhcmdzSWR4IDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgbGV0IHJlc3VsdFxuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbWJpbmVkSWR4IDwgcmVjZWl2ZWQubGVuZ3RoICYmXG4gICAgICAgICghaXNQbGFjZWhvbGRlcihyZWNlaXZlZFtjb21iaW5lZElkeF0pIHx8IGFyZ3NJZHggPj0gYXJndW1lbnRzLmxlbmd0aClcbiAgICAgICkge1xuICAgICAgICByZXN1bHQgPSByZWNlaXZlZFtjb21iaW5lZElkeF1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbYXJnc0lkeCsrXVxuICAgICAgICAvLyBhcmdzSWR4ICs9IDFcbiAgICAgIH1cbiAgICAgIGNvbWJpbmVkW2NvbWJpbmVkSWR4KytdID0gcmVzdWx0XG4gICAgICBpZiAoIWlzUGxhY2Vob2xkZXIocmVzdWx0KSkge1xuICAgICAgICBsZWZ0IC09IDFcbiAgICAgIH1cbiAgICAgIC8vIGNvbWJpbmVkSWR4ICs9IDFcbiAgICB9XG5cbiAgICByZXR1cm4gbGVmdCA8PSAwXG4gICAgICA/IGZuLmFwcGx5KHRoaXMsIGNvbWJpbmVkKVxuICAgICAgOiBhcml0eShsZWZ0LCBfY3VycnlOKGxlbmd0aCwgY29tYmluZWQsIGZuKSlcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGVxdWl2YWxlbnQgb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCB3aXRoIHRoZSBzcGVjaWZpZWRcbiAqIGFyaXR5LiBUaGUgY3VycmllZCBmdW5jdGlvbiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzXG4gKiBhcmd1bWVudHMgbmVlZG4ndCBiZSBwcm92aWRlZCBvbmUgYXQgYSB0aW1lLiBJZiBgZ2AgaXMgYFIuY3VycnlOKDMsIGYpYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEpKDIpKDMpYFxuICogICAtIGBnKDEpKDIsIDMpYFxuICogICAtIGBnKDEsIDIpKDMpYFxuICogICAtIGBnKDEsIDIsIDMpYFxuICpcbiAqIFNlY29uZGx5LCB0aGUgc3BlY2lhbCBwbGFjZWhvbGRlciB2YWx1ZSBbYFIuX19gXSgjX18pIG1heSBiZSB1c2VkIHRvIHNwZWNpZnlcbiAqIFwiZ2Fwc1wiLCBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsXG4gKiByZWdhcmRsZXNzIG9mIHRoZWlyIHBvc2l0aW9ucy4gSWYgYGdgIGlzIGFzIGFib3ZlIGFuZCBgX2AgaXMgW2BSLl9fYF0oI19fKSxcbiAqIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgZnBcbiAqIEBzaW5jZSB2MC41LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gKCogLT4gYSkgLT4gKCogLT4gYSlcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBhcml0eSBmb3IgdGhlIHJldHVybmVkIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3LCBjdXJyaWVkIGZ1bmN0aW9uLlxuICpcbiAqIEBzZWUgcmFtZGFcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHN1bUFyZ3MgPSAoLi4uYXJncykgPT4gUi5zdW0oYXJncyk7XG4gKlxuICogICAgICB2YXIgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeU4oNCwgc3VtQXJncyk7XG4gKiAgICAgIHZhciBmID0gY3VycmllZEFkZEZvdXJOdW1iZXJzKDEsIDIpO1xuICogICAgICB2YXIgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3VycnlOKGxlbmd0aCwgZm4pIHtcbiAgcmV0dXJuIGFyaXR5KGxlbmd0aCwgX2N1cnJ5TihsZW5ndGgsIFtdLCBmbikpXG59XG4iXSwibmFtZXMiOlsiY29uc3QiLCJsZXQiLCJhcmd1bWVudHMiXSwibWFwcGluZ3MiOiJBQUFBQSxHQUFLLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUNoREEsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUVoQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtFQUNyQyxPQUFPLFdBQVcsQ0FBQzs7QUFBQTtJQUNqQkEsR0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFO0lBQ25CQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUM7SUFDZkEsR0FBRyxDQUFDLElBQUksR0FBRyxNQUFNO0lBQ2pCQSxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUM7O0lBRW5CLE9BQU8sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUU7TUFDbEVBLEdBQUcsQ0FBQyxNQUFNLFdBQUE7O01BRVY7UUFDRSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU07UUFDN0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxPQUFPLElBQUlDLFdBQVMsQ0FBQyxNQUFNLENBQUM7UUFDdEU7UUFDQSxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztPQUMvQjtXQUNJO1FBQ0gsTUFBTSxHQUFHQSxXQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7O09BRTlCO01BQ0QsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsTUFBTTtNQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzFCLElBQUksSUFBSSxDQUFDO09BQ1Y7O0tBRUY7O0lBRUQsT0FBTyxJQUFJLElBQUksQ0FBQztRQUNaLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztRQUN4QixLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0dBQy9DO0NBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdERCxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUU7RUFDM0MsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQzlDOyJ9