'use strict';

var toPosInt     = require('../../number/to-pos-integer')
  , callable     = require('../../object/valid-callable')
  , defineLength = require('../_define-length')

  , slice = Array.prototype.slice, apply = Function.prototype.apply
  , curry;

curry = function self(fn, length, preArgs) {
	return defineLength(function () {
		var args = preArgs ?
				preArgs.concat(slice.call(arguments, 0, length - preArgs.length)) :
				slice.call(arguments, 0, length);
		return (args.length === length) ? apply.call(fn, this, args) :
				self(fn, length, args);
	}, preArgs ? (length - preArgs.length) : length);
};

module.exports = function (/*length*/) {
	var length = arguments[0];
	return curry(callable(this),
		isNaN(length) ? toPosInt(this.length) : toPosInt(length));
};
