function-as
Version:
Pass functions as if they had, one or more, constant args
40 lines (35 loc) • 987 B
JavaScript
Function.prototype.asfirst = function (...dargs) {
return function (...args) {
fillUndefs(dargs, args, false);
return this(...dargs,
...args.splice(dargs.length));
}.bind(this);
};
Function.prototype.aslast = function (...dargs) {
return function (...args) {
fillUndefs(dargs, args, true);
var dlen = dargs.length;
return this(...(args.splice(
Math.max(0, args.length - dlen), dlen)
&& args), ...dargs);
}.bind(this);
};
Function.prototype.as = function (fargs, largs) {
fargs = fargs || [];
largs = largs || [];
return this.asfirst(...fargs).aslast(...largs);
};
function fillUndefs(dargs, args, last) {
let undef = dargs.indexOf(undefined);
let aindex;
while (undef >= 0) {
if (undef < args.length) {
aindex = last ?
undef + Math.max(args.length - dargs.length, 0) :
undef;
dargs[undef] = args[aindex];
undef = dargs.indexOf(undefined);
} else break;
}
}
module.exports = true;