diffusion
Version:
Diffusion JavaScript client
77 lines (76 loc) • 2.33 kB
JavaScript
"use strict";
/**
* @module Util.Function
*
* @brief Utility functions for function calls
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.identity = exports.callWithArguments = exports.curryR = void 0;
/**
* Basic curry-right; provides partial application with arguments on the right
*
* @param fn the function to call
* @param args the arguments passed to the function as the trailing arguments
* @return the curried function
*/
function curryR(fn) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
return function () {
var leftArgs = [];
for (var _i = 0; _i < arguments.length; _i++) {
leftArgs[_i] = arguments[_i];
}
return callWithArguments(fn, leftArgs.concat(args));
};
}
exports.curryR = curryR;
/**
* Call a function with arguments passed in as an array
*
* Optimisation of `Function.apply` for small number of arguments
*
* `Function.apply` is more than 20 times slower than direct function calls
* see https://jsperf.com/function-versus-function-call-versus-function-apply
*
* @param fn the function to call
* @param args the arguments in n array
* @return the return value of the function call
*/
function callWithArguments(fn, args) {
// optimise for manageable numbers of arguments
switch (args.length) {
case 0:
return fn();
case 1:
return fn(args[0]);
case 2:
return fn(args[0], args[1]);
case 3:
return fn(args[0], args[1], args[2]);
case 4:
return fn(args[0], args[1], args[2], args[3]);
case 5:
return fn(args[0], args[1], args[2], args[3], args[4]);
case 6:
return fn(args[0], args[1], args[2], args[3], args[4], args[5]);
case 7:
return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
case 8:
return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
}
return fn.apply(fn, args);
}
exports.callWithArguments = callWithArguments;
/**
* The identity function
*
* @param val a value
* @return the input value `val`
*/
function identity(val) {
return val;
}
exports.identity = identity;