JSFiddle - React, Tailwind, and code Playground

by eccentric_j

JavaScript

function defn (...fns) {
  const fnMap = fns.reduce((o, fn) => {
      return Object.assign(o, {
        [fn.length]: fn
    });
  }, {});
  const defaultFn = fns.find(fn => fn.default);
  if (defaultFn) {
       fnMap.default = defaultFn;
  }
    return (...args) => {
    const length = args.length;
    const fn = fnMap[length];
    
    if (fn) {
        return fn(...args);
    }
    
    if (fnMap.default) {
      return fnMap.default(...args);
    }
    
    return;
  };
}
const add = defn(
  (x) => x,
  (x, y) => x + y,
  (x, y, z) => x + y + z,
)
function log (...args) {
  document.body.innerHTML += args.map(String).join(' ') + '<br />';
}
function clear () {
  document.body.innerHTML = '';
}
clear();
log(add(1));
log(add(1, 2));
log(add(1, 2, 3));
log(add(1, 2, 3, 4));