| 'use strict' | 
|   | 
| /** | 
|  * Expose `arrayFlatten`. | 
|  */ | 
| module.exports = arrayFlatten | 
|   | 
| /** | 
|  * Recursive flatten function with depth. | 
|  * | 
|  * @param  {Array}  array | 
|  * @param  {Array}  result | 
|  * @param  {Number} depth | 
|  * @return {Array} | 
|  */ | 
| function flattenWithDepth (array, result, depth) { | 
|   for (var i = 0; i < array.length; i++) { | 
|     var value = array[i] | 
|   | 
|     if (depth > 0 && Array.isArray(value)) { | 
|       flattenWithDepth(value, result, depth - 1) | 
|     } else { | 
|       result.push(value) | 
|     } | 
|   } | 
|   | 
|   return result | 
| } | 
|   | 
| /** | 
|  * Recursive flatten function. Omitting depth is slightly faster. | 
|  * | 
|  * @param  {Array} array | 
|  * @param  {Array} result | 
|  * @return {Array} | 
|  */ | 
| function flattenForever (array, result) { | 
|   for (var i = 0; i < array.length; i++) { | 
|     var value = array[i] | 
|   | 
|     if (Array.isArray(value)) { | 
|       flattenForever(value, result) | 
|     } else { | 
|       result.push(value) | 
|     } | 
|   } | 
|   | 
|   return result | 
| } | 
|   | 
| /** | 
|  * Flatten an array, with the ability to define a depth. | 
|  * | 
|  * @param  {Array}  array | 
|  * @param  {Number} depth | 
|  * @return {Array} | 
|  */ | 
| function arrayFlatten (array, depth) { | 
|   if (depth == null) { | 
|     return flattenForever(array, []) | 
|   } | 
|   | 
|   return flattenWithDepth(array, [], depth) | 
| } |