foop
Version:
interfaces that describe their intentions.
127 lines (113 loc) • 8.74 kB
JavaScript
var isUndefined = require('./deps/is/undefined')
var MergeChain = require('./MergeChain')
var MethodChain = require('./MethodChain')
var ChainedMapBase = require('./ChainedMapBase')
var composer = require('./compose/composer')
/**
* @desc ChainedMap composer
* @category Chainable
* @category Map
* @memberOf ChainedMapBase
* @class ChainedMap
* @since 0.0.1
* @alias ComposeMap
* @extends {ChainedMapBase}
*
* @param {Class | Object | Composable} [Target=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 ComposeChainedMap = function (Target) {
var ChainedMap = Target
// @NOTE compose now does this
// const Composed =
// Target === ChainedMapBase || Target.constructor.name === ChainedMapBase.constructor.name
// ? Target
// : ChainedMapBase.compose(Target)
// class ChainedMap extends Composed {}
/* prettier-ignore */
/* @private */
ChainedMap.prototype.methods = function(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(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(obj, handleMergeFn) {
var merger = MergeChain.init(this)
if (isUndefined(handleMergeFn)) {
merger.merge(obj)
}
else {
handleMergeFn(merger.obj(obj))
}
return this
}
return ChainedMap
}
var composed = composer(ComposeChainedMap, ChainedMapBase)
module.exports = composed
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhaW5lZE1hcC5qcyIsInNvdXJjZXMiOlsiQ2hhaW5lZE1hcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4vZGVwcy9pcy91bmRlZmluZWQnKVxuY29uc3QgTWVyZ2VDaGFpbiA9IHJlcXVpcmUoJy4vTWVyZ2VDaGFpbicpXG5jb25zdCBNZXRob2RDaGFpbiA9IHJlcXVpcmUoJy4vTWV0aG9kQ2hhaW4nKVxuY29uc3QgQ2hhaW5lZE1hcEJhc2UgPSByZXF1aXJlKCcuL0NoYWluZWRNYXBCYXNlJylcbmNvbnN0IGNvbXBvc2VyID0gcmVxdWlyZSgnLi9jb21wb3NlL2NvbXBvc2VyJylcblxuLyoqXG4gKiBAZGVzYyBDaGFpbmVkTWFwIGNvbXBvc2VyXG4gKiBAY2F0ZWdvcnkgQ2hhaW5hYmxlXG4gKiBAY2F0ZWdvcnkgTWFwXG4gKiBAbWVtYmVyT2YgQ2hhaW5lZE1hcEJhc2VcbiAqIEBjbGFzcyBDaGFpbmVkTWFwXG4gKiBAc2luY2UgMC4wLjFcbiAqIEBhbGlhcyBDb21wb3NlTWFwXG4gKiBAZXh0ZW5kcyB7Q2hhaW5lZE1hcEJhc2V9XG4gKlxuICogQHBhcmFtIHtDbGFzcyB8IE9iamVjdCB8IENvbXBvc2FibGV9IFtUYXJnZXQ9Q2hhaW5lZE1hcEJhc2VdIGNsYXNzIHRvIGV4dGVuZFxuICogQHJldHVybiB7Q2xhc3N9IENoYWluZWRNYXBcbiAqXG4gKiBAc2VlIENoYWluZWRNYXBCYXNlXG4gKiBAdGVzdHMgQ2hhaW5lZE1hcFxuICogQHR5cGVzIENoYWluZWRNYXBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIGNvbnN0IGhlaCA9IGNsYXNzIHt9XG4gKiAgICBjb25zdCBjb21wb3NlZCA9IENoYWluZWRNYXAuY29tcG9zZShoZWgpXG4gKiAgICBjb25zdCBoZWhjaGFpbiA9IG5ldyBDb21wb3NlZCgpXG4gKiAgICBoZWhjaGFpbiBpbnN0YW5jZW9mIGhlaFxuICogICAgLy89PiB0cnVlXG4gKlxuICovXG5cbmNvbnN0IENvbXBvc2VDaGFpbmVkTWFwID0gVGFyZ2V0ID0+IHtcbiAgbGV0IENoYWluZWRNYXAgPSBUYXJnZXRcblxuICAvLyBATk9URSBjb21wb3NlIG5vdyBkb2VzIHRoaXNcbiAgLy8gY29uc3QgQ29tcG9zZWQgPVxuICAvLyAgIFRhcmdldCA9PT0gQ2hhaW5lZE1hcEJhc2UgfHwgVGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IENoYWluZWRNYXBCYXNlLmNvbnN0cnVjdG9yLm5hbWVcbiAgLy8gICAgID8gVGFyZ2V0XG4gIC8vICAgICA6IENoYWluZWRNYXBCYXNlLmNvbXBvc2UoVGFyZ2V0KVxuXG4gIC8vIGNsYXNzIENoYWluZWRNYXAgZXh0ZW5kcyBDb21wb3NlZCB7fVxuXG4gIC8qIHByZXR0aWVyLWlnbm9yZSAqL1xuICAvKiBAcHJpdmF0ZSAqL1xuICBDaGFpbmVkTWFwLnByb3RvdHlwZS5tZXRob2RzID0gZnVuY3Rpb24obmFtZXMpIHsgcmV0dXJuIHRoaXMubWV0aG9kKG5hbWVzKSB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIHRoZSB3YXkgdG8gZWFzaWx5IHN0YXJ0IGJ1aWxkaW5nIG1ldGhvZHMgd2hlbiB1c2luZyBjaGFpbmFibGUgaW5zdGFuY2VzXG4gICAqXG4gICAqIEBzaW5jZSA0LjAuMFxuICAgKiBAY2F0ZWdvcnkgbWV0aG9kc1xuICAgKiBAYWxpYXMgbWV0aG9kc1xuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHwgUHJpbWl0aXZlfSBuYW1lcyBtZXRob2QgbmFtZXMgdG8gYWRkIHRvIHRoZSBvYmplY3RcbiAgICogQHJldHVybiB7TWV0aG9kQ2hhaW59IEBjaGFpbmFibGVcbiAgICpcbiAgICogQHNlZSBNZXRob2RDaGFpblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICogICBjaGFpbi5tZXRob2QoJ2VoJykuYnVpbGQoKVxuICAgKiAgIGNoYWluLmVoKHRydWUpXG4gICAqICAgY2hhaW4uZ2V0KCdlaCcpXG4gICAqICAgLy89PiB0cnVlXG4gICAqXG4gICAqL1xuICBDaGFpbmVkTWFwLnByb3RvdHlwZS5tZXRob2QgPSBmdW5jdGlvbihuYW1lcykge1xuICAgIHJldHVybiBuZXcgTWV0aG9kQ2hhaW4odGhpcykubmFtZShuYW1lcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBtZXJnZXMgYW4gb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RvcmVcbiAgICogQHNpbmNlIDAuNC4wXG4gICAqIEBjYXRlZ29yeSBtZXJnZVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIG9iamVjdCB0byBtZXJnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9uIHwgbnVsbH0gW2hhbmRsZU1lcmdlRm49dW5kZWZpbmVkXSByZXR1cm4gdGhlIG1lcmdlciB0byB0aGUgY2FsbGJhY2tcbiAgICogQHJldHVybiB7Q2hhaW5lZE1hcH0gQGNoYWluYWJsZVxuICAgKlxuICAgKiBAVE9ETyBuZWVkcyB0byBwYXNzIGluIGFkZGl0aW9uYWwgb3B0cyBzb21laG93Li4uXG4gICAqIEBzZWUgZGVwcy9kb3BlbWVyZ2VcbiAgICogQHNlZSBNZXJnZUNoYWluXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICogICAgY2hhaW4uc2V0KCdlaCcsIFsxXSlcbiAgICogICAgY2hhaW4ubWVyZ2Uoe2VoOiBbMl19KVxuICAgKiAgICBjaGFpbi5nZXQoJ2VoJylcbiAgICogICAgLy89PiBbMSwgMl1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICBjb25zdCBjaGFpbiA9IG5ldyBDaGFpbigpXG4gICAqICAgY2hhaW4uc2V0KCdlbXB0eUFycicsIFtdKVxuICAgKiAgIGNoYWluLm1lcmdlKHtlbXB0eUFycjogW119LCBtZXJnZUNoYWluID0+XG4gICAqICAgICBtZXJnZUNoYWluLm9uRXhpc3RpbmcoKGEsIGIpID0+IFtdKS5tZXJnZXIoKGEsIGIpID0+IFtdKS5tZXJnZSgpXG4gICAqICAgKVxuICAgKiAgIGNoYWluLmdldCgnZW1wdHlBcnInKS5sZW5ndGgpXG4gICAqICAgLy89PiAwXG4gICAqXG4gICAqL1xuICBDaGFpbmVkTWFwLnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uKG9iaiwgaGFuZGxlTWVyZ2VGbikge1xuICAgIGNvbnN0IG1lcmdlciA9IE1lcmdlQ2hhaW4uaW5pdCh0aGlzKVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKGhhbmRsZU1lcmdlRm4pKSB7XG4gICAgICBtZXJnZXIubWVyZ2Uob2JqKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhhbmRsZU1lcmdlRm4obWVyZ2VyLm9iaihvYmopKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICByZXR1cm4gQ2hhaW5lZE1hcFxufVxuXG5cbmNvbnN0IGNvbXBvc2VkID0gY29tcG9zZXIoQ29tcG9zZUNoYWluZWRNYXAsIENoYWluZWRNYXBCYXNlKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvc2VkXG4iXSwibmFtZXMiOlsiY29uc3QiLCJsZXQiXSwibWFwcGluZ3MiOiJBQUFBQSxHQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUNsREEsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQzFDQSxHQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7QUFDNUNBLEdBQUssQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQ2xEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QjlDQSxHQUFLLENBQUMsaUJBQWlCLEdBQUcsVUFBQSxNQUFNLENBQUEsQ0FBQyxBQUFHO0VBQ2xDQyxHQUFHLENBQUMsVUFBVSxHQUFHLE1BQU07Ozs7Ozs7Ozs7OztFQVl2QixVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLEtBQUssRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1QjVFLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsS0FBSyxFQUFFO0lBQzVDLE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztHQUN6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWtDRCxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsRUFBRSxhQUFhLEVBQUU7SUFDeERELEdBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O0lBRXBDLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFO01BQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0tBQ2xCO1NBQ0k7TUFDSCxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMvQjs7SUFFRCxPQUFPLElBQUk7R0FDWjs7RUFFRCxPQUFPLFVBQVU7Q0FDbEI7OztBQUdEQSxHQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLENBQUM7O0FBRTVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsUUFBUTsifQ==