Functional programming

Fiddling based on http://objrefnotset.blogspot.fr/2013/03/currying-favor-with-partial-application.html

by tburette

JavaScript

"use strict";

function print(){document.write.apply(document, arguments)};

function curryLeft(func) {
   var slice = Array.prototype.slice;
   var args = slice.call(arguments, 1);
   return function() {
       return func.apply(this, args.concat(args,  slice.call(arguments, 0)));
 
   }
}

print(curryLeft(function(x, y){return x+y}, 1)(2));

function map(f, array){
    var newArray = new Array(array.length);
    return array.reduce(function(previous, current){
        return previous.concat(f(current));
    }, []);
}

//document.write(map(function(x){return x+1;}, [1, 2, 3]));

function foldLeft(func, initial, values){
    return values.reduce(func, initial);
}

var x = foldLeft(function x(acc, newValue){return acc.concat(newValue*2)}, [], [1, 2, 3]);

//recursive process
function filter(func, array){
    return array.length == 0 ? array : 
    (func(array[0])? array.slice(0, 1): []).concat(filter(func, array.slice(1)));
}

//iterative process
filter(function(x){return x < 3;}, [1, 2, 3]);


function selectx(arg){
    return this;
}

var query = function query(array) {
    var tables = [];
    tables.push(array);
    var _query = {
        tables: tables,
        select: selectx,
        
    };
    return _query;
};

x = query([{'a' : 1, 'b' : 2}]);
print(JSON.stringify(x.select('a')));