securityos/node_modules/lunr/lib/set.js

134 lines
2.4 KiB
JavaScript

/*!
* lunr.Set
* Copyright (C) @YEAR Oliver Nightingale
*/
/**
* A lunr set.
*
* @constructor
*/
lunr.Set = function (elements) {
this.elements = Object.create(null)
if (elements) {
this.length = elements.length
for (var i = 0; i < this.length; i++) {
this.elements[elements[i]] = true
}
} else {
this.length = 0
}
}
/**
* A complete set that contains all elements.
*
* @static
* @readonly
* @type {lunr.Set}
*/
lunr.Set.complete = {
intersect: function (other) {
return other
},
union: function () {
return this
},
contains: function () {
return true
}
}
/**
* An empty set that contains no elements.
*
* @static
* @readonly
* @type {lunr.Set}
*/
lunr.Set.empty = {
intersect: function () {
return this
},
union: function (other) {
return other
},
contains: function () {
return false
}
}
/**
* Returns true if this set contains the specified object.
*
* @param {object} object - Object whose presence in this set is to be tested.
* @returns {boolean} - True if this set contains the specified object.
*/
lunr.Set.prototype.contains = function (object) {
return !!this.elements[object]
}
/**
* Returns a new set containing only the elements that are present in both
* this set and the specified set.
*
* @param {lunr.Set} other - set to intersect with this set.
* @returns {lunr.Set} a new set that is the intersection of this and the specified set.
*/
lunr.Set.prototype.intersect = function (other) {
var a, b, elements, intersection = []
if (other === lunr.Set.complete) {
return this
}
if (other === lunr.Set.empty) {
return other
}
if (this.length < other.length) {
a = this
b = other
} else {
a = other
b = this
}
elements = Object.keys(a.elements)
for (var i = 0; i < elements.length; i++) {
var element = elements[i]
if (element in b.elements) {
intersection.push(element)
}
}
return new lunr.Set (intersection)
}
/**
* Returns a new set combining the elements of this and the specified set.
*
* @param {lunr.Set} other - set to union with this set.
* @return {lunr.Set} a new set that is the union of this and the specified set.
*/
lunr.Set.prototype.union = function (other) {
if (other === lunr.Set.complete) {
return lunr.Set.complete
}
if (other === lunr.Set.empty) {
return this
}
return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements)))
}