sjl.js
function curryN (fn, executeArity) {
        var curriedArgs = restArgs(arguments, 2);
        return function () {
            var args = argsToArray(arguments),
                concatedArgs = replacePlaceHolders(curriedArgs, args),
                placeHolders = concatedArgs.filter(isPlaceholder),
                canBeCalled = (concatedArgs.length - placeHolders.length >= executeArity) || !executeArity;
            return !canBeCalled ? curryN.apply(null, [fn, executeArity].concat(concatedArgs)) :
                fn.apply(null, concatedArgs);
        };
    }
function curryN (fn, executeArity) {
        var curriedArgs = restArgs(arguments, 2);
        return function () {
            var args = argsToArray(arguments),
                concatedArgs = replacePlaceHolders(curriedArgs, args),
                placeHolders = concatedArgs.filter(isPlaceholder),
                canBeCalled = (concatedArgs.length - placeHolders.length >= executeArity) || !executeArity;
            return !canBeCalled ? curryN.apply(null, [fn, executeArity].concat(concatedArgs)) :
                fn.apply(null, concatedArgs);
        };
    }
Curries a function and only executes the function when the arity reaches the .
@function module:sjl.curryN
@param fn - Function to curry.
@param executeArity - Arity at which to execute curried function.
@throws {TypeError} - If `fn` is not a function.