45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
var isPlainArray       = require("../../is-plain-array")
 | 
						|
  , toPosInt           = require("../../../number/to-pos-integer")
 | 
						|
  , isObject           = require("../../../object/is-object")
 | 
						|
  , isConcatSpreadable = require("es6-symbol").isConcatSpreadable
 | 
						|
  , 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);
 | 
						|
};
 | 
						|
 | 
						|
// eslint-disable-next-line no-unused-vars
 | 
						|
module.exports = function (item/*, …items*/) {
 | 
						|
	var result;
 | 
						|
	if (!this || !isArray(this) || isPlainArray(this)) {
 | 
						|
		return concat.apply(this, arguments);
 | 
						|
	}
 | 
						|
	result = new this.constructor();
 | 
						|
	if (isSpreadable(this)) {
 | 
						|
		forEach.call(this, function (val, i) { result[i] = val; });
 | 
						|
	} else {
 | 
						|
		result[0] = this;
 | 
						|
	}
 | 
						|
	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;
 | 
						|
};
 |