| 'use strict' | 
|   | 
| /** | 
|  * Expose `arrayFlatten`. | 
|  */ | 
| module.exports = flatten | 
| module.exports.from = flattenFrom | 
| module.exports.depth = flattenDepth | 
| module.exports.fromDepth = flattenFromDepth | 
|   | 
| /** | 
|  * Flatten an array. | 
|  * | 
|  * @param  {Array} array | 
|  * @return {Array} | 
|  */ | 
| function flatten (array) { | 
|   if (!Array.isArray(array)) { | 
|     throw new TypeError('Expected value to be an array') | 
|   } | 
|   | 
|   return flattenFrom(array) | 
| } | 
|   | 
| /** | 
|  * Flatten an array-like structure. | 
|  * | 
|  * @param  {Array} array | 
|  * @return {Array} | 
|  */ | 
| function flattenFrom (array) { | 
|   return flattenDown(array, []) | 
| } | 
|   | 
| /** | 
|  * Flatten an array-like structure with depth. | 
|  * | 
|  * @param  {Array}  array | 
|  * @param  {number} depth | 
|  * @return {Array} | 
|  */ | 
| function flattenDepth (array, depth) { | 
|   if (!Array.isArray(array)) { | 
|     throw new TypeError('Expected value to be an array') | 
|   } | 
|   | 
|   return flattenFromDepth(array, depth) | 
| } | 
|   | 
| /** | 
|  * Flatten an array-like structure with depth. | 
|  * | 
|  * @param  {Array}  array | 
|  * @param  {number} depth | 
|  * @return {Array} | 
|  */ | 
| function flattenFromDepth (array, depth) { | 
|   if (typeof depth !== 'number') { | 
|     throw new TypeError('Expected the depth to be a number') | 
|   } | 
|   | 
|   return flattenDownDepth(array, [], depth) | 
| } | 
|   | 
| /** | 
|  * Flatten an array indefinitely. | 
|  * | 
|  * @param  {Array} array | 
|  * @param  {Array} result | 
|  * @return {Array} | 
|  */ | 
| function flattenDown (array, result) { | 
|   for (var i = 0; i < array.length; i++) { | 
|     var value = array[i] | 
|   | 
|     if (Array.isArray(value)) { | 
|       flattenDown(value, result) | 
|     } else { | 
|       result.push(value) | 
|     } | 
|   } | 
|   | 
|   return result | 
| } | 
|   | 
| /** | 
|  * Flatten an array with depth. | 
|  * | 
|  * @param  {Array}  array | 
|  * @param  {Array}  result | 
|  * @param  {number} depth | 
|  * @return {Array} | 
|  */ | 
| function flattenDownDepth (array, result, depth) { | 
|   depth-- | 
|   | 
|   for (var i = 0; i < array.length; i++) { | 
|     var value = array[i] | 
|   | 
|     if (depth > -1 && Array.isArray(value)) { | 
|       flattenDownDepth(value, result, depth) | 
|     } else { | 
|       result.push(value) | 
|     } | 
|   } | 
|   | 
|   return result | 
| } |