/**
 * Creates an array that is the composition of partially applied arguments,
 * placeholders, and provided arguments into a single array of arguments.
 *
 * @private
 * @param {Array} args The provided arguments.
 * @param {Array} partials The arguments to prepend to those provided.
 * @param {Array} holders The `partials` placeholder indexes.
 * @params {boolean} [isCurried] Specify composing for a curried function.
 * @returns {Array} Returns the new array of composed arguments.
 */
function composeArgs(args: Array<any>, partials: Array<any>, holders: Array<any>, isCurried: boolean): Array<any> {
    const argsLength = args.length;
    const holdersLength = holders.length;
    const leftLength = partials.length;

    let argsIndex = -1;
    let leftIndex = -1;
    let rangeLength = Math.max(argsLength - holdersLength, 0);

    const result = new Array(leftLength + rangeLength);
    const isUncurried = !isCurried;

    while (++leftIndex < leftLength) {
        result[leftIndex] = partials[leftIndex];
    }
    while (++argsIndex < holdersLength) {
        if (isUncurried || argsIndex < argsLength) {
            result[holders[argsIndex]] = args[argsIndex];
        }
    }
    while (rangeLength--) {
        result[leftIndex++] = args[argsIndex++];
    }
    return result;
}

export default composeArgs;
// /**
//  * Creates an array that is the composition of partially applied arguments,
//  * placeholders, and provided arguments into a single array of arguments.
//  *
//  * @private
//  * @param {Array} args The provided arguments.
//  * @param {Array} partials The arguments to prepend to those provided.
//  * @param {Array} holders The `partials` placeholder indexes.
//  * @params {boolean} [isCurried] Specify composing for a curried function.
//  * @returns {Array} Returns the new array of composed arguments.
//  */
// function composeArgs(args, partials, holders, isCurried) {
//     const argsLength = args.length;
//     const holdersLength = holders.length;
//     const leftLength = partials.length;

//     let argsIndex = -1;
//     let leftIndex = -1;
//     let rangeLength = Math.max(argsLength - holdersLength, 0);

//     const result = new Array(leftLength + rangeLength);
//     const isUncurried = !isCurried;

//     while (++leftIndex < leftLength) {
//         result[leftIndex] = partials[leftIndex];
//     }
//     while (++argsIndex < holdersLength) {
//         if (isUncurried || argsIndex < argsLength) {
//             result[holders[argsIndex]] = args[argsIndex];
//         }
//     }
//     while (rangeLength--) {
//         result[leftIndex++] = args[argsIndex++];
//     }
//     return result;
// }

// export default composeArgs;
