console.log('Using imperative JS');

var printArray = function(array){
    for (var i=0; i<array.length; i++){
        console.log(array[i]);
    }
};

printArray([1, 2, 3, 4, 5]);

//how can we abstract the For flow? Can we use a callback for action?

console.log('Using functional JS');

var forEach = function(array, action){
    for (var i=0; i<array.length; i++){
        action(array[i]);
    }
};

var logItem = function (item) {
    console.log(item);
};

forEach([1, 2, 3, 4, 5], logItem);

//how can we abstract the For flow?
console.log('Finding the min value in an array - imperative');

var findMinArray = function(array){
    var minValue = array[0];
    for (var i=1; i<array.length; i++){
        if (minValue > array[i]){
            minValue = array[i];
        }
    }

    return minValue;
};

console.log(findMinArray([8,6,4,5,9]));

console.log('Finding the min value in an array - functional ES2015');
const min_ = function(array){
    return Math.min(...array)
};

//simplifying using arrow functions
const min = arr => Math.min(...arr);

console.log(min_([8,6,4,5,9]));
console.log(min([8,6,4,5,9]));

//concat + reduce
console.log('merge arrays - imperative');

var mergeArrays_ = function(arrays){
    var count = arrays.length,
        newArray = [],
        k =0;
    for (var i=0; i<count; i++){
        for (var j=0; j<arrays[i].length; j++){
            newArray[k++] = arrays[i][j];
        }
    }
    return newArray;
};

console.log(mergeArrays_([[1, 2, 3], [4, 5], [6]]));

console.log('merge arrays - using concat');
var mergeArraysConcat = function(arrays){
    return arrays.reduce( function(p,n){
        return p.concat(n);
    });
};

console.log(mergeArraysConcat([[1, 2, 3], [4, 5], [6]]));

console.log('merge arrays - ES2015');

const mergeArrays = (...arrays) => [].concat(...arrays);
console.log(mergeArrays([1, 2, 3], [4, 5], [6]));

console.log('sum values of arrays - imperative');
var sumValues = function(array){
    var total = array[0];
    for (var i=1; i<array.length; i++){
        total += array[i];
    }
    return total;
};

console.log(sumValues([1, 2, 3, 4, 5]));

//reduce
console.log('sum values of arrays - functional');
var sum_ = function(array){
    return array.reduce(function(a, b){
        return a + b;
    })
};

console.log(sum_([1, 2, 3, 4, 5]));

console.log('sum values of arrays - ES2015');
const sum = arr => arr.reduce((a, b) => a + b);

console.log(sum([1, 2, 3, 4, 5]));

//map
var daysOfWeek = [
    {name: 'Monday', value: 1},
    {name: 'Tuesday', value: 2},
    {name: 'Wednesday', value: 7}
];

var daysOfWeekValues_ = [];
for (var i = 0; i < daysOfWeek.length; i++) {
    daysOfWeekValues_.push(daysOfWeek[i].value);
}

//to
var daysOfWeekValues = daysOfWeek.map(function(day) {
    return day.value;
});
console.log(daysOfWeekValues);


//filter
var positiveNumbers_ = function(array){
    var positive = [];
    for (var i = 0; i < array.length; i++) {
        if (array[i] >= 0){
            positive.push(array[i]);
        }
    }
    return positive;
}
console.log(positiveNumbers_([-1,1,2,-2]));

var positiveNumbers = function(array){
    return array.filter(function(num){
        return num >= 0;
    })
};
console.log(positiveNumbers([-1,1,2,-2]));