UNPKG

foop

Version:

interfaces that describe their intentions.

82 lines (77 loc) 5.76 kB
/* 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=