Source: function/curry2.js

import __ from "./placeholderArgument";
import curry1 from "./curry1";

/**
 * A simplified curry for binary functions.
 *
 * @param {function} fn
 * @return {function}
 */
const curry2 = (fn) =>
  function fn2(a, b) {
    switch (arguments.length) {
      case 0:
        return fn2;

      case 1:
        return a === __ ? fn2 : curry1((b1) => fn(a, b1));

      default:
        if (a === __ && b === __) {
          return fn2;
        }

        if (a === __) {
          return curry1((a1) => fn(a1, b));
        }

        if (b === __) {
          return curry1((b1) => fn(a, b1));
        }

        return fn(a, b);
    }
  };

export default curry2;