chain-able
Version:
interfaces that describe their intentions.
125 lines (115 loc) • 8.7 kB
JavaScript
var isUndefined = require('./deps/is/undefined')
var MergeChain = require('./MergeChain')
var MethodChain = require('./MethodChain')
var ChainedMapCore = require('./ChainedMapBase')
/**
* @desc ChainedMap composer
* @category Chainable
* @category Map
* @class ChainedMap
* @since 0.0.1
* @alias ComposeMap
* @extends {ChainedMapBase}
*
* @param {Class | Object | Composable} [SuperClass=ChainedMapBase] class to extend
* @return {Class} ChainedMap
*
* @see ChainedMapBase
* @tests ChainedMap
* @types ChainedMap
*
* @example
*
* const heh = class {}
* const composed = ChainedMap.compose(heh)
* const hehchain = new Composed()
* hehchain instanceof heh
* //=> true
*
*/
var CM = function (SuperClass) {
var Composed = SuperClass === ChainedMapCore
? SuperClass
: ChainedMapCore.compose(SuperClass)
var ChainedMap = (function (Composed) {
function ChainedMap () {
Composed.apply(this, arguments);
}
if ( Composed ) ChainedMap.__proto__ = Composed;
ChainedMap.prototype = Object.create( Composed && Composed.prototype );
ChainedMap.prototype.constructor = ChainedMap;
ChainedMap.prototype.methods = function methods (names) { return this.method(names) };
/**
* @desc the way to easily start building methods when using chainable instances
*
* @since 4.0.0
* @category methods
* @alias methods
*
* @param {string | Array<string> | Primitive} names method names to add to the object
* @return {MethodChain} @chainable
*
* @see MethodChain
*
* @example
*
* const chain = new Chain()
* chain.method('eh').build()
* chain.eh(true)
* chain.get('eh')
* // => true
*
*/
ChainedMap.prototype.method = function method (names) {
return new MethodChain(this).name(names)
};
/**
* @desc merges an object with the current store
* @since 0.4.0
* @category merge
*
* @param {Object} obj object to merge
* @param {Function | null} [handleMergeFn=undefined] return the merger to the callback
* @return {ChainedMap} @chainable
*
* @TODO needs to pass in additional opts somehow...
* @see deps/dopemerge
* @see MergeChain
*
* @example
*
* const chain = new Chain()
* chain.set('eh', [1])
* chain.merge({eh: [2]})
* chain.get('eh')
* // => [1, 2]
*
* @example
*
* const chain = new Chain()
* chain.set('emptyArr', [])
* chain.merge({emptyArr: []}, mergeChain =>
* mergeChain.onExisting((a, b) => []).merger((a, b) => []).merge()
* )
* chain.get('emptyArr').length)
* //=> 0
*
*/
ChainedMap.prototype.merge = function merge (obj, handleMergeFn) {
var merger = MergeChain.init(this)
if (isUndefined(handleMergeFn)) {
merger.merge(obj)
}
else {
handleMergeFn(merger.obj(obj))
}
return this
};
return ChainedMap;
}(Composed));
return ChainedMap
}
var cm = CM(ChainedMapCore)
cm.compose = CM
module.exports = cm
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhaW5lZE1hcC5qcyIsInNvdXJjZXMiOlsiQ2hhaW5lZE1hcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4vZGVwcy9pcy91bmRlZmluZWQnKVxuY29uc3QgTWVyZ2VDaGFpbiA9IHJlcXVpcmUoJy4vTWVyZ2VDaGFpbicpXG5jb25zdCBNZXRob2RDaGFpbiA9IHJlcXVpcmUoJy4vTWV0aG9kQ2hhaW4nKVxuY29uc3QgQ2hhaW5lZE1hcENvcmUgPSByZXF1aXJlKCcuL0NoYWluZWRNYXBCYXNlJylcblxuLyoqXG4gKiBAZGVzYyBDaGFpbmVkTWFwIGNvbXBvc2VyXG4gKiBAY2F0ZWdvcnkgQ2hhaW5hYmxlXG4gKiBAY2F0ZWdvcnkgTWFwXG4gKiBAY2xhc3MgQ2hhaW5lZE1hcFxuICogQHNpbmNlIDAuMC4xXG4gKiBAYWxpYXMgQ29tcG9zZU1hcFxuICogQGV4dGVuZHMge0NoYWluZWRNYXBCYXNlfVxuICpcbiAqIEBwYXJhbSB7Q2xhc3MgfCBPYmplY3QgfCBDb21wb3NhYmxlfSBbU3VwZXJDbGFzcz1DaGFpbmVkTWFwQmFzZV0gY2xhc3MgdG8gZXh0ZW5kXG4gKiBAcmV0dXJuIHtDbGFzc30gQ2hhaW5lZE1hcFxuICpcbiAqIEBzZWUgQ2hhaW5lZE1hcEJhc2VcbiAqIEB0ZXN0cyBDaGFpbmVkTWFwXG4gKiBAdHlwZXMgQ2hhaW5lZE1hcFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgY29uc3QgaGVoID0gY2xhc3Mge31cbiAqICAgIGNvbnN0IGNvbXBvc2VkID0gQ2hhaW5lZE1hcC5jb21wb3NlKGhlaClcbiAqICAgIGNvbnN0IGhlaGNoYWluID0gbmV3IENvbXBvc2VkKClcbiAqICAgIGhlaGNoYWluIGluc3RhbmNlb2YgaGVoXG4gKiAgICAvLz0+IHRydWVcbiAqXG4gKi9cbmNvbnN0IENNID0gU3VwZXJDbGFzcyA9PiB7XG4gIGNvbnN0IENvbXBvc2VkID0gU3VwZXJDbGFzcyA9PT0gQ2hhaW5lZE1hcENvcmVcbiAgICA/IFN1cGVyQ2xhc3NcbiAgICA6IENoYWluZWRNYXBDb3JlLmNvbXBvc2UoU3VwZXJDbGFzcylcblxuICBjbGFzcyBDaGFpbmVkTWFwIGV4dGVuZHMgQ29tcG9zZWQge1xuICAgIC8qIHByZXR0aWVyLWlnbm9yZSAqL1xuICAgIC8qIEBwcml2YXRlICovXG4gICAgbWV0aG9kcyhuYW1lcykgeyByZXR1cm4gdGhpcy5tZXRob2QobmFtZXMpIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjIHRoZSB3YXkgdG8gZWFzaWx5IHN0YXJ0IGJ1aWxkaW5nIG1ldGhvZHMgd2hlbiB1c2luZyBjaGFpbmFibGUgaW5zdGFuY2VzXG4gICAgICpcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgbWV0aG9kc1xuICAgICAqIEBhbGlhcyBtZXRob2RzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHwgUHJpbWl0aXZlfSBuYW1lcyBtZXRob2QgbmFtZXMgdG8gYWRkIHRvIHRoZSBvYmplY3RcbiAgICAgKiBAcmV0dXJuIHtNZXRob2RDaGFpbn0gQGNoYWluYWJsZVxuICAgICAqXG4gICAgICogQHNlZSBNZXRob2RDaGFpblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICAgY29uc3QgY2hhaW4gPSBuZXcgQ2hhaW4oKVxuICAgICAqICAgY2hhaW4ubWV0aG9kKCdlaCcpLmJ1aWxkKClcbiAgICAgKiAgIGNoYWluLmVoKHRydWUpXG4gICAgICogICBjaGFpbi5nZXQoJ2VoJylcbiAgICAgKiAgIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqL1xuICAgIG1ldGhvZChuYW1lcykge1xuICAgICAgcmV0dXJuIG5ldyBNZXRob2RDaGFpbih0aGlzKS5uYW1lKG5hbWVzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjIG1lcmdlcyBhbiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdG9yZVxuICAgICAqIEBzaW5jZSAwLjQuMFxuICAgICAqIEBjYXRlZ29yeSBtZXJnZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiBvYmplY3QgdG8gbWVyZ2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uIHwgbnVsbH0gW2hhbmRsZU1lcmdlRm49dW5kZWZpbmVkXSByZXR1cm4gdGhlIG1lcmdlciB0byB0aGUgY2FsbGJhY2tcbiAgICAgKiBAcmV0dXJuIHtDaGFpbmVkTWFwfSBAY2hhaW5hYmxlXG4gICAgICpcbiAgICAgKiBAVE9ETyBuZWVkcyB0byBwYXNzIGluIGFkZGl0aW9uYWwgb3B0cyBzb21laG93Li4uXG4gICAgICogQHNlZSBkZXBzL2RvcGVtZXJnZVxuICAgICAqIEBzZWUgTWVyZ2VDaGFpblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICAgKiAgICBjaGFpbi5zZXQoJ2VoJywgWzFdKVxuICAgICAqICAgIGNoYWluLm1lcmdlKHtlaDogWzJdfSlcbiAgICAgKiAgICBjaGFpbi5nZXQoJ2VoJylcbiAgICAgKiAgICAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICAgKiAgIGNoYWluLnNldCgnZW1wdHlBcnInLCBbXSlcbiAgICAgKiAgIGNoYWluLm1lcmdlKHtlbXB0eUFycjogW119LCBtZXJnZUNoYWluID0+XG4gICAgICogICAgIG1lcmdlQ2hhaW4ub25FeGlzdGluZygoYSwgYikgPT4gW10pLm1lcmdlcigoYSwgYikgPT4gW10pLm1lcmdlKClcbiAgICAgKiAgIClcbiAgICAgKiAgIGNoYWluLmdldCgnZW1wdHlBcnInKS5sZW5ndGgpXG4gICAgICogICAvLz0+IDBcbiAgICAgKlxuICAgICAqL1xuICAgIG1lcmdlKG9iaiwgaGFuZGxlTWVyZ2VGbikge1xuICAgICAgY29uc3QgbWVyZ2VyID0gTWVyZ2VDaGFpbi5pbml0KHRoaXMpXG4gICAgICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlTWVyZ2VGbikpIHtcbiAgICAgICAgbWVyZ2VyLm1lcmdlKG9iailcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBoYW5kbGVNZXJnZUZuKG1lcmdlci5vYmoob2JqKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG4gIHJldHVybiBDaGFpbmVkTWFwXG59XG5cbmNvbnN0IGNtID0gQ00oQ2hhaW5lZE1hcENvcmUpXG5jbS5jb21wb3NlID0gQ01cblxubW9kdWxlLmV4cG9ydHMgPSBjbVxuIl0sIm5hbWVzIjpbImNvbnN0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUM7QUFDbERBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUMxQ0EsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO0FBQzVDQSxHQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJsREEsR0FBSyxDQUFDLEVBQUUsR0FBRyxVQUFBLFVBQVUsQ0FBQSxDQUFDLEFBQUc7RUFDdkJBLEdBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxLQUFLLGNBQWM7TUFDMUMsVUFBVTtNQUNWLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDOztFQUV0QyxJQUFNLFVBQVUsR0FBaUI7SUFBQzs7Ozs7Ozs7SUFBQSxBQUdoQyxxQkFBQSxPQUFPLG9CQUFBLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBdUI1QyxxQkFBQSxNQUFNLG1CQUFBLENBQUMsS0FBSyxFQUFFO01BQ1osT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQ3pDLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFrQ0QscUJBQUEsS0FBSyxrQkFBQSxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUU7TUFDeEJBLEdBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDcEMsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7T0FDbEI7V0FDSTtRQUNILGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO09BQy9CO01BQ0QsT0FBTyxJQUFJO0tBQ1osQ0FBQSxBQUNGOzs7SUF4RXdCLFFBd0V4QixHQUFBO0VBQ0QsT0FBTyxVQUFVO0NBQ2xCOztBQUVEQSxHQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7QUFDN0IsRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFOztBQUVmLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBRTsifQ==