| 'use strict'; |
| |
| var isPlainArray = require('../../is-plain-array') |
| , toPosInt = require('../../../number/to-pos-integer') |
| , isObject = require('../../../object/is-object') |
| |
| , isArray = Array.isArray, concat = Array.prototype.concat |
| , forEach = Array.prototype.forEach |
| |
| , isSpreadable; |
| |
| isSpreadable = function (value) { |
| if (!value) return false; |
| if (!isObject(value)) return false; |
| if (value['@@isConcatSpreadable'] !== undefined) { |
| return Boolean(value['@@isConcatSpreadable']); |
| } |
| return isArray(value); |
| }; |
| |
| module.exports = function (item/*, …items*/) { |
| var result; |
| if (!this || !isArray(this) || isPlainArray(this)) { |
| return concat.apply(this, arguments); |
| } |
| result = new this.constructor(this.length); |
| forEach.call(this, function (val, i) { result[i] = val; }); |
| forEach.call(arguments, function (arg) { |
| var base; |
| if (isSpreadable(arg)) { |
| base = result.length; |
| result.length += toPosInt(arg.length); |
| forEach.call(arg, function (val, i) { result[base + i] = val; }); |
| return; |
| } |
| result.push(arg); |
| }); |
| return result; |
| }; |