nikcorg/funcalicious

View on GitHub
src/call.js

Summary

Maintainability
C
7 hrs
Test Coverage
const callFunction = (fn, fixedArgs) => {
    return (...args) => {
        // Prepend fixed args when present
        if (fixedArgs && fixedArgs.length > 0) {
            args = [...fixedArgs, ...args];
        }

        switch (args.length) {
            case 4:
                return fn(args[0], args[1], args[2], args[3]);
            case 3:
                return fn(args[0], args[1], args[2]);
            case 2:
                return fn(args[0], args[1]);
            case 1:
                return fn(args[0]);
            case 0:
                return fn();
        }

        return fn(...args);
    };
}

const callMethod = (method, args) => {
    if (args.length > 0) {
        return o => {
            switch (args.length) {
                case 4:
                    return o[method](args[0], args[1], args[2], args[3]);
                case 3:
                    return o[method](args[0], args[1], args[2]);
                case 2:
                    return o[method](args[0], args[1]);
                case 1:
                    return o[method](args[0]);
            }

            return o[method](...args);
        };
    }

    return o => {
        return o[method]();
    };
}

export const call = (fn, ...args) => {
    if (typeof fn === "string") {
        return callMethod(fn, args);
    }

    return callFunction(fn, args);
}