diff --git a/lib/variadic.js b/lib/variadic.js index d6a0b06..8da45bf 100644 --- a/lib/variadic.js +++ b/lib/variadic.js @@ -4,40 +4,21 @@ function variadic(fn) { if (!isFn(fn)) throw new TypeError('Parameter `fn` must be a function.') const argc = fn.length - 1 - , argn = String(fn).replace(argexp, "$1").split(/,\s*/).slice(0, -1) - , fnsrc = gensrc(fn, argn, argc) - return eval(fnsrc).bind(fn) -} - -const argexp = /function[^\(]*\(([^\)]*)\)(?:\n|.)*/ - , isFn = require('./isFn') - -function gensrc(fn, argn, argc) { if (argc) { - body = - [ 'const head = [].slice.call(arguments, 0, '+argc+')' - , ' , tail = [].slice.call(arguments, '+argc+')' - , 'return this.apply(null, head.concat([tail]))' - ].join('\n') + return function variadic() { + const head = slice(arguments, 0, argc) + , tail = slice(arguments, argc) + + return fn.apply(this, head.concat([tail])) + } } else { - body = - [ 'const rest = [].slice.call(arguments)' - , 'return this.call(null, rest)' - ].join('\n') + return function variadic() { + const rest = slice(arguments) + return fn.call(this, rest) + } } +} - const src = - [ '(function() {' - , ' var {name} = function {name}({params}) {' - , ' ' + body.replace(/\n/g, '\n ') - , ' }' - , ' return {name}' - , '}())' - ] - .join('\n') - .replace(/{name}/g, fn.name || 'variadic') - .replace(/{params}/g, argn.join(', ')) - - return src -} \ No newline at end of file +const slice = require('./slice') + , isFn = require('./isFn') \ No newline at end of file diff --git a/test/variadic.js b/test/variadic.js index 18bf845..5fe7def 100644 --- a/test/variadic.js +++ b/test/variadic.js @@ -33,11 +33,6 @@ describe('variadic', function() { describe('when given `' + src(fn) + '`', function() { const varfn = variadic(fn) - it('should return a function of length ' + (fn.length - 1), function() { - expect(varfn).to.be.a('function') - expect(varfn.length).to.equal(fn.length - 1) - }) - each(test.slice(1), function(args) { const argsrc = args.length? '`' + src(args).slice(1, -1) + '`' : 'nothing'