134 lines
2.4 KiB
JavaScript
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)))
|
||
|
}
|