| 'use strict'; |
| var isArray = require('../internals/is-array'); |
| var toLength = require('../internals/to-length'); |
| var bind = require('../internals/bind-context'); |
| |
| // `FlattenIntoArray` abstract operation |
| // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray |
| var flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) { |
| var targetIndex = start; |
| var sourceIndex = 0; |
| var mapFn = mapper ? bind(mapper, thisArg, 3) : false; |
| var element; |
| |
| while (sourceIndex < sourceLen) { |
| if (sourceIndex in source) { |
| element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex]; |
| |
| if (depth > 0 && isArray(element)) { |
| targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1; |
| } else { |
| if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length'); |
| target[targetIndex] = element; |
| } |
| |
| targetIndex++; |
| } |
| sourceIndex++; |
| } |
| return targetIndex; |
| }; |
| |
| module.exports = flattenIntoArray; |