Currying

by Artem

JavaScript

'use strict';

let dragon1 =
  name =>
  size =>
  element =>
  `${name} --- ${size} --- ${element}`;

let dragon = (name, size, element) =>
  `${name} --- ${size} --- ${element}`;

let fluffy = dragon.bind(null, 'fluffy');
let tiny = fluffy.bind(null, 'tiny');
let lightining = tiny.bind(null, 'lightining');

function curry(func) {
  function makeFunction(func, args, argvs) {
    if (args) {
      return function(arg) {
        if (argvs) argvs.push(arg);
        console.log(arg);
        return makeFunction(func, args - 1, argvs);
      }
    }
    return func.apply(this, argvs); // func, 0
  }

  let res = makeFunction(func, func.length, []);
  return res;

  //	return function() {
  //  	return func.apply(this, arguments);
  //  }
}

let test = curry(dragon);
let result = test(3)(5)(7).toString();
console.log(result);

// console.log(lightining());
// console.log(dragon1(1)(2)(3));