00001 var apply = require('./_apply'), 00002 createCtor = require('./_createCtor'), 00003 createHybrid = require('./_createHybrid'), 00004 createRecurry = require('./_createRecurry'), 00005 getHolder = require('./_getHolder'), 00006 replaceHolders = require('./_replaceHolders'), 00007 root = require('./_root'); 00008 00018 function createCurry(func, bitmask, arity) { 00019 var Ctor = createCtor(func); 00020 00021 function wrapper() { 00022 var length = arguments.length, 00023 args = Array(length), 00024 index = length, 00025 placeholder = getHolder(wrapper); 00026 00027 while (index--) { 00028 args[index] = arguments[index]; 00029 } 00030 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) 00031 ? [] 00032 : replaceHolders(args, placeholder); 00033 00034 length -= holders.length; 00035 if (length < arity) { 00036 return createRecurry( 00037 func, bitmask, createHybrid, wrapper.placeholder, undefined, 00038 args, holders, undefined, undefined, arity - length); 00039 } 00040 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; 00041 return apply(fn, this, args); 00042 } 00043 return wrapper; 00044 } 00045 00046 module.exports = createCurry;