UNPKG

diffusion

Version:

Diffusion JavaScript client

77 lines (76 loc) 2.33 kB
"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;