123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- /*!
- * 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 () {
- var i, element
- for (i = 0; i < arguments.length; i++) {
- element = arguments[i]
- if (~this.indexOf(element)) continue
- this.elements.splice(this.locationFor(element), 0, element)
- }
- 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.
- * @returns {Number}
- * @memberOf SortedSet
- */
- lunr.SortedSet.prototype.indexOf = function (elem) {
- var start = 0,
- end = this.elements.length,
- sectionLength = end - start,
- pivot = start + Math.floor(sectionLength / 2),
- pivotElem = this.elements[pivot]
- while (sectionLength > 1) {
- if (pivotElem === elem) return pivot
- if (pivotElem < elem) start = pivot
- if (pivotElem > elem) end = pivot
- sectionLength = end - start
- pivot = start + Math.floor(sectionLength / 2)
- pivotElem = this.elements[pivot]
- }
- if (pivotElem === elem) return pivot
- return -1
- }
- /**
- * 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
- * @returns {Number}
- * @memberOf SortedSet
- */
- lunr.SortedSet.prototype.locationFor = function (elem) {
- var start = 0,
- end = this.elements.length,
- sectionLength = end - start,
- pivot = start + Math.floor(sectionLength / 2),
- pivotElem = this.elements[pivot]
- while (sectionLength > 1) {
- if (pivotElem < elem) start = pivot
- if (pivotElem > elem) end = pivot
- sectionLength = end - start
- pivot = start + Math.floor(sectionLength / 2)
- pivotElem = this.elements[pivot]
- }
- if (pivotElem > elem) return pivot
- if (pivotElem < elem) return pivot + 1
- }
- /**
- * 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()
- for(var i = 0, shortSetElements = shortSet.toArray(); i < shortSetElements.length; i++){
- unionSet.add(shortSetElements[i])
- }
- return unionSet
- }
- /**
- * Returns a representation of the sorted set ready for serialisation.
- *
- * @returns {Array}
- * @memberOf SortedSet
- */
- lunr.SortedSet.prototype.toJSON = function () {
- return this.toArray()
- }
|