Websocket
[VSoRC/.git] / node_modules / array-flatten / array-flatten.js
1 'use strict'
2
3 /**
4  * Expose `arrayFlatten`.
5  */
6 module.exports = arrayFlatten
7
8 /**
9  * Recursive flatten function with depth.
10  *
11  * @param  {Array}  array
12  * @param  {Array}  result
13  * @param  {Number} depth
14  * @return {Array}
15  */
16 function flattenWithDepth (array, result, depth) {
17   for (var i = 0; i < array.length; i++) {
18     var value = array[i]
19
20     if (depth > 0 && Array.isArray(value)) {
21       flattenWithDepth(value, result, depth - 1)
22     } else {
23       result.push(value)
24     }
25   }
26
27   return result
28 }
29
30 /**
31  * Recursive flatten function. Omitting depth is slightly faster.
32  *
33  * @param  {Array} array
34  * @param  {Array} result
35  * @return {Array}
36  */
37 function flattenForever (array, result) {
38   for (var i = 0; i < array.length; i++) {
39     var value = array[i]
40
41     if (Array.isArray(value)) {
42       flattenForever(value, result)
43     } else {
44       result.push(value)
45     }
46   }
47
48   return result
49 }
50
51 /**
52  * Flatten an array, with the ability to define a depth.
53  *
54  * @param  {Array}  array
55  * @param  {Number} depth
56  * @return {Array}
57  */
58 function arrayFlatten (array, depth) {
59   if (depth == null) {
60     return flattenForever(array, [])
61   }
62
63   return flattenWithDepth(array, [], depth)
64 }