code: function curry(fn) {
    return function(...xs) {
      const args =
        xs.length ? xs : [ undefined ]
  
      if(args.length < fn.length) {
        return curry(Function.bind.apply(fn, [ null ].concat(args)))
      }
  
      const val = args.length === fn.length
        ? fn.apply(null, args)
        : args.reduce(applyCurry, fn)
  
      if(isFunction(val)) {
        return curry(val)
      }
  
      return val
    }
  }
docs: curry : ((a, b, c) -> d) -> a -> b -> c -> d