24 lines
1.0 KiB
JavaScript
24 lines
1.0 KiB
JavaScript
function partialRight(func, ...partialArgs) {
|
|
return partialRightImpl(func, placeholderSymbol, ...partialArgs);
|
|
}
|
|
function partialRightImpl(func, placeholder, ...partialArgs) {
|
|
const partialedRight = function (...providedArgs) {
|
|
const placeholderLength = partialArgs.filter(arg => arg === placeholder).length;
|
|
const rangeLength = Math.max(providedArgs.length - placeholderLength, 0);
|
|
const remainingArgs = providedArgs.slice(0, rangeLength);
|
|
let providedArgsIndex = rangeLength;
|
|
const substitutedArgs = partialArgs
|
|
.slice()
|
|
.map(arg => (arg === placeholder ? providedArgs[providedArgsIndex++] : arg));
|
|
return func.apply(this, remainingArgs.concat(substitutedArgs));
|
|
};
|
|
if (func.prototype) {
|
|
partialedRight.prototype = Object.create(func.prototype);
|
|
}
|
|
return partialedRight;
|
|
}
|
|
const placeholderSymbol = Symbol('partialRight.placeholder');
|
|
partialRight.placeholder = placeholderSymbol;
|
|
|
|
export { partialRight, partialRightImpl };
|