foop
Version:
interfaces that describe their intentions.
143 lines (132 loc) • 9.89 kB
JavaScript
var Chainable = require('./Chainable')
var toarr = require('./deps/to-arr')
var arrayOfIndexes = require('./deps/array/arrayOfIndexes')
/**
* @class
* @category Chainable
* @category Set
* @memberOf Chainable
* @member ChainedSet
*
* @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
* @types 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;
return ChainedSet;
}(Chainable));
/**
* @version 5.0.0 <- moved into ChainedMapBase & ChainedSet for less monomorphic usage
* @since 5.0.0-beta.6
* @memberOf ChainedSet
*
* @return {Array<number | string | *>} keys
*
* @example
*
* Chain.set('eh', 1).keys()
* //=> ['eh']
*
*/
ChainedSet.prototype.keys = function() {
return arrayOfIndexes(this.store.size)
}
/**
* @desc appends a new element with a specified value to the end of the .store
* @since 0.4.0
* @memberOf ChainedSet
*
* @param {any} value any value to add to **end** of the store
* @return {ChainedSet} @chainable
*
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/add mozilla-set-add}
* {@link https://github.com/lodash/lodash/blob/master/.internal/addSetEntry.js#L9 lodash-add-set-entry}
* @see {@link mozilla-set-add}
* @see {@link lodash-add-set-entry}
*
* @example
*
* const people = new ChainedSet()
* people
* .add('sam')
* .add('sue')
*
* for (let name of people) console.log(name)
* //=> sam, sue
*
*/
ChainedSet.prototype.add = function(value) {
this.store.add(value)
return this
}
/**
* @desc inserts the value at the **beginning** of the Set
* @since 0.4.0
* @memberOf ChainedSet
*
* @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(value) {
this.store = new Set([value].concat(this.values()))
return this
}
/**
* @desc merge any Array/Set/Iteratable/Concatables into the array, at the end
* @since 0.4.0
* @memberOf ChainedSet
*
* @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(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
}
module.exports = ChainedSet
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhaW5lZFNldC5qcyIsInNvdXJjZXMiOlsiQ2hhaW5lZFNldC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBDaGFpbmFibGUgPSByZXF1aXJlKCcuL0NoYWluYWJsZScpXG5jb25zdCB0b2FyciA9IHJlcXVpcmUoJy4vZGVwcy90by1hcnInKVxuY29uc3QgYXJyYXlPZkluZGV4ZXMgPSByZXF1aXJlKCcuL2RlcHMvYXJyYXkvYXJyYXlPZkluZGV4ZXMnKVxuXG4vKipcbiAqIEBjbGFzc1xuICogQGNhdGVnb3J5IENoYWluYWJsZVxuICogQGNhdGVnb3J5IFNldFxuICogQG1lbWJlck9mIENoYWluYWJsZVxuICogQG1lbWJlciBDaGFpbmVkU2V0XG4gKlxuICogQFRPRE8gY291bGQgYWRkIC5maXJzdCAubGFzdCA/XG4gKiBATk9URSBoYWQgU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSBidXQgaXQgd2FzIG5vdCB1c2VmdWxcbiAqXG4gKiBAdHV0b3JpYWwgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU2V0XG4gKiBAc2VlIGh0dHA6Ly8yYWxpdHkuY29tLzIwMTUvMDkvd2VsbC1rbm93bi1zeW1ib2xzLWVzNi5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N5bWJvbC9pc0NvbmNhdFNwcmVhZGFibGVcbiAqIEBzZWUgQ2hhaW5hYmxlXG4gKiBAdGVzdHMgQ2hhaW5lZFNldFxuICogQHR5cGVzIENoYWluZWRTZXRcbiAqXG4gKiBAZXh0ZW5kcyB7Q2hhaW5hYmxlfVxuICogQHByb3Age1NldH0gc3RvcmVcbiAqIEB0eXBlIHtTZXR9XG4gKi9cbmNsYXNzIENoYWluZWRTZXQgZXh0ZW5kcyBDaGFpbmFibGUge1xuICAvKipcbiAgICogQHBhcmFtIHtDaGFpbmVkU2V0IHwgQ2hhaW5hYmxlIHwgUGFyZW50VHlwZX0gcGFyZW50IFBhcmVudFR5cGVcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICBjb25zdCBzZXQgPSBuZXcgQ2hhaW5lZFNldCgpXG4gICAqICAgc2V0LnN0b3JlIGluc3RhbmNlb2YgU2V0XG4gICAqICAgLy89PiB0cnVlXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICBzdXBlcihwYXJlbnQpXG4gICAgdGhpcy5zdG9yZSA9IG5ldyBTZXQoKVxuICB9XG59XG5cbi8qKlxuICogQHZlcnNpb24gNS4wLjAgPC0gbW92ZWQgaW50byBDaGFpbmVkTWFwQmFzZSAmIENoYWluZWRTZXQgZm9yIGxlc3MgbW9ub21vcnBoaWMgdXNhZ2VcbiAqIEBzaW5jZSA1LjAuMC1iZXRhLjZcbiAqIEBtZW1iZXJPZiBDaGFpbmVkU2V0XG4gKlxuICogQHJldHVybiB7QXJyYXk8bnVtYmVyIHwgc3RyaW5nIHwgKj59IGtleXNcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIENoYWluLnNldCgnZWgnLCAxKS5rZXlzKClcbiAqICAgIC8vPT4gWydlaCddXG4gKlxuICovXG5DaGFpbmVkU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBhcnJheU9mSW5kZXhlcyh0aGlzLnN0b3JlLnNpemUpXG59XG5cblxuLyoqXG4gKiBAZGVzYyBhcHBlbmRzIGEgbmV3IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgZW5kIG9mIHRoZSAuc3RvcmVcbiAqIEBzaW5jZSAwLjQuMFxuICogQG1lbWJlck9mIENoYWluZWRTZXRcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgYW55IHZhbHVlIHRvIGFkZCB0byAqKmVuZCoqIG9mIHRoZSBzdG9yZVxuICogQHJldHVybiB7Q2hhaW5lZFNldH0gQGNoYWluYWJsZVxuICpcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TZXQvYWRkIG1vemlsbGEtc2V0LWFkZH1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL21hc3Rlci8uaW50ZXJuYWwvYWRkU2V0RW50cnkuanMjTDkgbG9kYXNoLWFkZC1zZXQtZW50cnl9XG4gKiBAc2VlIHtAbGluayBtb3ppbGxhLXNldC1hZGR9XG4gKiBAc2VlIHtAbGluayBsb2Rhc2gtYWRkLXNldC1lbnRyeX1cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgY29uc3QgcGVvcGxlID0gbmV3IENoYWluZWRTZXQoKVxuICogICBwZW9wbGVcbiAqICAgICAuYWRkKCdzYW0nKVxuICogICAgIC5hZGQoJ3N1ZScpXG4gKlxuICogICBmb3IgKGxldCBuYW1lIG9mIHBlb3BsZSkgY29uc29sZS5sb2cobmFtZSlcbiAqICAgLy89PiBzYW0sIHN1ZVxuICpcbiAqL1xuQ2hhaW5lZFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgdGhpcy5zdG9yZS5hZGQodmFsdWUpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICogQGRlc2MgaW5zZXJ0cyB0aGUgdmFsdWUgYXQgdGhlICoqYmVnaW5uaW5nKiogb2YgdGhlIFNldFxuICogQHNpbmNlIDAuNC4wXG4gKiBAbWVtYmVyT2YgQ2hhaW5lZFNldFxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBhbnkgdmFsdWUgdG8gYWRkIHRvICoqYmVnaW5uaW5nKiogdGhlIHN0b3JlXG4gKiBAcmV0dXJuIHtDaGFpbmVkU2V0fSBAY2hhaW5hYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGNvbnN0IHBlb3BsZSA9IG5ldyBDaGFpbmVkU2V0KClcbiAqICAgcGVvcGxlXG4gKiAgICAgLmFkZCgnc3VlJylcbiAqICAgICAucHJlcGVuZCgnZmlyc3QnKVxuICpcbiAqICAgZm9yIChsZXQgbmFtZSBvZiBwZW9wbGUpIGNvbnNvbGUubG9nKG5hbWUpXG4gKiAgIC8vPT4gZmlyc3QsIHN1ZVxuICpcbiAqL1xuQ2hhaW5lZFNldC5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHRoaXMuc3RvcmUgPSBuZXcgU2V0KFt2YWx1ZV0uY29uY2F0KHRoaXMudmFsdWVzKCkpKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqIEBkZXNjIG1lcmdlIGFueSBBcnJheS9TZXQvSXRlcmF0YWJsZS9Db25jYXRhYmxlcyBpbnRvIHRoZSBhcnJheSwgYXQgdGhlIGVuZFxuICogQHNpbmNlIDAuNC4wXG4gKiBAbWVtYmVyT2YgQ2hhaW5lZFNldFxuICpcbiAqIEBwYXJhbSB7QXJyYXkgfCBTZXQgfCBDb25jYXRhYmxlfSBhcnIgdmFsdWVzIHRvIG1lcmdlIGluIGFuZCBhcHBlbmRcbiAqIEByZXR1cm4ge0NoYWluZWRTZXR9IEBjaGFpbmFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgY29uc3QgcGVvcGxlID0gbmV3IENoYWluZWRTZXQoKVxuICogICBwZW9wbGVcbiAqICAgICAuYWRkKCdzYW0nKVxuICogICAgIC5hZGQoJ3N1ZScpXG4gKiAgICAgLnByZXBlbmQoJ2ZpcnN0JylcbiAqICAgICAubWVyZ2UoWydtZXJnZWQnXSlcbiAqXG4gKiAgIGZvciAobGV0IG5hbWUgb2YgcGVvcGxlKSBjb25zb2xlLmxvZyhuYW1lKVxuICogICAvLz0+IGZpcnN0LCBzYW0sIHN1ZSwgbWVyZ2VkXG4gKlxuICovXG5DaGFpbmVkU2V0LnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uKGFycikge1xuICBjb25zdCBtZXJnZWFibGUgPSB0b2FycihhcnIpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VhYmxlLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5zdG9yZS5hZGQobWVyZ2VhYmxlW2ldKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2hhaW5lZFNldFxuIl0sIm5hbWVzIjpbImNvbnN0Iiwic3VwZXIiLCJsZXQiLCJ0aGlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3hDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7QUFDdENBLEdBQUssQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLDZCQUE2QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCN0QsSUFBTSxVQUFVLEdBQWtCO0VBQUMsQUFVakMsbUJBQVcsQ0FBQyxNQUFNLEVBQUU7SUFDbEJDLFNBQUssS0FBQSxDQUFDLE1BQUEsTUFBTSxDQUFDO0lBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRTtHQUN2Qjs7OztnREFBQSxBQUNGOzs7RUFkd0IsU0FjeEIsR0FBQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVztFQUNyQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztDQUN2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJELFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFNBQVMsS0FBSyxFQUFFO0VBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztFQUNyQixPQUFPLElBQUk7Q0FDWjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJELFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFNBQVMsS0FBSyxFQUFFO0VBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7RUFDbkQsT0FBTyxJQUFJO0NBQ1o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJELFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUM7O0FBQUE7RUFDMUNELEdBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztFQUM1QixLQUFLRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUN6Q0MsTUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQzdCO0VBQ0QsT0FBTyxJQUFJO0NBQ1o7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxVQUFVOyJ9