mirror of
https://github.com/verdaccio/verdaccio.git
synced 2025-03-04 02:02:39 -05:00
238 lines
5.8 KiB
JavaScript
238 lines
5.8 KiB
JavaScript
/*!
|
|
* lunr.SortedSet
|
|
* Copyright (C) @YEAR Oliver Nightingale
|
|
*/
|
|
|
|
/**
|
|
* lunr.SortedSets are used to maintain an array of uniq values in a sorted
|
|
* order.
|
|
*
|
|
* @constructor
|
|
*/
|
|
lunr.SortedSet = function () {
|
|
this.length = 0
|
|
this.elements = []
|
|
}
|
|
|
|
/**
|
|
* Loads a previously serialised sorted set.
|
|
*
|
|
* @param {Array} serialisedData The serialised set to load.
|
|
* @returns {lunr.SortedSet}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.load = function (serialisedData) {
|
|
var set = new this
|
|
|
|
set.elements = serialisedData
|
|
set.length = serialisedData.length
|
|
|
|
return set
|
|
}
|
|
|
|
/**
|
|
* Inserts new items into the set in the correct position to maintain the
|
|
* order.
|
|
*
|
|
* @param {Object} The objects to add to this set.
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.add = function () {
|
|
Array.prototype.slice.call(arguments).forEach(function (element) {
|
|
if (~this.indexOf(element)) return
|
|
this.elements.splice(this.locationFor(element), 0, element)
|
|
}, this)
|
|
|
|
this.length = this.elements.length
|
|
}
|
|
|
|
/**
|
|
* Converts this sorted set into an array.
|
|
*
|
|
* @returns {Array}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.toArray = function () {
|
|
return this.elements.slice()
|
|
}
|
|
|
|
/**
|
|
* Creates a new array with the results of calling a provided function on every
|
|
* element in this sorted set.
|
|
*
|
|
* Delegates to Array.prototype.map and has the same signature.
|
|
*
|
|
* @param {Function} fn The function that is called on each element of the
|
|
* set.
|
|
* @param {Object} ctx An optional object that can be used as the context
|
|
* for the function fn.
|
|
* @returns {Array}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.map = function (fn, ctx) {
|
|
return this.elements.map(fn, ctx)
|
|
}
|
|
|
|
/**
|
|
* Executes a provided function once per sorted set element.
|
|
*
|
|
* Delegates to Array.prototype.forEach and has the same signature.
|
|
*
|
|
* @param {Function} fn The function that is called on each element of the
|
|
* set.
|
|
* @param {Object} ctx An optional object that can be used as the context
|
|
* @memberOf SortedSet
|
|
* for the function fn.
|
|
*/
|
|
lunr.SortedSet.prototype.forEach = function (fn, ctx) {
|
|
return this.elements.forEach(fn, ctx)
|
|
}
|
|
|
|
/**
|
|
* Returns the index at which a given element can be found in the
|
|
* sorted set, or -1 if it is not present.
|
|
*
|
|
* @param {Object} elem The object to locate in the sorted set.
|
|
* @param {Number} start An optional index at which to start searching from
|
|
* within the set.
|
|
* @param {Number} end An optional index at which to stop search from within
|
|
* the set.
|
|
* @returns {Number}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.indexOf = function (elem, start, end) {
|
|
var start = start || 0,
|
|
end = end || this.elements.length,
|
|
sectionLength = end - start,
|
|
pivot = start + Math.floor(sectionLength / 2),
|
|
pivotElem = this.elements[pivot]
|
|
|
|
if (sectionLength <= 1) {
|
|
if (pivotElem === elem) {
|
|
return pivot
|
|
} else {
|
|
return -1
|
|
}
|
|
}
|
|
|
|
if (pivotElem < elem) return this.indexOf(elem, pivot, end)
|
|
if (pivotElem > elem) return this.indexOf(elem, start, pivot)
|
|
if (pivotElem === elem) return pivot
|
|
}
|
|
|
|
/**
|
|
* Returns the position within the sorted set that an element should be
|
|
* inserted at to maintain the current order of the set.
|
|
*
|
|
* This function assumes that the element to search for does not already exist
|
|
* in the sorted set.
|
|
*
|
|
* @param {Object} elem The elem to find the position for in the set
|
|
* @param {Number} start An optional index at which to start searching from
|
|
* within the set.
|
|
* @param {Number} end An optional index at which to stop search from within
|
|
* the set.
|
|
* @returns {Number}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.locationFor = function (elem, start, end) {
|
|
var start = start || 0,
|
|
end = end || this.elements.length,
|
|
sectionLength = end - start,
|
|
pivot = start + Math.floor(sectionLength / 2),
|
|
pivotElem = this.elements[pivot]
|
|
|
|
if (sectionLength <= 1) {
|
|
if (pivotElem > elem) return pivot
|
|
if (pivotElem < elem) return pivot + 1
|
|
}
|
|
|
|
if (pivotElem < elem) return this.locationFor(elem, pivot, end)
|
|
if (pivotElem > elem) return this.locationFor(elem, start, pivot)
|
|
}
|
|
|
|
/**
|
|
* Creates a new lunr.SortedSet that contains the elements in the intersection
|
|
* of this set and the passed set.
|
|
*
|
|
* @param {lunr.SortedSet} otherSet The set to intersect with this set.
|
|
* @returns {lunr.SortedSet}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.intersect = function (otherSet) {
|
|
var intersectSet = new lunr.SortedSet,
|
|
i = 0, j = 0,
|
|
a_len = this.length, b_len = otherSet.length,
|
|
a = this.elements, b = otherSet.elements
|
|
|
|
while (true) {
|
|
if (i > a_len - 1 || j > b_len - 1) break
|
|
|
|
if (a[i] === b[j]) {
|
|
intersectSet.add(a[i])
|
|
i++, j++
|
|
continue
|
|
}
|
|
|
|
if (a[i] < b[j]) {
|
|
i++
|
|
continue
|
|
}
|
|
|
|
if (a[i] > b[j]) {
|
|
j++
|
|
continue
|
|
}
|
|
};
|
|
|
|
return intersectSet
|
|
}
|
|
|
|
/**
|
|
* Makes a copy of this set
|
|
*
|
|
* @returns {lunr.SortedSet}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.clone = function () {
|
|
var clone = new lunr.SortedSet
|
|
|
|
clone.elements = this.toArray()
|
|
clone.length = clone.elements.length
|
|
|
|
return clone
|
|
}
|
|
|
|
/**
|
|
* Creates a new lunr.SortedSet that contains the elements in the union
|
|
* of this set and the passed set.
|
|
*
|
|
* @param {lunr.SortedSet} otherSet The set to union with this set.
|
|
* @returns {lunr.SortedSet}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.union = function (otherSet) {
|
|
var longSet, shortSet, unionSet
|
|
|
|
if (this.length >= otherSet.length) {
|
|
longSet = this, shortSet = otherSet
|
|
} else {
|
|
longSet = otherSet, shortSet = this
|
|
}
|
|
|
|
unionSet = longSet.clone()
|
|
|
|
unionSet.add.apply(unionSet, shortSet.toArray())
|
|
|
|
return unionSet
|
|
}
|
|
|
|
/**
|
|
* Returns a representation of the sorted set ready for serialisation.
|
|
*
|
|
* @returns {Array}
|
|
* @memberOf SortedSet
|
|
*/
|
|
lunr.SortedSet.prototype.toJSON = function () {
|
|
return this.toArray()
|
|
}
|