chain-able
Version:
interfaces that describe their intentions.
109 lines (100 loc) • 8.07 kB
JavaScript
var Chainable = require('./Chainable')
var toarr = require('./deps/to-arr')
/**
* @class
* @category Chainable
* @category Set
*
* @TODO could add .first .last ?
* @NOTE had Symbol.isConcatSpreadable but it was not useful
*
* @tutorial https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
* @see http://2ality.com/2015/09/well-known-symbols-es6.html
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable
* @see Chainable
* @tests ChainedSet
*
* @extends {Chainable}
* @prop {Set} store
* @type {Set}
*/
var ChainedSet = (function (Chainable) {
function ChainedSet(parent) {
Chainable.call(this, parent)
this.store = new Set()
}
if ( Chainable ) ChainedSet.__proto__ = Chainable;
ChainedSet.prototype = Object.create( Chainable && Chainable.prototype );
ChainedSet.prototype.constructor = ChainedSet;
/**
* @desc appends a new element with a specified value to the end of the .store
* @since 0.4.0
* @param {any} value any value to add to **end** of the store
* @return {ChainedSet} @chainable
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/add
*
* @example
*
* const people = new ChainedSet()
* people
* .add('sam')
* .add('sue')
*
* for (let name of people) console.log(name)
* //=> sam, sue
*/
ChainedSet.prototype.add = function add (value) {
this.store.add(value)
return this
};
/**
* @since 0.4.0
* @desc inserts the value at the **beginning** of the Set
* @param {any} value any value to add to **beginning** the store
* @return {ChainedSet} @chainable
*
* @example
*
* const people = new ChainedSet()
* people
* .add('sue')
* .prepend('first')
*
* for (let name of people) console.log(name)
* //=> first, sue
*/
ChainedSet.prototype.prepend = function prepend (value) {
this.store = new Set([value].concat(Chainable.prototype.values.call(this)))
return this
};
/**
* @desc merge any Array/Set/Iteratable/Concatables into the array, at the end
* @since 0.4.0
*
* @param {Array | Set | Concatable} arr values to merge in and append
* @return {ChainedSet} @chainable
*
* @example
*
* const people = new ChainedSet()
* people
* .add('sam')
* .add('sue')
* .prepend('first')
* .merge(['merged'])
*
* for (let name of people) console.log(name)
* //=> first, sam, sue, merged
*/
ChainedSet.prototype.merge = function merge (arr) {
var this$1 = this;
var mergeable = toarr(arr)
for (var i = 0; i < mergeable.length; i++) {
this$1.store.add(mergeable[i])
}
return this
};
return ChainedSet;
}(Chainable));
module.exports = ChainedSet
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhaW5lZFNldC5qcyIsInNvdXJjZXMiOlsiQ2hhaW5lZFNldC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBDaGFpbmFibGUgPSByZXF1aXJlKCcuL0NoYWluYWJsZScpXG5jb25zdCB0b2FyciA9IHJlcXVpcmUoJy4vZGVwcy90by1hcnInKVxuXG4vKipcbiAqIEBjbGFzc1xuICogQGNhdGVnb3J5IENoYWluYWJsZVxuICogQGNhdGVnb3J5IFNldFxuICpcbiAqIEBUT0RPIGNvdWxkIGFkZCAuZmlyc3QgLmxhc3QgP1xuICogQE5PVEUgaGFkIFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgYnV0IGl0IHdhcyBub3QgdXNlZnVsXG4gKlxuICogQHR1dG9yaWFsIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1NldFxuICogQHNlZSBodHRwOi8vMmFsaXR5LmNvbS8yMDE1LzA5L3dlbGwta25vd24tc3ltYm9scy1lczYuaHRtbFxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TeW1ib2wvaXNDb25jYXRTcHJlYWRhYmxlXG4gKiBAc2VlIENoYWluYWJsZVxuICogQHRlc3RzIENoYWluZWRTZXRcbiAqXG4gKiBAZXh0ZW5kcyB7Q2hhaW5hYmxlfVxuICogQHByb3Age1NldH0gc3RvcmVcbiAqIEB0eXBlIHtTZXR9XG4gKi9cbmNsYXNzIENoYWluZWRTZXQgZXh0ZW5kcyBDaGFpbmFibGUge1xuICAvKipcbiAgICogQHBhcmFtIHtDaGFpbmVkU2V0IHwgQ2hhaW5hYmxlIHwgUGFyZW50VHlwZX0gcGFyZW50IFBhcmVudFR5cGVcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICBjb25zdCBzZXQgPSBuZXcgQ2hhaW5lZFNldCgpXG4gICAqICAgc2V0LnN0b3JlIGluc3RhbmNlb2YgU2V0XG4gICAqICAgLy89PiB0cnVlXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICBzdXBlcihwYXJlbnQpXG4gICAgdGhpcy5zdG9yZSA9IG5ldyBTZXQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIGFwcGVuZHMgYSBuZXcgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlIC5zdG9yZVxuICAgKiBAc2luY2UgMC40LjBcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIGFueSB2YWx1ZSB0byBhZGQgdG8gKiplbmQqKiBvZiB0aGUgc3RvcmVcbiAgICogQHJldHVybiB7Q2hhaW5lZFNldH0gQGNoYWluYWJsZVxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1NldC9hZGRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICBjb25zdCBwZW9wbGUgPSBuZXcgQ2hhaW5lZFNldCgpXG4gICAqICAgcGVvcGxlXG4gICAqICAgICAuYWRkKCdzYW0nKVxuICAgKiAgICAgLmFkZCgnc3VlJylcbiAgICpcbiAgICogICBmb3IgKGxldCBuYW1lIG9mIHBlb3BsZSkgY29uc29sZS5sb2cobmFtZSlcbiAgICogICAvLz0+IHNhbSwgc3VlXG4gICAqL1xuICBhZGQodmFsdWUpIHtcbiAgICB0aGlzLnN0b3JlLmFkZCh2YWx1ZSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEBzaW5jZSAwLjQuMFxuICAgKiBAZGVzYyBpbnNlcnRzIHRoZSB2YWx1ZSBhdCB0aGUgKipiZWdpbm5pbmcqKiBvZiB0aGUgU2V0XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBhbnkgdmFsdWUgdG8gYWRkIHRvICoqYmVnaW5uaW5nKiogdGhlIHN0b3JlXG4gICAqIEByZXR1cm4ge0NoYWluZWRTZXR9IEBjaGFpbmFibGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICBjb25zdCBwZW9wbGUgPSBuZXcgQ2hhaW5lZFNldCgpXG4gICAqICAgcGVvcGxlXG4gICAqICAgICAuYWRkKCdzdWUnKVxuICAgKiAgICAgLnByZXBlbmQoJ2ZpcnN0JylcbiAgICpcbiAgICogICBmb3IgKGxldCBuYW1lIG9mIHBlb3BsZSkgY29uc29sZS5sb2cobmFtZSlcbiAgICogICAvLz0+IGZpcnN0LCBzdWVcbiAgICovXG4gIHByZXBlbmQodmFsdWUpIHtcbiAgICB0aGlzLnN0b3JlID0gbmV3IFNldChbdmFsdWVdLmNvbmNhdChzdXBlci52YWx1ZXMoKSkpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBtZXJnZSBhbnkgQXJyYXkvU2V0L0l0ZXJhdGFibGUvQ29uY2F0YWJsZXMgaW50byB0aGUgYXJyYXksIGF0IHRoZSBlbmRcbiAgICogQHNpbmNlIDAuNC4wXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkgfCBTZXQgfCBDb25jYXRhYmxlfSBhcnIgdmFsdWVzIHRvIG1lcmdlIGluIGFuZCBhcHBlbmRcbiAgICogQHJldHVybiB7Q2hhaW5lZFNldH0gQGNoYWluYWJsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgIGNvbnN0IHBlb3BsZSA9IG5ldyBDaGFpbmVkU2V0KClcbiAgICogICBwZW9wbGVcbiAgICogICAgIC5hZGQoJ3NhbScpXG4gICAqICAgICAuYWRkKCdzdWUnKVxuICAgKiAgICAgLnByZXBlbmQoJ2ZpcnN0JylcbiAgICogICAgIC5tZXJnZShbJ21lcmdlZCddKVxuICAgKlxuICAgKiAgIGZvciAobGV0IG5hbWUgb2YgcGVvcGxlKSBjb25zb2xlLmxvZyhuYW1lKVxuICAgKiAgIC8vPT4gZmlyc3QsIHNhbSwgc3VlLCBtZXJnZWRcbiAgICovXG4gIG1lcmdlKGFycikge1xuICAgIGNvbnN0IG1lcmdlYWJsZSA9IHRvYXJyKGFycilcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlYWJsZS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdG9yZS5hZGQobWVyZ2VhYmxlW2ldKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2hhaW5lZFNldFxuIl0sIm5hbWVzIjpbImNvbnN0Iiwic3VwZXIiLCJsZXQiLCJ0aGlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3hDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0J0QyxJQUFNLFVBQVUsR0FBa0I7RUFBQyxBQVVqQyxtQkFBVyxDQUFDLE1BQU0sRUFBRTtJQUNsQkMsU0FBSyxLQUFBLENBQUMsTUFBQSxNQUFNLENBQUM7SUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFO0dBQ3ZCOzs7O2dEQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBbUJELHFCQUFBLEdBQUcsZ0JBQUEsQ0FBQyxLQUFLLEVBQUU7SUFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDckIsT0FBTyxJQUFJO0dBQ1osQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa0JELHFCQUFBLE9BQU8sb0JBQUEsQ0FBQyxLQUFLLEVBQUU7SUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDQSxtQkFBSyxDQUFDLE1BQU0sS0FBQSxDQUFDLElBQUEsQ0FBQyxDQUFDLENBQUM7SUFDcEQsT0FBTyxJQUFJO0dBQ1osQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcUJELHFCQUFBLEtBQUssa0JBQUEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7QUFBQTtJQUNWRCxHQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDNUIsS0FBS0UsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDekNDLE1BQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3QjtJQUNELE9BQU8sSUFBSTtHQUNaLENBQUEsQUFDRjs7O0VBcEZ3QixTQW9GeEIsR0FBQTs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVU7In0=