foop
Version:
interfaces that describe their intentions.
122 lines (111 loc) • 11.5 kB
JavaScript
var ENV_DEBUG = require('../deps/env/debug')
var isUndefined = require('../deps/is/undefined')
var isInstanceOf = require('../deps/is/instanceOf')
var flattenForIn = require('../deps/loop/flattenForIn')
var defaultTo = require('../deps/cast/defaultTo')
var Chainable = require('../Chainable')
var ChainedMapBase = require('../ChainedMapBase')
var ChainedMap = require('../ChainedMap')
var Observe = require('./Observe')
var Shorthands = require('./Shorthands')
var Transform = require('./Transform')
var DotProp = require('./DotProp')
var ComposableExtensions = [Observe, Shorthands, Transform, DotProp]
var isOfInstanceObj = isInstanceOf(Object)
/**
* @desc compose chains all the way up from Chainable
* @since 3.0.0
*
* @NOTE @IMPORTANT ...really strange, when I do `.compose` in a compose class, say ChainedMap, it loops this... but not .composer...
*
* @param {Class | Function | undefined} [target=ChainedMap] class or function to extend
* @param {Array | undefined} [extensions=[Observe, Shorthands, Transform, DotProp]] Array of extensions to compose together left to right
* @return {Class | Function} composed
*
* @tutorial examples/playground/compose
* @tutorial examples/babel/decorators
*
* {@link http://js-bits.blogspot.ca/2010/08/javascript-inheritance-done-right.html javascript-inheritance-done-right}
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain mozilla_Inheritance_and_the_prototype_chain}
* @see {@link mozilla_Inheritance_and_the_prototype_chain}
* @see {@link javascript-inheritance-done-right}
*
* @func
* @name compose
* @member compose
*
* @tests compose
* @types compose
* @symb 🎼
*
* @see https://formidable.com/blog/2017/infinite-state-composition-with-freactal/
* @see https://blog.javascripting.com/2016/02/02/encapsulation-in-redux/
* @see https://www.barbarianmeetscoding.com/blog/2016/01/04/safer-javascript-object-composition-with-traits-and-traits-dot-js/
* @see https://medium.com/javascript-scene/why-learn-functional-programming-in-javascript-composing-software-ea13afc7a257
* @see https://hackernoon.com/javascript-functional-composition-for-every-day-use-22421ef65a10
* @see https://github.com/stoeffel/awesome-fp-js
*
* @example
*
* class Eh extends compose() {}
* new Eh() instanceof Chainable
* //=> true
*
* @example
*
* class Target {}
* class Eh extends compose(Target) {}
* new Eh() instanceof Target
* //=> true
*
* @example
*
* class Target {}
* const mixin = SuperClass => class extends SuperClass {}
* class Eh extends compose(Target, ) {}
* new Eh() instanceof Chainable
* //=> true
*
* @example
*
* class Winning {}
* class Yes extends compose(Winning) {
* get winning() {
* return true
* }
* }
* const yes = new Yes()
* yes instanceof Winning && yes.winning
* //=> true
*
*/
function _compose(target, extensions) {
// let extend = defaultTo(ComposableExtensions, extensions)
var extend = isUndefined(extensions) ? ComposableExtensions : extensions
var composed = target
if (isOfInstanceObj(target)) {
// @NOTE now that we can add composers,
// it SHOULD start at the top :-)
composed = Chainable.composer(composed)
composed = ChainedMapBase.composer(composed)
composed = ChainedMap.composer(composed)
// composed = ChainedMap.composer(composed)
// composed = ChainedMap.composer(ChainedMapBase.compose(Chainable.compose(target)))
}
else {
composed = ChainedMap
}
for (var index = 0; index < extend.length; index++) {
composed = extend[index](composed)
// @TODO ensure it is safe to ignore these
// || composed || ChainedMap
}
flattenForIn(composed)
return composed
}
_compose.Observe = Observe
_compose.Shorthands = Shorthands
_compose.Transform = Transform
_compose.DotProp = DotProp
module.exports = _compose
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZS5qcyIsInNvdXJjZXMiOlsiY29tcG9zZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBFTlZfREVCVUcgPSByZXF1aXJlKCcuLi9kZXBzL2Vudi9kZWJ1ZycpXG5jb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2RlcHMvaXMvdW5kZWZpbmVkJylcbmNvbnN0IGlzSW5zdGFuY2VPZiA9IHJlcXVpcmUoJy4uL2RlcHMvaXMvaW5zdGFuY2VPZicpXG5jb25zdCBmbGF0dGVuRm9ySW4gPSByZXF1aXJlKCcuLi9kZXBzL2xvb3AvZmxhdHRlbkZvckluJylcbmNvbnN0IGRlZmF1bHRUbyA9IHJlcXVpcmUoJy4uL2RlcHMvY2FzdC9kZWZhdWx0VG8nKVxuY29uc3QgQ2hhaW5hYmxlID0gcmVxdWlyZSgnLi4vQ2hhaW5hYmxlJylcbmNvbnN0IENoYWluZWRNYXBCYXNlID0gcmVxdWlyZSgnLi4vQ2hhaW5lZE1hcEJhc2UnKVxuY29uc3QgQ2hhaW5lZE1hcCA9IHJlcXVpcmUoJy4uL0NoYWluZWRNYXAnKVxuY29uc3QgT2JzZXJ2ZSA9IHJlcXVpcmUoJy4vT2JzZXJ2ZScpXG5jb25zdCBTaG9ydGhhbmRzID0gcmVxdWlyZSgnLi9TaG9ydGhhbmRzJylcbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vVHJhbnNmb3JtJylcbmNvbnN0IERvdFByb3AgPSByZXF1aXJlKCcuL0RvdFByb3AnKVxuXG5jb25zdCBDb21wb3NhYmxlRXh0ZW5zaW9ucyA9IFtPYnNlcnZlLCBTaG9ydGhhbmRzLCBUcmFuc2Zvcm0sIERvdFByb3BdXG5jb25zdCBpc09mSW5zdGFuY2VPYmogPSBpc0luc3RhbmNlT2YoT2JqZWN0KVxuXG4vKipcbiAqIEBkZXNjIGNvbXBvc2UgY2hhaW5zIGFsbCB0aGUgd2F5IHVwIGZyb20gQ2hhaW5hYmxlXG4gKiBAc2luY2UgMy4wLjBcbiAqXG4gKiBATk9URSBASU1QT1JUQU5UIC4uLnJlYWxseSBzdHJhbmdlLCB3aGVuIEkgZG8gYC5jb21wb3NlYCBpbiBhIGNvbXBvc2UgY2xhc3MsIHNheSBDaGFpbmVkTWFwLCBpdCBsb29wcyB0aGlzLi4uIGJ1dCBub3QgLmNvbXBvc2VyLi4uXG4gKlxuICogQHBhcmFtICB7Q2xhc3MgfCBGdW5jdGlvbiB8IHVuZGVmaW5lZH0gW3RhcmdldD1DaGFpbmVkTWFwXSBjbGFzcyBvciBmdW5jdGlvbiB0byBleHRlbmRcbiAqIEBwYXJhbSAge0FycmF5IHwgdW5kZWZpbmVkfSBbZXh0ZW5zaW9ucz1bT2JzZXJ2ZSwgU2hvcnRoYW5kcywgVHJhbnNmb3JtLCBEb3RQcm9wXV0gQXJyYXkgb2YgZXh0ZW5zaW9ucyB0byBjb21wb3NlIHRvZ2V0aGVyIGxlZnQgdG8gcmlnaHRcbiAqIEByZXR1cm4ge0NsYXNzIHwgRnVuY3Rpb259IGNvbXBvc2VkXG4gKlxuICogQHR1dG9yaWFsIGV4YW1wbGVzL3BsYXlncm91bmQvY29tcG9zZVxuICogQHR1dG9yaWFsIGV4YW1wbGVzL2JhYmVsL2RlY29yYXRvcnNcbiAqXG4gKiB7QGxpbmsgaHR0cDovL2pzLWJpdHMuYmxvZ3Nwb3QuY2EvMjAxMC8wOC9qYXZhc2NyaXB0LWluaGVyaXRhbmNlLWRvbmUtcmlnaHQuaHRtbCBqYXZhc2NyaXB0LWluaGVyaXRhbmNlLWRvbmUtcmlnaHR9XG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9Jbmhlcml0YW5jZV9hbmRfdGhlX3Byb3RvdHlwZV9jaGFpbiBtb3ppbGxhX0luaGVyaXRhbmNlX2FuZF90aGVfcHJvdG90eXBlX2NoYWlufVxuICogQHNlZSB7QGxpbmsgbW96aWxsYV9Jbmhlcml0YW5jZV9hbmRfdGhlX3Byb3RvdHlwZV9jaGFpbn1cbiAqIEBzZWUge0BsaW5rIGphdmFzY3JpcHQtaW5oZXJpdGFuY2UtZG9uZS1yaWdodH1cbiAqXG4gKiBAZnVuY1xuICogQG5hbWUgY29tcG9zZVxuICogQG1lbWJlciBjb21wb3NlXG4gKlxuICogQHRlc3RzIGNvbXBvc2VcbiAqIEB0eXBlcyBjb21wb3NlXG4gKiBAc3ltYiDwn468XG4gKlxuICogQHNlZSBodHRwczovL2Zvcm1pZGFibGUuY29tL2Jsb2cvMjAxNy9pbmZpbml0ZS1zdGF0ZS1jb21wb3NpdGlvbi13aXRoLWZyZWFjdGFsL1xuICogQHNlZSBodHRwczovL2Jsb2cuamF2YXNjcmlwdGluZy5jb20vMjAxNi8wMi8wMi9lbmNhcHN1bGF0aW9uLWluLXJlZHV4L1xuICogQHNlZSBodHRwczovL3d3dy5iYXJiYXJpYW5tZWV0c2NvZGluZy5jb20vYmxvZy8yMDE2LzAxLzA0L3NhZmVyLWphdmFzY3JpcHQtb2JqZWN0LWNvbXBvc2l0aW9uLXdpdGgtdHJhaXRzLWFuZC10cmFpdHMtZG90LWpzL1xuICogQHNlZSBodHRwczovL21lZGl1bS5jb20vamF2YXNjcmlwdC1zY2VuZS93aHktbGVhcm4tZnVuY3Rpb25hbC1wcm9ncmFtbWluZy1pbi1qYXZhc2NyaXB0LWNvbXBvc2luZy1zb2Z0d2FyZS1lYTEzYWZjN2EyNTdcbiAqIEBzZWUgaHR0cHM6Ly9oYWNrZXJub29uLmNvbS9qYXZhc2NyaXB0LWZ1bmN0aW9uYWwtY29tcG9zaXRpb24tZm9yLWV2ZXJ5LWRheS11c2UtMjI0MjFlZjY1YTEwXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zdG9lZmZlbC9hd2Vzb21lLWZwLWpzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgY2xhc3MgRWggZXh0ZW5kcyBjb21wb3NlKCkge31cbiAqICBuZXcgRWgoKSBpbnN0YW5jZW9mIENoYWluYWJsZVxuICogIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogIGNsYXNzIFRhcmdldCB7fVxuICogIGNsYXNzIEVoIGV4dGVuZHMgY29tcG9zZShUYXJnZXQpIHt9XG4gKiAgbmV3IEVoKCkgaW5zdGFuY2VvZiBUYXJnZXRcbiAqICAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICBjbGFzcyBUYXJnZXQge31cbiAqICBjb25zdCBtaXhpbiA9IFN1cGVyQ2xhc3MgPT4gY2xhc3MgZXh0ZW5kcyBTdXBlckNsYXNzIHt9XG4gKiAgY2xhc3MgRWggZXh0ZW5kcyBjb21wb3NlKFRhcmdldCwgKSB7fVxuICogIG5ldyBFaCgpIGluc3RhbmNlb2YgQ2hhaW5hYmxlXG4gKiAgLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICBjbGFzcyBXaW5uaW5nIHt9XG4gKiAgICBjbGFzcyBZZXMgZXh0ZW5kcyBjb21wb3NlKFdpbm5pbmcpIHtcbiAqICAgICAgZ2V0IHdpbm5pbmcoKSB7XG4gKiAgICAgICAgcmV0dXJuIHRydWVcbiAqICAgICAgfVxuICogICAgfVxuICogICAgY29uc3QgeWVzID0gbmV3IFllcygpXG4gKiAgICB5ZXMgaW5zdGFuY2VvZiBXaW5uaW5nICYmIHllcy53aW5uaW5nXG4gKiAgICAvLz0+IHRydWVcbiAqXG4gKi9cbmZ1bmN0aW9uIF9jb21wb3NlKHRhcmdldCwgZXh0ZW5zaW9ucykge1xuICAvLyBsZXQgZXh0ZW5kID0gZGVmYXVsdFRvKENvbXBvc2FibGVFeHRlbnNpb25zLCBleHRlbnNpb25zKVxuICBsZXQgZXh0ZW5kID0gaXNVbmRlZmluZWQoZXh0ZW5zaW9ucykgPyBDb21wb3NhYmxlRXh0ZW5zaW9ucyA6IGV4dGVuc2lvbnNcbiAgbGV0IGNvbXBvc2VkID0gdGFyZ2V0XG5cbiAgaWYgKGlzT2ZJbnN0YW5jZU9iaih0YXJnZXQpKSB7XG4gICAgLy8gQE5PVEUgbm93IHRoYXQgd2UgY2FuIGFkZCBjb21wb3NlcnMsXG4gICAgLy8gaXQgU0hPVUxEIHN0YXJ0IGF0IHRoZSB0b3AgOi0pXG5cbiAgICBjb21wb3NlZCA9IENoYWluYWJsZS5jb21wb3Nlcihjb21wb3NlZClcbiAgICBjb21wb3NlZCA9IENoYWluZWRNYXBCYXNlLmNvbXBvc2VyKGNvbXBvc2VkKVxuICAgIGNvbXBvc2VkID0gQ2hhaW5lZE1hcC5jb21wb3Nlcihjb21wb3NlZClcblxuICAgIC8vIGNvbXBvc2VkID0gQ2hhaW5lZE1hcC5jb21wb3Nlcihjb21wb3NlZClcbiAgICAvLyBjb21wb3NlZCA9IENoYWluZWRNYXAuY29tcG9zZXIoQ2hhaW5lZE1hcEJhc2UuY29tcG9zZShDaGFpbmFibGUuY29tcG9zZSh0YXJnZXQpKSlcbiAgfVxuICBlbHNlIHtcbiAgICBjb21wb3NlZCA9IENoYWluZWRNYXBcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHRlbmQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29tcG9zZWQgPSBleHRlbmRbaW5kZXhdKGNvbXBvc2VkKVxuXG4gICAgLy8gQFRPRE8gZW5zdXJlIGl0IGlzIHNhZmUgdG8gaWdub3JlIHRoZXNlXG4gICAgLy8gfHwgY29tcG9zZWQgfHwgQ2hhaW5lZE1hcFxuICB9XG5cbiAgZmxhdHRlbkZvckluKGNvbXBvc2VkKVxuICByZXR1cm4gY29tcG9zZWRcbn1cblxuX2NvbXBvc2UuT2JzZXJ2ZSA9IE9ic2VydmVcbl9jb21wb3NlLlNob3J0aGFuZHMgPSBTaG9ydGhhbmRzXG5fY29tcG9zZS5UcmFuc2Zvcm0gPSBUcmFuc2Zvcm1cbl9jb21wb3NlLkRvdFByb3AgPSBEb3RQcm9wXG5cbm1vZHVsZS5leHBvcnRzID0gX2NvbXBvc2VcbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO0FBQzlDQSxHQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztBQUNuREEsR0FBSyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUM7QUFDckRBLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDO0FBQ3pEQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztBQUNuREEsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ3pDQSxHQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztBQUNuREEsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO0FBQzNDQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDcENBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUMxQ0EsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3hDQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7O0FBRXBDQSxHQUFLLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUM7QUFDdEVBLEdBQUssQ0FBQyxlQUFlLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUU1QyxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFOztFQUVwQ0MsR0FBRyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsb0JBQW9CLEdBQUcsVUFBVTtFQUN4RUEsR0FBRyxDQUFDLFFBQVEsR0FBRyxNQUFNOztFQUVyQixJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRTs7OztJQUkzQixRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDdkMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQzVDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQzs7OztHQUl6QztPQUNJO0lBQ0gsUUFBUSxHQUFHLFVBQVU7R0FDdEI7O0VBRUQsS0FBS0EsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDbEQsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUM7Ozs7R0FJbkM7O0VBRUQsWUFBWSxDQUFDLFFBQVEsQ0FBQztFQUN0QixPQUFPLFFBQVE7Q0FDaEI7O0FBRUQsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPO0FBQzFCLFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVTtBQUNoQyxRQUFRLENBQUMsU0FBUyxHQUFHLFNBQVM7QUFDOUIsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPOztBQUUxQixNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVE7In0=