| Leo Repp | 58b9f11 | 2021-11-22 11:57:47 +0100 | [diff] [blame^] | 1 | var toInteger = require('./toInteger'); |
| 2 | |
| 3 | /** Error message constants. */ |
| 4 | var FUNC_ERROR_TEXT = 'Expected a function'; |
| 5 | |
| 6 | /** |
| 7 | * Creates a function that invokes `func`, with the `this` binding and arguments |
| 8 | * of the created function, while it's called less than `n` times. Subsequent |
| 9 | * calls to the created function return the result of the last `func` invocation. |
| 10 | * |
| 11 | * @static |
| 12 | * @memberOf _ |
| 13 | * @since 3.0.0 |
| 14 | * @category Function |
| 15 | * @param {number} n The number of calls at which `func` is no longer invoked. |
| 16 | * @param {Function} func The function to restrict. |
| 17 | * @returns {Function} Returns the new restricted function. |
| 18 | * @example |
| 19 | * |
| 20 | * jQuery(element).on('click', _.before(5, addContactToList)); |
| 21 | * // => Allows adding up to 4 contacts to the list. |
| 22 | */ |
| 23 | function before(n, func) { |
| 24 | var result; |
| 25 | if (typeof func != 'function') { |
| 26 | throw new TypeError(FUNC_ERROR_TEXT); |
| 27 | } |
| 28 | n = toInteger(n); |
| 29 | return function() { |
| 30 | if (--n > 0) { |
| 31 | result = func.apply(this, arguments); |
| 32 | } |
| 33 | if (n <= 1) { |
| 34 | func = undefined; |
| 35 | } |
| 36 | return result; |
| 37 | }; |
| 38 | } |
| 39 | |
| 40 | module.exports = before; |