foop
Version:
interfaces that describe their intentions.
51 lines (48 loc) • 4.05 kB
JavaScript
var keys = require('../util/keys')
var isObj = require('../is/obj')
var isFunction = require('../is/function')
var isClass = require('../is/class')
var construct = require('../fp/construct')
var always = require('../fp/always')
/**
* @name toFunction
* @since 5.0.0-beta.6
* @memberOf cast
*
* @param {Class|Object|*} x class or object to wrap
* @param {Function|*} [onCall=null] not implemented, would be onConstruct/call
* @return {Function}
*
* @see fp/construct
* @see is/class
*
* @example
*
* class Eh {}
* const eh = toFunction(Eh)
*
* isInstanceOf(eh(), Eh)
* //=> true
*
*/
function toFunction(x, onCall) {
if ( onCall === void 0 ) onCall = null;
if (isClass(x)) {
return construct(x)
}
else if (isFunction(x)) {
return construct(x.length, (x))
}
else if (isObj(x)) {
// could bind
var first = keys(x).filter(function (key) { return isFunction(x[key]); })[0]
if (isFunction(first)) { return first }
else { return always(x) }
}
// else if (isObj(x)) return construct(x)
else {
return always(x)
}
}
module.exports = toFunction
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9GdW5jdGlvbi5qcyIsInNvdXJjZXMiOlsidG9GdW5jdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBrZXlzID0gcmVxdWlyZSgnLi4vdXRpbC9rZXlzJylcbmNvbnN0IGlzT2JqID0gcmVxdWlyZSgnLi4vaXMvb2JqJylcbmNvbnN0IGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pcy9mdW5jdGlvbicpXG5jb25zdCBpc0NsYXNzID0gcmVxdWlyZSgnLi4vaXMvY2xhc3MnKVxuY29uc3QgY29uc3RydWN0ID0gcmVxdWlyZSgnLi4vZnAvY29uc3RydWN0JylcbmNvbnN0IGFsd2F5cyA9IHJlcXVpcmUoJy4uL2ZwL2Fsd2F5cycpXG5cbi8qKlxuICogQG5hbWUgdG9GdW5jdGlvblxuICogQHNpbmNlIDUuMC4wLWJldGEuNlxuICogQG1lbWJlck9mIGNhc3RcbiAqXG4gKiBAcGFyYW0gIHtDbGFzc3xPYmplY3R8Kn0geCBjbGFzcyBvciBvYmplY3QgdG8gd3JhcFxuICogQHBhcmFtICB7RnVuY3Rpb258Kn0gW29uQ2FsbD1udWxsXSBub3QgaW1wbGVtZW50ZWQsIHdvdWxkIGJlIG9uQ29uc3RydWN0L2NhbGxcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICpcbiAqIEBzZWUgZnAvY29uc3RydWN0XG4gKiBAc2VlIGlzL2NsYXNzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICBjbGFzcyBFaCB7fVxuICogICAgY29uc3QgZWggPSB0b0Z1bmN0aW9uKEVoKVxuICpcbiAqICAgIGlzSW5zdGFuY2VPZihlaCgpLCBFaClcbiAqICAgIC8vPT4gdHJ1ZVxuICpcbiAqL1xuZnVuY3Rpb24gdG9GdW5jdGlvbih4LCBvbkNhbGwgPSBudWxsKSB7XG4gIGlmIChpc0NsYXNzKHgpKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdCh4KVxuICB9XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24oeCkpIHtcbiAgICByZXR1cm4gY29uc3RydWN0KHgubGVuZ3RoLCAoeCkpXG4gIH1cbiAgZWxzZSBpZiAoaXNPYmooeCkpIHtcbiAgICAvLyBjb3VsZCBiaW5kXG4gICAgY29uc3QgZmlyc3QgPSBrZXlzKHgpLmZpbHRlcihrZXkgPT4gaXNGdW5jdGlvbih4W2tleV0pKVswXVxuICAgIGlmIChpc0Z1bmN0aW9uKGZpcnN0KSkgcmV0dXJuIGZpcnN0XG4gICAgZWxzZSByZXR1cm4gYWx3YXlzKHgpXG4gIH1cbiAgLy8gZWxzZSBpZiAoaXNPYmooeCkpIHJldHVybiBjb25zdHJ1Y3QoeClcbiAgZWxzZSB7XG4gICAgcmV0dXJuIGFsd2F5cyh4KVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHRvRnVuY3Rpb25cbiJdLCJuYW1lcyI6WyJjb25zdCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ2xDQSxHQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUM1Q0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3RDQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUM1Q0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCdEMsU0FBUyxVQUFVLENBQUMsQ0FBQyxFQUFFLE1BQWEsRUFBRSxDQUFUO2lDQUFBLEdBQUcsSUFBSTtBQUFHO0VBQ3JDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2QsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDO0dBQ3BCO09BQ0ksSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDdEIsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2hDO09BQ0ksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7O0lBRWpCQSxHQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLENBQUEsQ0FBQyxBQUFHLFNBQUEsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBQSxPQUFPLEtBQUssRUFBQTtTQUM5QixFQUFBLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFBO0dBQ3RCOztPQUVJO0lBQ0gsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDO0dBQ2pCO0NBQ0Y7QUFDRCxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVU7In0=