foop
Version:
interfaces that describe their intentions.
82 lines (77 loc) • 5.76 kB
JavaScript
/* eslint consistent-return: "OFF" */
var curry = require('../fp/curry')
var hasIn = require('../is/hasIn')
var isFunction = require('../is/function')
/**
* Creates a function that invokes the method at `path` of a given object.
* Any additional arguments are provided to the invoked method.
*
* @name invoke
* @alias method
* @alias callMethod
* @curried 3
*
* @NOTE basically this is `invoker` but not curried
*
* @since 5.0.0-beta.4
* @lodash 3.7.0
* @category Util
*
* @param {Array|string} path The path of the method to invoke.
* @param {Array} [args] The arguments to invoke the method with.
* @returns {Function} Returns the new invoker function.
*
* @see https://github.com/emberjs/ember.js/blob/master/packages/ember-utils/lib/invoke.js
* @see https://github.com/wycats/handlebars.js/blob/master/lib/handlebars/runtime.js#L38
* @see https://github.com/lodash/lodash/blob/master/method.js
*
* @example
*
* const objects = [
* { 'a': { 'b': () => 2 } },
* { 'a': { 'b': () => 1 } }
* ]
*
* map(objects, method('a.b'))
* //=> [2, 1]
*
* map(objects, method(['a', 'b']))
* //=> [2, 1]
*
*/
/**
* @desc call a method when it exists
* @since 5.0.0-beta.4
* @memberOf fp
* @symb 📞
*
* @param {*} x object
* @param {*} key property with method
* @param {*} args arguments
* @return {*}
*
* @TODO add `path` calling, fallback to noop
* @see is/hasIn
*
* {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L294 underscore-invoke}
* {@link https://github.com/lodash/lodash/blob/master/invoke.js lodash-invoke}
* @see {@link lodash-invoke}
* @see {@link underscore-invoke}
*
* @example
*
* var obj = {eh: console.log}
* invoke(obj, 'eh', 'eh!')
* //=> console.log('eh!')
*
* var getTag = invoke(Object.prototype.toString, 'call')
* getTag([])
* //=> '[object Array]'
*
*/
function invoke(x, key, args) {
if (hasIn(x, key) && isFunction(x[key])) { return x[key](args) }
// else return void 0
}
module.exports = curry(3, invoke)
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2tlLmpzIiwic291cmNlcyI6WyJpbnZva2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IGNvbnNpc3RlbnQtcmV0dXJuOiBcIk9GRlwiICovXG5cbmNvbnN0IGN1cnJ5ID0gcmVxdWlyZSgnLi4vZnAvY3VycnknKVxuY29uc3QgaGFzSW4gPSByZXF1aXJlKCcuLi9pcy9oYXNJbicpXG5jb25zdCBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi4vaXMvZnVuY3Rpb24nKVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gKiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAqXG4gKiBAbmFtZSBpbnZva2VcbiAqIEBhbGlhcyBtZXRob2RcbiAqIEBhbGlhcyBjYWxsTWV0aG9kXG4gKiBAY3VycmllZCAzXG4gKlxuICogQE5PVEUgYmFzaWNhbGx5IHRoaXMgaXMgYGludm9rZXJgIGJ1dCBub3QgY3VycmllZFxuICpcbiAqIEBzaW5jZSA1LjAuMC1iZXRhLjRcbiAqIEBsb2Rhc2ggMy43LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL2VtYmVyLmpzL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL2VtYmVyLXV0aWxzL2xpYi9pbnZva2UuanNcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3d5Y2F0cy9oYW5kbGViYXJzLmpzL2Jsb2IvbWFzdGVyL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMjTDM4XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvbWFzdGVyL21ldGhvZC5qc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICBjb25zdCBvYmplY3RzID0gW1xuICogICAgIHsgJ2EnOiB7ICdiJzogKCkgPT4gMiB9IH0sXG4gKiAgICAgeyAnYSc6IHsgJ2InOiAoKSA9PiAxIH0gfVxuICogICBdXG4gKlxuICogICBtYXAob2JqZWN0cywgbWV0aG9kKCdhLmInKSlcbiAqICAgLy89PiBbMiwgMV1cbiAqXG4gKiAgIG1hcChvYmplY3RzLCBtZXRob2QoWydhJywgJ2InXSkpXG4gKiAgIC8vPT4gWzIsIDFdXG4gKlxuICovXG5cbi8qKlxuICogQGRlc2MgY2FsbCBhIG1ldGhvZCB3aGVuIGl0IGV4aXN0c1xuICogQHNpbmNlIDUuMC4wLWJldGEuNFxuICogQG1lbWJlck9mIGZwXG4gKiBAc3ltYiDwn5OeXG4gKlxuICogQHBhcmFtIHsqfSB4IG9iamVjdFxuICogQHBhcmFtIHsqfSBrZXkgcHJvcGVydHkgd2l0aCBtZXRob2RcbiAqIEBwYXJhbSB7Kn0gYXJncyBhcmd1bWVudHNcbiAqIEByZXR1cm4geyp9XG4gKlxuICogQFRPRE8gYWRkIGBwYXRoYCBjYWxsaW5nLCBmYWxsYmFjayB0byBub29wXG4gKiBAc2VlIGlzL2hhc0luXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9ibG9iL21hc3Rlci91bmRlcnNjb3JlLmpzI0wyOTQgdW5kZXJzY29yZS1pbnZva2V9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvaW52b2tlLmpzIGxvZGFzaC1pbnZva2V9XG4gKiBAc2VlIHtAbGluayBsb2Rhc2gtaW52b2tlfVxuICogQHNlZSB7QGxpbmsgdW5kZXJzY29yZS1pbnZva2V9XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICB2YXIgb2JqID0ge2VoOiBjb25zb2xlLmxvZ31cbiAqICAgIGludm9rZShvYmosICdlaCcsICdlaCEnKVxuICogICAgLy89PiBjb25zb2xlLmxvZygnZWghJylcbiAqXG4gKiAgICB2YXIgZ2V0VGFnID0gaW52b2tlKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsICdjYWxsJylcbiAqICAgIGdldFRhZyhbXSlcbiAqICAgIC8vPT4gJ1tvYmplY3QgQXJyYXldJ1xuICpcbiAqL1xuZnVuY3Rpb24gaW52b2tlKHgsIGtleSwgYXJncykge1xuICBpZiAoaGFzSW4oeCwga2V5KSAmJiBpc0Z1bmN0aW9uKHhba2V5XSkpIHJldHVybiB4W2tleV0oYXJncylcbiAgLy8gZWxzZSByZXR1cm4gdm9pZCAwXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3VycnkoMywgaW52b2tlKVxuIl0sIm5hbWVzIjpbImNvbnN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQUEsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3BDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDcENBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0U1QyxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtFQUM1QixJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUEsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUE7O0NBRTdEOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7In0=