| /** |
| * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> |
| * Build: `lodash modularize modern exports="node" -o ./modern/` |
| * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> |
| * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> |
| * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
| * Available under MIT license <http://lodash.com/license> |
| */ |
| var baseCreateCallback = require('../internals/baseCreateCallback'), |
| baseIsEqual = require('../internals/baseIsEqual'), |
| isObject = require('../objects/isObject'), |
| keys = require('../objects/keys'), |
| property = require('../utilities/property'); |
| |
| /** |
| * Produces a callback bound to an optional `thisArg`. If `func` is a property |
| * name the created callback will return the property value for a given element. |
| * If `func` is an object the created callback will return `true` for elements |
| * that contain the equivalent object properties, otherwise it will return `false`. |
| * |
| * @static |
| * @memberOf _ |
| * @category Utilities |
| * @param {*} [func=identity] The value to convert to a callback. |
| * @param {*} [thisArg] The `this` binding of the created callback. |
| * @param {number} [argCount] The number of arguments the callback accepts. |
| * @returns {Function} Returns a callback function. |
| * @example |
| * |
| * var characters = [ |
| * { 'name': 'barney', 'age': 36 }, |
| * { 'name': 'fred', 'age': 40 } |
| * ]; |
| * |
| * // wrap to create custom callback shorthands |
| * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) { |
| * var match = /^(.+?)__([gl]t)(.+)$/.exec(callback); |
| * return !match ? func(callback, thisArg) : function(object) { |
| * return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3]; |
| * }; |
| * }); |
| * |
| * _.filter(characters, 'age__gt38'); |
| * // => [{ 'name': 'fred', 'age': 40 }] |
| */ |
| function createCallback(func, thisArg, argCount) { |
| var type = typeof func; |
| if (func == null || type == 'function') { |
| return baseCreateCallback(func, thisArg, argCount); |
| } |
| // handle "_.pluck" style callback shorthands |
| if (type != 'object') { |
| return property(func); |
| } |
| var props = keys(func), |
| key = props[0], |
| a = func[key]; |
| |
| // handle "_.where" style callback shorthands |
| if (props.length == 1 && a === a && !isObject(a)) { |
| // fast path the common case of providing an object with a single |
| // property containing a primitive value |
| return function(object) { |
| var b = object[key]; |
| return a === b && (a !== 0 || (1 / a == 1 / b)); |
| }; |
| } |
| return function(object) { |
| var length = props.length, |
| result = false; |
| |
| while (length--) { |
| if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) { |
| break; |
| } |
| } |
| return result; |
| }; |
| } |
| |
| module.exports = createCallback; |