Medium

by hguerra

JavaScript

function last(arr){
	return arr[arr.length-1];
}

function clone(arr){
	var newArr = [];
	for (var i = 0; i < arr.length; i++){
		newArr[i] = arr[i];
	}
	
	return newArr;
}

function push(arr, elem){
	arr[arr.length] = elem;
	return arr;
}

function purePop(arr){
	var newArr = [];
	for (var i = 0; i < arr.length-1; i++){
		newArr[newArr.length] = arr[i];
	}
	
	return newArr;
}

function shift(arr){
	var first = arr[0];
	for (var i = 1; i < arr.length; i++){
		arr[i-1] = arr[i];
	}
	
	arr.length = arr.length > 0 ? arr.length - 1 : 0;
	return first;
}

function unshift(arr, elem){
	var temp = clone(arr);
	for (var i = 0; i <= temp.length; i++){
		arr[i] = i === 0 ? elem : temp[i-1];
	}
	
	return arr;
}

function concat(arr, list){
	var newArr = clone(arr);
	for (var i = 0; i < list.length; i++){
		newArr[newArr.length] = list[i];
	}
	
	return newArr;
}

function includes(arr, elem){
	for (var i = 0; i < arr.length; i++){
		if (arr[i] === elem){
			return true;
		}
	}
	
	return false;
}

function fill(length, arr){
	var arr = arr === undefined ? [] : arr;
	var newArr = [];	
	for (var i = 0; i < length; i++){
		newArr[newArr.length] = arr[i];
	}
	
	return newArr;
}

function filter(arr, callback, external){
	var thisArg = {'value': external};
	var newArr = [];

	for (var i = 0; i < arr.length; i++){
		var elem = arr[i];		
		var val = external === undefined 
			? callback(elem, i, arr) 
			: callback.apply(thisArg, [elem, i, arr]);
		
		if (val)
			newArr[newArr.length] = elem;
	}

	return newArr;
}

function map(arr, callback, external){
	var thisArg = {"value": external};
	var newArr = [];
	for (var i = 0; i < arr.length; i++){
		var elem = arr[i];
		newArr[newArr.length] = external === undefined
			? callback(elem, i, arr)
			: callback.apply(thisArg, [elem, i, arr]);
	}
	
	return newArr;
}

function forEach(arr, callback){
	for (var i = 0; i < arr.length; i++){
		var elem = arr[i];
		callback(elem, i, arr);
	}
}

function reduce(arr, callback, thisArg){
	var ref =...