foop
Version:
interfaces that describe their intentions.
56 lines (54 loc) • 4.84 kB
JavaScript
var isArray = require('../is/array')
var isFunction = require('../is/function')
var argumentor = require('../cast/argumentor')
/**
* This checks whether a function has a [methodname] function. If it isn't an
* array it will execute that function otherwise it will default to the internal
* implementation.
*
* @memberOf fp
* @since 5.0.0-beta.5
*
* @name preferExistingMethod
* @alias useMethodIfExists
* @alias _checkForMethod
*
* @param {Function} fn internal implemtation
* @param {String} methodname property to check for a custom implementation
* @return {Object} Whatever the return value of the method is.
*
* {@link https://github.com/ramda/ramda/blob/master/src/internal/_checkForMethod.js ramda-check-for-method}
* @see {@link ramda-check-for-method}
*
* @TODO arity
*
* @example
*
* const fallback = (list, index) => Array.prototype.slice.call(list, index)
* const slice = useMethodIfExists('slice', fallback)
*
* const list = ['zero', 'one']
* const sliced = (list, 0)
* /// uses list.slice(0)
* //=> 0
*
*/
module.exports = function preferExistingMethod(methodname, fn) {
return function() {
var length = arguments.length
if (length === 0) {
return fn()
}
else {
var obj = arguments[length - 1]
return (isArray(obj) || !isFunction(obj[methodname]))
? fn.apply(this, arguments)
: obj[methodname]
.apply(
obj,
argumentor.apply(null, arguments).slice(length - 1)
)
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyRXhpc3RpbmdNZXRob2QuanMiLCJzb3VyY2VzIjpbInByZWZlckV4aXN0aW5nTWV0aG9kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pcy9hcnJheScpXG5jb25zdCBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi4vaXMvZnVuY3Rpb24nKVxuY29uc3QgYXJndW1lbnRvciA9IHJlcXVpcmUoJy4uL2Nhc3QvYXJndW1lbnRvcicpXG5cbi8qKlxuICogVGhpcyBjaGVja3Mgd2hldGhlciBhIGZ1bmN0aW9uIGhhcyBhIFttZXRob2RuYW1lXSBmdW5jdGlvbi4gSWYgaXQgaXNuJ3QgYW5cbiAqIGFycmF5IGl0IHdpbGwgZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIG90aGVyd2lzZSBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIGludGVybmFsXG4gKiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAbWVtYmVyT2YgZnBcbiAqIEBzaW5jZSA1LjAuMC1iZXRhLjVcbiAqXG4gKiBAbmFtZSBwcmVmZXJFeGlzdGluZ01ldGhvZFxuICogQGFsaWFzIHVzZU1ldGhvZElmRXhpc3RzXG4gKiBAYWxpYXMgX2NoZWNrRm9yTWV0aG9kXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gaW50ZXJuYWwgaW1wbGVtdGF0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kbmFtZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge09iamVjdH0gV2hhdGV2ZXIgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0aG9kIGlzLlxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcmFtZGEvcmFtZGEvYmxvYi9tYXN0ZXIvc3JjL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qcyByYW1kYS1jaGVjay1mb3ItbWV0aG9kfVxuICogQHNlZSB7QGxpbmsgcmFtZGEtY2hlY2stZm9yLW1ldGhvZH1cbiAqXG4gKiBAVE9ETyBhcml0eVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgY29uc3QgZmFsbGJhY2sgPSAobGlzdCwgaW5kZXgpID0+IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIGluZGV4KVxuICogICAgY29uc3Qgc2xpY2UgPSB1c2VNZXRob2RJZkV4aXN0cygnc2xpY2UnLCBmYWxsYmFjaylcbiAqXG4gKiAgICBjb25zdCBsaXN0ID0gWyd6ZXJvJywgJ29uZSddXG4gKiAgICBjb25zdCBzbGljZWQgPSAobGlzdCwgMClcbiAqICAgIC8vLyB1c2VzIGxpc3Quc2xpY2UoMClcbiAqICAgIC8vPT4gMFxuICpcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwcmVmZXJFeGlzdGluZ01ldGhvZChtZXRob2RuYW1lLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aFxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3Qgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdXG4gICAgICByZXR1cm4gKGlzQXJyYXkob2JqKSB8fCAhaXNGdW5jdGlvbihvYmpbbWV0aG9kbmFtZV0pKVxuICAgICAgICA/IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgOiBvYmpbbWV0aG9kbmFtZV1cbiAgICAgICAgICAuYXBwbHkoXG4gICAgICAgICAgICBvYmosXG4gICAgICAgICAgICBhcmd1bWVudG9yLmFwcGx5KG51bGwsIGFyZ3VtZW50cykuc2xpY2UobGVuZ3RoIC0gMSlcbiAgICAgICAgICApXG4gICAgfVxuICB9XG59XG4iXSwibmFtZXMiOlsiY29uc3QiXSwibWFwcGluZ3MiOiJBQUFBQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdENBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQzVDQSxHQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtDaEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUU7RUFDN0QsT0FBTyxXQUFXO0lBQ2hCQSxHQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNO0lBQy9CLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNoQixPQUFPLEVBQUUsRUFBRTtLQUNaO1NBQ0k7TUFDSEEsR0FBSyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1VBQ2pELEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztVQUN6QixHQUFHLENBQUMsVUFBVSxDQUFDO1dBQ2QsS0FBSztZQUNKLEdBQUc7WUFDSCxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztXQUNwRDtLQUNOO0dBQ0Y7Q0FDRjsifQ==