1 var mapping = require('./_mapping'),
2 mutateMap = mapping.mutate,
6 * The base implementation of `convert` which accepts a `util` object of methods
7 * required to perform conversions.
9 * @param {Object} util The util object.
10 * @param {string} name The name of the function to wrap.
11 * @param {Function} func The function to wrap.
12 * @returns {Function|Object} Returns the converted function or object.
14 function baseConvert(util, name, func) {
15 if (typeof func != 'function') {
22 var isLib = name === undefined && typeof func.VERSION == 'string';
24 var _ = isLib ? func : {
26 'cloneDeep': util.cloneDeep,
28 'forEach': util.forEach,
29 'isFunction': util.isFunction,
30 'iteratee': util.iteratee,
36 cloneDeep = _.cloneDeep,
39 isFunction = _.isFunction,
43 var baseArity = function(func, n) {
45 ? function(a, b) { return func.apply(undefined, arguments); }
46 : function(a) { return func.apply(undefined, arguments); };
49 var baseAry = function(func, n) {
51 ? function(a, b) { return func(a, b); }
52 : function(a) { return func(a); };
55 var cloneArray = function(array) {
56 var length = array ? array.length : 0,
57 result = Array(length);
60 result[length] = array[length];
65 var createCloner = function(func) {
66 return function(object) {
67 return func({}, object);
71 var immutWrap = function(func, cloner) {
72 return overArg(func, cloner, true);
75 var iterateeAry = function(func, n) {
76 return overArg(func, function(func) {
77 return baseAry(func, n);
81 var iterateeRearg = function(func, indexes) {
82 return overArg(func, function(func) {
83 var n = indexes.length;
84 return baseArity(rearg(baseAry(func, n), indexes), n);
88 var overArg = function(func, iteratee, retArg) {
90 var length = arguments.length,
94 args[length] = arguments[length];
96 args[0] = iteratee(args[0]);
97 var result = func.apply(undefined, args);
98 return retArg ? args[0] : result;
103 'iteratee': function(iteratee) {
105 var func = arguments[0],
106 arity = arguments[1];
108 arity = arity > 2 ? (arity - 2) : 1;
109 func = iteratee(func);
110 var length = func.length;
111 return (length && length <= arity) ? func : baseAry(func, arity);
114 'mixin': function(mixin) {
115 return function(source) {
117 if (!isFunction(func)) {
118 return mixin(func, Object(source));
123 each(keys(source), function(key) {
124 var value = source[key];
125 if (isFunction(value)) {
126 methodNames.push(key);
127 methods.push(func.prototype[key]);
131 mixin(func, Object(source));
133 each(methodNames, function(methodName, index) {
134 var method = methods[index];
135 if (isFunction(method)) {
136 func.prototype[methodName] = method;
138 delete func.prototype[methodName];
144 'runInContext': function(runInContext) {
145 return function(context) {
146 return baseConvert(util, runInContext(context));
151 var wrap = function(name, func) {
152 var wrapper = wrappers[name];
154 return wrapper(func);
156 if (mutateMap.array[name]) {
157 func = immutWrap(func, cloneArray);
159 else if (mutateMap.object[name]) {
160 func = immutWrap(func, createCloner(func));
162 else if (mutateMap.set[name]) {
163 func = immutWrap(func, cloneDeep);
166 each(mapping.caps, function(cap) {
167 each(mapping.aryMethod[cap], function(otherName) {
168 if (name == otherName) {
169 var indexes = mapping.iterateeRearg[name],
170 n = !isLib && mapping.aryIteratee[name];
172 result = ary(func, cap);
173 if (cap > 1 && !mapping.skipRearg[name]) {
174 result = rearg(result, mapping.methodRearg[name] || mapping.aryRearg[cap]);
177 result = iterateeRearg(result, indexes);
179 result = iterateeAry(result, n);
182 result = curry(result, cap);
190 result || (result = func);
191 if (mapping.placeholder[name]) {
192 result.placeholder = placeholder;
198 return wrap(name, func);
200 // Iterate over methods for the current ary cap.
202 each(mapping.caps, function(cap) {
203 each(mapping.aryMethod[cap], function(key) {
204 var func = _[mapping.key[key] || key];
206 pairs.push([key, wrap(key, func)]);
211 // Assign to `_` leaving `_.prototype` unchanged to allow chaining.
212 each(pairs, function(pair) {
213 _[pair[0]] = pair[1];
216 // Wrap the lodash method and its aliases.
217 each(keys(_), function(key) {
218 each(mapping.alias[key] || [], function(alias) {
226 module.exports = baseConvert;