silphius/app/util/fast-call.js
2024-07-21 02:30:13 -05:00

37 lines
1.4 KiB
JavaScript

export default function fastCall(fn, holder, args) {
if (holder) {
const {name} = fn;
if ('object' === typeof holder && name in holder && holder[name] === fn) {
switch (args.length) {
case 0 : return holder[name]();
case 1 : return holder[name](args[0]);
case 2 : return holder[name](args[0], args[1]);
case 3 : return holder[name](args[0], args[1], args[2]);
case 4 : return holder[name](args[0], args[1], args[2], args[3]);
case 5 : return holder[name](args[0], args[1], args[2], args[3], args[4]);
default: return holder[name](...args);
}
}
const bound = fn.bind(holder);
switch (args.length) {
case 0 : return bound();
case 1 : return bound(args[0]);
case 2 : return bound(args[0], args[1]);
case 3 : return bound(args[0], args[1], args[2]);
case 4 : return bound(args[0], args[1], args[2], args[3]);
case 5 : return bound(args[0], args[1], args[2], args[3], args[4]);
default: return bound(...args);
}
}
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]);
default: return fn(...args);
}
}