| var arrayPush = require('./_arrayPush'), | |
|     isFlattenable = require('./_isFlattenable'); | |
| 
 | |
| /** | |
|  * The base implementation of `_.flatten` with support for restricting flattening. | |
|  * | |
|  * @private | |
|  * @param {Array} array The array to flatten. | |
|  * @param {number} depth The maximum recursion depth. | |
|  * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. | |
|  * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. | |
|  * @param {Array} [result=[]] The initial result value. | |
|  * @returns {Array} Returns the new flattened array. | |
|  */ | |
| function baseFlatten(array, depth, predicate, isStrict, result) { | |
|   var index = -1, | |
|       length = array.length; | |
| 
 | |
|   predicate || (predicate = isFlattenable); | |
|   result || (result = []); | |
| 
 | |
|   while (++index < length) { | |
|     var value = array[index]; | |
|     if (depth > 0 && predicate(value)) { | |
|       if (depth > 1) { | |
|         // Recursively flatten arrays (susceptible to call stack limits). | |
|         baseFlatten(value, depth - 1, predicate, isStrict, result); | |
|       } else { | |
|         arrayPush(result, value); | |
|       } | |
|     } else if (!isStrict) { | |
|       result[result.length] = value; | |
|     } | |
|   } | |
|   return result; | |
| } | |
| 
 | |
| module.exports = baseFlatten;
 |