const _ = Symbol('placeholder');
function partialWithPlaceholders(fn, ...presetArgs) {
return function (...laterArgs) {
let args = [];
let laterIdx = 0;
for (let i = 0; i < presetArgs.length; ++i) {
if (presetArgs[i] === _) {
args.push(laterArgs[laterIdx++]);
} else {
args.push(presetArgs[i]);
}
}
while (laterIdx < laterArgs.length) {
args.push(laterArgs[laterIdx++]);
}
return fn(...args);
};
}
function foo(a, b, ...rest) {
return rest[1];
}
const part = partialWithPlaceholders(foo, 1, _, 2, 3, _);
console.log(part(99));
const part2 = partialWithPlaceholders(foo, _, 10, 20, 30, 40);
console.log(part2(7));