'use strict';

var isPlainArray = require('../../is-plain-array')
  , callable     = require('../../../object/valid-callable')

  , isArray = Array.isArray, map = Array.prototype.map
  , forEach = Array.prototype.forEach, call = Function.prototype.call;

module.exports = function (callbackFn/*, thisArg*/) {
	var result, thisArg;
	if (!this || !isArray(this) || isPlainArray(this)) {
		return map.apply(this, arguments);
	}
	callable(callbackFn);
	thisArg = arguments[1];
	result = new this.constructor(this.length);
	forEach.call(this, function (val, i, self) {
		result[i] = call.call(callbackFn, thisArg, val, i, self);
	});
	return result;
};
