diff --git a/lib/fp/base.js b/lib/fp/base.js index d08b9d368..69f47979a 100644 --- a/lib/fp/base.js +++ b/lib/fp/base.js @@ -56,58 +56,33 @@ function baseConvert(util, name, func) { }; }; - var immutArrayWrap = function(func) { - return function() { - var index = -1, - length = arguments.length, - args = Array(length); + var cloneArray = function(array) { + var length = array ? array.length : 0, + result = Array(length); - while (length--) { - args[length] = arguments[length]; - } - var array = args[0]; - length = array ? array.length : 0; + while (length--) { + result[length] = array[length]; + } + return result; + }; - args[0] = Array(length); - while (++index < length) { - args[0][index] = array[index]; - } - func.apply(undefined, args); - return args[0]; + var createCloner = function(func) { + return function(object) { + return func({}, object); }; }; - var immutObjectWrap = function(func) { - return function() { - var index = -1, - length = arguments.length, - args = Array(length); - - while (++index < length) { - args[index] = arguments[index]; - } - args[0] = func({}, args[0]); - func.apply(undefined, args); - return args[0]; - }; - }; - - var immutSetWrap = function(func) { - return function() { - var index = -1, - length = arguments.length, - args = Array(length); - - while (++index < length) { - args[index] = arguments[index]; - } - args[0] = cloneDeep(args[0]); - func.apply(undefined, args); - return args[0]; - }; + var immutWrap = function(func, cloner) { + return overArg(func, cloner, true); }; var iterateeAry = function(func, n) { + return overArg(func, function(func) { + return baseAry(func, n); + }); + }; + + var overArg = function(func, iteratee, retArg) { return function() { var length = arguments.length, args = Array(length); @@ -115,8 +90,9 @@ function baseConvert(util, name, func) { while (length--) { args[length] = arguments[length]; } - args[0] = baseAry(args[0], n); - return func.apply(undefined, args); + args[0] = iteratee(args[0]); + var result = func.apply(undefined, args); + return retArg ? args[0] : result; }; }; @@ -172,13 +148,13 @@ function baseConvert(util, name, func) { return wrapper(func); } if (mutateMap.array[name]) { - func = immutArrayWrap(func); + func = immutWrap(func, cloneArray); } else if (mutateMap.object[name]) { - func = immutObjectWrap(func); + func = immutWrap(func, createCloner(func)); } else if (mutateMap.set[name]) { - func = immutSetWrap(func); + func = immutWrap(func, cloneDeep); } var result; each(mapping.caps, function(cap) {