You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

112 rivejä
2.6 KiB

  1. 'use strict';
  2. const Ref = require('./ref');
  3. module.exports = class Set {
  4. constructor() {
  5. this._set = [];
  6. }
  7. add(value, refs) {
  8. if (!Ref.isRef(value) && this.has(value, null, null, false)) {
  9. return;
  10. }
  11. if (refs !== undefined) { // If it's a merge, we don't have any refs
  12. Ref.push(refs, value);
  13. }
  14. this._set.push(value);
  15. return this;
  16. }
  17. merge(add, remove) {
  18. for (let i = 0; i < add._set.length; ++i) {
  19. this.add(add._set[i]);
  20. }
  21. for (let i = 0; i < remove._set.length; ++i) {
  22. this.remove(remove._set[i]);
  23. }
  24. return this;
  25. }
  26. remove(value) {
  27. this._set = this._set.filter((item) => value !== item);
  28. return this;
  29. }
  30. has(value, state, options, insensitive) {
  31. for (let i = 0; i < this._set.length; ++i) {
  32. let items = this._set[i];
  33. if (state && Ref.isRef(items)) { // Only resolve references if there is a state, otherwise it's a merge
  34. items = items(state.reference || state.parent, options);
  35. }
  36. if (!Array.isArray(items)) {
  37. items = [items];
  38. }
  39. for (let j = 0; j < items.length; ++j) {
  40. const item = items[j];
  41. if (typeof value !== typeof item) {
  42. continue;
  43. }
  44. if (value === item ||
  45. (value instanceof Date && item instanceof Date && value.getTime() === item.getTime()) ||
  46. (insensitive && typeof value === 'string' && value.toLowerCase() === item.toLowerCase()) ||
  47. (Buffer.isBuffer(value) && Buffer.isBuffer(item) && value.length === item.length && value.toString('binary') === item.toString('binary'))) {
  48. return true;
  49. }
  50. }
  51. }
  52. return false;
  53. }
  54. values(options) {
  55. if (options && options.stripUndefined) {
  56. const values = [];
  57. for (let i = 0; i < this._set.length; ++i) {
  58. const item = this._set[i];
  59. if (item !== undefined) {
  60. values.push(item);
  61. }
  62. }
  63. return values;
  64. }
  65. return this._set.slice();
  66. }
  67. slice() {
  68. const newSet = new Set();
  69. newSet._set = this._set.slice();
  70. return newSet;
  71. }
  72. concat(source) {
  73. const newSet = new Set();
  74. newSet._set = this._set.concat(source._set);
  75. return newSet;
  76. }
  77. };