Update bot
Took 2 hours 17 minutes
This commit is contained in:
4
node_modules/denque/CHANGELOG.md
generated
vendored
Normal file
4
node_modules/denque/CHANGELOG.md
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
## 1.5.0
|
||||
|
||||
- feat: adds capacity option for circular buffers (#27)
|
||||
|
13
node_modules/denque/LICENSE
generated
vendored
Normal file
13
node_modules/denque/LICENSE
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
Copyright (c) 2018 Mike Diarmid (Salakar) <mike.diarmid@gmail.com>
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this library except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
362
node_modules/denque/README.md
generated
vendored
Normal file
362
node_modules/denque/README.md
generated
vendored
Normal file
@ -0,0 +1,362 @@
|
||||
<p align="center">
|
||||
<a href="https://invertase.io">
|
||||
<img src="https://static.invertase.io/assets/invertase-logo-small.png"><br/>
|
||||
</a>
|
||||
<h2 align="center">Denque</h2>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.npmjs.com/package/denque"><img src="https://img.shields.io/npm/dm/denque.svg?style=flat-square" alt="NPM downloads"></a>
|
||||
<a href="https://www.npmjs.com/package/denque"><img src="https://img.shields.io/npm/v/denque.svg?style=flat-square" alt="NPM version"></a>
|
||||
<a href="https://travis-ci.org/Salakar/denque"><img src="https://travis-ci.org/invertase/denque.svg" alt="Build version"></a>
|
||||
<a href="https://coveralls.io/github/invertase/denque?branch=master"><img src="https://coveralls.io/repos/github/invertase/denque/badge.svg?branch=master" alt="Build version"></a>
|
||||
<a href="/LICENSE"><img src="https://img.shields.io/npm/l/denque.svg?style=flat-square" alt="License"></a>
|
||||
<a href="https://discord.gg/C9aK28N"><img src="https://img.shields.io/discord/295953187817521152.svg?logo=discord&style=flat-square&colorA=7289da&label=discord" alt="Chat"></a>
|
||||
<a href="https://twitter.com/invertaseio"><img src="https://img.shields.io/twitter/follow/invertaseio.svg?style=social&label=Follow" alt="Follow on Twitter"></a>
|
||||
</p>
|
||||
|
||||
Extremely fast and lightweight [double-ended queue](http://en.wikipedia.org/wiki/Double-ended_queue) implementation with zero dependencies.
|
||||
|
||||
Double-ended queues can also be used as a:
|
||||
|
||||
- [Stack](http://en.wikipedia.org/wiki/Stack_\(abstract_data_type\))
|
||||
- [Queue](http://en.wikipedia.org/wiki/Queue_\(data_structure\))
|
||||
|
||||
This implementation is currently the fastest available, even faster than `double-ended-queue`, see the [benchmarks](#benchmarks)
|
||||
|
||||
Every queue operation is done at a constant `O(1)` - including random access from `.peekAt(index)`.
|
||||
|
||||
**Works on all node versions >= v0.10**
|
||||
|
||||
# Quick Start
|
||||
|
||||
npm install denque
|
||||
|
||||
```js
|
||||
const Denque = require("denque");
|
||||
|
||||
const denque = new Denque([1,2,3,4]);
|
||||
denque.shift(); // 1
|
||||
denque.pop(); // 4
|
||||
```
|
||||
|
||||
|
||||
# API
|
||||
|
||||
- [`new Denque()`](#new-denque---denque)
|
||||
- [`new Denque(Array items)`](#new-denquearray-items---denque)
|
||||
- [`push(item)`](#pushitem---int)
|
||||
- [`unshift(item)`](#unshiftitem---int)
|
||||
- [`pop()`](#pop---dynamic)
|
||||
- [`shift()`](#shift---dynamic)
|
||||
- [`toArray()`](#toarray---array)
|
||||
- [`peekBack()`](#peekback---dynamic)
|
||||
- [`peekFront()`](#peekfront---dynamic)
|
||||
- [`peekAt(int index)`](#peekAtint-index---dynamic)
|
||||
- [`remove(int index, int count)`](#remove)
|
||||
- [`removeOne(int index)`](#removeOne)
|
||||
- [`splice(int index, int count, item1, item2, ...)`](#splice)
|
||||
- [`isEmpty()`](#isempty---boolean)
|
||||
- [`clear()`](#clear---void)
|
||||
|
||||
#### `new Denque()` -> `Denque`
|
||||
|
||||
Creates an empty double-ended queue with initial capacity of 4.
|
||||
|
||||
```js
|
||||
var denque = new Denque();
|
||||
denque.push(1);
|
||||
denque.push(2);
|
||||
denque.push(3);
|
||||
denque.shift(); //1
|
||||
denque.pop(); //3
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `new Denque(Array items)` -> `Denque`
|
||||
|
||||
Creates a double-ended queue from `items`.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3,4]);
|
||||
denque.shift(); // 1
|
||||
denque.pop(); // 4
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
#### `push(item)` -> `int`
|
||||
|
||||
Push an item to the back of this queue. Returns the amount of items currently in the queue after the operation.
|
||||
|
||||
```js
|
||||
var denque = new Denque();
|
||||
denque.push(1);
|
||||
denque.pop(); // 1
|
||||
denque.push(2);
|
||||
denque.push(3);
|
||||
denque.shift(); // 2
|
||||
denque.shift(); // 3
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `unshift(item)` -> `int`
|
||||
|
||||
Unshift an item to the front of this queue. Returns the amount of items currently in the queue after the operation.
|
||||
|
||||
```js
|
||||
var denque = new Denque([2,3]);
|
||||
denque.unshift(1);
|
||||
denque.toString(); // "1,2,3"
|
||||
denque.unshift(-2);
|
||||
denque.toString(); // "-2,-1,0,1,2,3"
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
#### `pop()` -> `dynamic`
|
||||
|
||||
Pop off the item at the back of this queue.
|
||||
|
||||
Note: The item will be removed from the queue. If you simply want to see what's at the back of the queue use [`peekBack()`](#peekback---dynamic) or [`.peekAt(-1)`](#peekAtint-index---dynamic).
|
||||
|
||||
If the queue is empty, `undefined` is returned. If you need to differentiate between `undefined` values in the queue and `pop()` return value -
|
||||
check the queue `.length` before popping.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3]);
|
||||
denque.pop(); // 3
|
||||
denque.pop(); // 2
|
||||
denque.pop(); // 1
|
||||
denque.pop(); // undefined
|
||||
```
|
||||
|
||||
**Aliases:** `removeBack`
|
||||
|
||||
<hr>
|
||||
|
||||
#### `shift()` -> `dynamic`
|
||||
|
||||
Shifts off the item at the front of this queue.
|
||||
|
||||
Note: The item will be removed from the queue. If you simply want to see what's at the front of the queue use [`peekFront()`](#peekfront---dynamic) or [`.peekAt(0)`](#peekAtint-index---dynamic).
|
||||
|
||||
If the queue is empty, `undefined` is returned. If you need to differentiate between `undefined` values in the queue and `shift()` return value -
|
||||
check the queue `.length` before shifting.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3]);
|
||||
denque.shift(); // 1
|
||||
denque.shift(); // 2
|
||||
denque.shift(); // 3
|
||||
denque.shift(); // undefined
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `toArray()` -> `Array`
|
||||
|
||||
Returns the items in the queue as an array. Starting from the item in the front of the queue and ending to the item at the back of the queue.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3]);
|
||||
denque.push(4);
|
||||
denque.unshift(0);
|
||||
denque.toArray(); // [0,1,2,3,4]
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `peekBack()` -> `dynamic`
|
||||
|
||||
Returns the item that is at the back of this queue without removing it.
|
||||
|
||||
If the queue is empty, `undefined` is returned.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3]);
|
||||
denque.push(4);
|
||||
denque.peekBack(); // 4
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `peekFront()` -> `dynamic`
|
||||
|
||||
Returns the item that is at the front of this queue without removing it.
|
||||
|
||||
If the queue is empty, `undefined` is returned.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3]);
|
||||
denque.push(4);
|
||||
denque.peekFront(); // 1
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `peekAt(int index)` -> `dynamic`
|
||||
|
||||
Returns the item that is at the given `index` of this queue without removing it.
|
||||
|
||||
The index is zero-based, so `.peekAt(0)` will return the item that is at the front, `.peekAt(1)` will return
|
||||
the item that comes after and so on.
|
||||
|
||||
The index can be negative to read items at the back of the queue. `.peekAt(-1)` returns the item that is at the back of the queue,
|
||||
`.peekAt(-2)` will return the item that comes before and so on.
|
||||
|
||||
Returns `undefined` if `index` is not a valid index into the queue.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3]);
|
||||
denque.peekAt(0); //1
|
||||
denque.peekAt(1); //2
|
||||
denque.peekAt(2); //3
|
||||
|
||||
denque.peekAt(-1); // 3
|
||||
denque.peekAt(-2); // 2
|
||||
denque.peekAt(-3); // 1
|
||||
```
|
||||
|
||||
**Note**: The implementation has O(1) random access using `.peekAt()`.
|
||||
|
||||
**Aliases:** `get`
|
||||
|
||||
<hr>
|
||||
|
||||
#### `remove(int index, int count)` -> `array`
|
||||
|
||||
Remove number of items from the specified index from the list.
|
||||
|
||||
Returns array of removed items.
|
||||
|
||||
Returns undefined if the list is empty.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3,4,5,6,7]);
|
||||
denque.remove(0,3); //[1,2,3]
|
||||
denque.remove(1,2); //[5,6]
|
||||
var denque1 = new Denque([1,2,3,4,5,6,7]);
|
||||
denque1.remove(4, 100); //[5,6,7]
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `removeOne(int index)` -> `dynamic`
|
||||
|
||||
Remove and return the item at the specified index from the list.
|
||||
|
||||
Returns undefined if the list is empty.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3,4,5,6,7]);
|
||||
denque.removeOne(4); // 5
|
||||
denque.removeOne(3); // 4
|
||||
denque1.removeOne(1); // 2
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `splice(int index, int count, item1, item2, ...)` -> `array`
|
||||
|
||||
Native splice implementation.
|
||||
|
||||
Remove number of items from the specified index from the list and/or add new elements.
|
||||
|
||||
Returns array of removed items or empty array if count == 0.
|
||||
|
||||
Returns undefined if the list is empty.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3,4,5,6,7]);
|
||||
denque.splice(denque.length, 0, 8, 9, 10); // []
|
||||
denque.toArray() // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
|
||||
denque.splice(3, 3, 44, 55, 66); // [4,5,6]
|
||||
denque.splice(5,4, 666,667,668,669); // [ 66, 7, 8, 9 ]
|
||||
denque.toArray() // [ 1, 2, 3, 44, 55, 666, 667, 668, 669, 10 ]
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `isEmpty()` -> `boolean`
|
||||
|
||||
Return `true` if this queue is empty, `false` otherwise.
|
||||
|
||||
```js
|
||||
var denque = new Denque();
|
||||
denque.isEmpty(); // true
|
||||
denque.push(1);
|
||||
denque.isEmpty(); // false
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
#### `clear()` -> `void`
|
||||
|
||||
Remove all items from this queue. Does not change the queue's capacity.
|
||||
|
||||
```js
|
||||
var denque = new Denque([1,2,3]);
|
||||
denque.toString(); // "1,2,3"
|
||||
denque.clear();
|
||||
denque.toString(); // ""
|
||||
```
|
||||
<hr>
|
||||
|
||||
|
||||
## Benchmarks
|
||||
|
||||
#### Platform info:
|
||||
```
|
||||
Darwin 17.0.0 x64
|
||||
Node.JS 9.4.0
|
||||
V8 6.2.414.46-node.17
|
||||
Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz × 8
|
||||
```
|
||||
|
||||
#### 1000 items in queue
|
||||
|
||||
(3 x shift + 3 x push ops per 'op')
|
||||
|
||||
denque x 64,365,425 ops/sec ±0.69% (92 runs sampled)
|
||||
double-ended-queue x 26,646,882 ops/sec ±0.47% (94 runs sampled)
|
||||
|
||||
#### 2 million items in queue
|
||||
|
||||
(3 x shift + 3 x push ops per 'op')
|
||||
|
||||
denque x 61,994,249 ops/sec ±0.26% (95 runs sampled)
|
||||
double-ended-queue x 26,363,500 ops/sec ±0.42% (91 runs sampled)
|
||||
|
||||
#### Splice
|
||||
|
||||
(1 x splice per 'op') - initial size of 100,000 items
|
||||
|
||||
denque.splice x 925,749 ops/sec ±22.29% (77 runs sampled)
|
||||
native array splice x 7,777 ops/sec ±8.35% (50 runs sampled)
|
||||
|
||||
#### Remove
|
||||
|
||||
(1 x remove + 10 x push per 'op') - initial size of 100,000 items
|
||||
|
||||
denque.remove x 2,635,275 ops/sec ±0.37% (95 runs sampled)
|
||||
native array splice - Fails to complete: "JavaScript heap out of memory"
|
||||
|
||||
#### Remove One
|
||||
|
||||
(1 x removeOne + 10 x push per 'op') - initial size of 100,000 items
|
||||
|
||||
denque.removeOne x 1,088,240 ops/sec ±0.21% (93 runs sampled)
|
||||
native array splice x 5,300 ops/sec ±0.41% (96 runs sampled)
|
||||
|
||||
---
|
||||
|
||||
Built and maintained with 💛 by [Invertase](https://invertase.io).
|
||||
|
||||
- [💼 Hire Us](https://invertase.io/hire-us)
|
||||
- [☕️ Sponsor Us](https://opencollective.com/react-native-firebase)
|
||||
- [👩💻 Work With Us](https://invertase.io/jobs)
|
31
node_modules/denque/index.d.ts
generated
vendored
Normal file
31
node_modules/denque/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
declare class Denque<T = any> {
|
||||
constructor();
|
||||
constructor(array: T[]);
|
||||
constructor(array: T[], options: IDenqueOptions);
|
||||
|
||||
push(item: T): number;
|
||||
unshift(item: T): number;
|
||||
pop(): T | undefined;
|
||||
removeBack(): T | undefined;
|
||||
shift(): T | undefined;
|
||||
peekBack(): T | undefined;
|
||||
peekFront(): T | undefined;
|
||||
peekAt(index: number): T | undefined;
|
||||
get(index: number): T | undefined;
|
||||
remove(index: number, count: number): T[];
|
||||
removeOne(index: number): T | undefined;
|
||||
splice(index: number, count: number, ...item: T[]): T[] | undefined;
|
||||
isEmpty(): boolean;
|
||||
clear(): void;
|
||||
|
||||
toString(): string;
|
||||
toArray(): T[];
|
||||
|
||||
length: number;
|
||||
}
|
||||
|
||||
interface IDenqueOptions {
|
||||
capacity?: number
|
||||
}
|
||||
|
||||
export = Denque;
|
443
node_modules/denque/index.js
generated
vendored
Normal file
443
node_modules/denque/index.js
generated
vendored
Normal file
@ -0,0 +1,443 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Custom implementation of a double ended queue.
|
||||
*/
|
||||
function Denque(array, options) {
|
||||
var options = options || {};
|
||||
|
||||
this._head = 0;
|
||||
this._tail = 0;
|
||||
this._capacity = options.capacity;
|
||||
this._capacityMask = 0x3;
|
||||
this._list = new Array(4);
|
||||
if (Array.isArray(array)) {
|
||||
this._fromArray(array);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* -------------
|
||||
* PUBLIC API
|
||||
* -------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns the item at the specified index from the list.
|
||||
* 0 is the first element, 1 is the second, and so on...
|
||||
* Elements at negative values are that many from the end: -1 is one before the end
|
||||
* (the last element), -2 is two before the end (one before last), etc.
|
||||
* @param index
|
||||
* @returns {*}
|
||||
*/
|
||||
Denque.prototype.peekAt = function peekAt(index) {
|
||||
var i = index;
|
||||
// expect a number or return undefined
|
||||
if ((i !== (i | 0))) {
|
||||
return void 0;
|
||||
}
|
||||
var len = this.size();
|
||||
if (i >= len || i < -len) return undefined;
|
||||
if (i < 0) i += len;
|
||||
i = (this._head + i) & this._capacityMask;
|
||||
return this._list[i];
|
||||
};
|
||||
|
||||
/**
|
||||
* Alias for peekAt()
|
||||
* @param i
|
||||
* @returns {*}
|
||||
*/
|
||||
Denque.prototype.get = function get(i) {
|
||||
return this.peekAt(i);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the first item in the list without removing it.
|
||||
* @returns {*}
|
||||
*/
|
||||
Denque.prototype.peek = function peek() {
|
||||
if (this._head === this._tail) return undefined;
|
||||
return this._list[this._head];
|
||||
};
|
||||
|
||||
/**
|
||||
* Alias for peek()
|
||||
* @returns {*}
|
||||
*/
|
||||
Denque.prototype.peekFront = function peekFront() {
|
||||
return this.peek();
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the item that is at the back of the queue without removing it.
|
||||
* Uses peekAt(-1)
|
||||
*/
|
||||
Denque.prototype.peekBack = function peekBack() {
|
||||
return this.peekAt(-1);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the current length of the queue
|
||||
* @return {Number}
|
||||
*/
|
||||
Object.defineProperty(Denque.prototype, 'length', {
|
||||
get: function length() {
|
||||
return this.size();
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Return the number of items on the list, or 0 if empty.
|
||||
* @returns {number}
|
||||
*/
|
||||
Denque.prototype.size = function size() {
|
||||
if (this._head === this._tail) return 0;
|
||||
if (this._head < this._tail) return this._tail - this._head;
|
||||
else return this._capacityMask + 1 - (this._head - this._tail);
|
||||
};
|
||||
|
||||
/**
|
||||
* Add an item at the beginning of the list.
|
||||
* @param item
|
||||
*/
|
||||
Denque.prototype.unshift = function unshift(item) {
|
||||
if (item === undefined) return this.size();
|
||||
var len = this._list.length;
|
||||
this._head = (this._head - 1 + len) & this._capacityMask;
|
||||
this._list[this._head] = item;
|
||||
if (this._tail === this._head) this._growArray();
|
||||
if (this._capacity && this.size() > this._capacity) this.pop();
|
||||
if (this._head < this._tail) return this._tail - this._head;
|
||||
else return this._capacityMask + 1 - (this._head - this._tail);
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove and return the first item on the list,
|
||||
* Returns undefined if the list is empty.
|
||||
* @returns {*}
|
||||
*/
|
||||
Denque.prototype.shift = function shift() {
|
||||
var head = this._head;
|
||||
if (head === this._tail) return undefined;
|
||||
var item = this._list[head];
|
||||
this._list[head] = undefined;
|
||||
this._head = (head + 1) & this._capacityMask;
|
||||
if (head < 2 && this._tail > 10000 && this._tail <= this._list.length >>> 2) this._shrinkArray();
|
||||
return item;
|
||||
};
|
||||
|
||||
/**
|
||||
* Add an item to the bottom of the list.
|
||||
* @param item
|
||||
*/
|
||||
Denque.prototype.push = function push(item) {
|
||||
if (item === undefined) return this.size();
|
||||
var tail = this._tail;
|
||||
this._list[tail] = item;
|
||||
this._tail = (tail + 1) & this._capacityMask;
|
||||
if (this._tail === this._head) {
|
||||
this._growArray();
|
||||
}
|
||||
if (this._capacity && this.size() > this._capacity) {
|
||||
this.shift();
|
||||
}
|
||||
if (this._head < this._tail) return this._tail - this._head;
|
||||
else return this._capacityMask + 1 - (this._head - this._tail);
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove and return the last item on the list.
|
||||
* Returns undefined if the list is empty.
|
||||
* @returns {*}
|
||||
*/
|
||||
Denque.prototype.pop = function pop() {
|
||||
var tail = this._tail;
|
||||
if (tail === this._head) return undefined;
|
||||
var len = this._list.length;
|
||||
this._tail = (tail - 1 + len) & this._capacityMask;
|
||||
var item = this._list[this._tail];
|
||||
this._list[this._tail] = undefined;
|
||||
if (this._head < 2 && tail > 10000 && tail <= len >>> 2) this._shrinkArray();
|
||||
return item;
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove and return the item at the specified index from the list.
|
||||
* Returns undefined if the list is empty.
|
||||
* @param index
|
||||
* @returns {*}
|
||||
*/
|
||||
Denque.prototype.removeOne = function removeOne(index) {
|
||||
var i = index;
|
||||
// expect a number or return undefined
|
||||
if ((i !== (i | 0))) {
|
||||
return void 0;
|
||||
}
|
||||
if (this._head === this._tail) return void 0;
|
||||
var size = this.size();
|
||||
var len = this._list.length;
|
||||
if (i >= size || i < -size) return void 0;
|
||||
if (i < 0) i += size;
|
||||
i = (this._head + i) & this._capacityMask;
|
||||
var item = this._list[i];
|
||||
var k;
|
||||
if (index < size / 2) {
|
||||
for (k = index; k > 0; k--) {
|
||||
this._list[i] = this._list[i = (i - 1 + len) & this._capacityMask];
|
||||
}
|
||||
this._list[i] = void 0;
|
||||
this._head = (this._head + 1 + len) & this._capacityMask;
|
||||
} else {
|
||||
for (k = size - 1 - index; k > 0; k--) {
|
||||
this._list[i] = this._list[i = ( i + 1 + len) & this._capacityMask];
|
||||
}
|
||||
this._list[i] = void 0;
|
||||
this._tail = (this._tail - 1 + len) & this._capacityMask;
|
||||
}
|
||||
return item;
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove number of items from the specified index from the list.
|
||||
* Returns array of removed items.
|
||||
* Returns undefined if the list is empty.
|
||||
* @param index
|
||||
* @param count
|
||||
* @returns {array}
|
||||
*/
|
||||
Denque.prototype.remove = function remove(index, count) {
|
||||
var i = index;
|
||||
var removed;
|
||||
var del_count = count;
|
||||
// expect a number or return undefined
|
||||
if ((i !== (i | 0))) {
|
||||
return void 0;
|
||||
}
|
||||
if (this._head === this._tail) return void 0;
|
||||
var size = this.size();
|
||||
var len = this._list.length;
|
||||
if (i >= size || i < -size || count < 1) return void 0;
|
||||
if (i < 0) i += size;
|
||||
if (count === 1 || !count) {
|
||||
removed = new Array(1);
|
||||
removed[0] = this.removeOne(i);
|
||||
return removed;
|
||||
}
|
||||
if (i === 0 && i + count >= size) {
|
||||
removed = this.toArray();
|
||||
this.clear();
|
||||
return removed;
|
||||
}
|
||||
if (i + count > size) count = size - i;
|
||||
var k;
|
||||
removed = new Array(count);
|
||||
for (k = 0; k < count; k++) {
|
||||
removed[k] = this._list[(this._head + i + k) & this._capacityMask];
|
||||
}
|
||||
i = (this._head + i) & this._capacityMask;
|
||||
if (index + count === size) {
|
||||
this._tail = (this._tail - count + len) & this._capacityMask;
|
||||
for (k = count; k > 0; k--) {
|
||||
this._list[i = (i + 1 + len) & this._capacityMask] = void 0;
|
||||
}
|
||||
return removed;
|
||||
}
|
||||
if (index === 0) {
|
||||
this._head = (this._head + count + len) & this._capacityMask;
|
||||
for (k = count - 1; k > 0; k--) {
|
||||
this._list[i = (i + 1 + len) & this._capacityMask] = void 0;
|
||||
}
|
||||
return removed;
|
||||
}
|
||||
if (i < size / 2) {
|
||||
this._head = (this._head + index + count + len) & this._capacityMask;
|
||||
for (k = index; k > 0; k--) {
|
||||
this.unshift(this._list[i = (i - 1 + len) & this._capacityMask]);
|
||||
}
|
||||
i = (this._head - 1 + len) & this._capacityMask;
|
||||
while (del_count > 0) {
|
||||
this._list[i = (i - 1 + len) & this._capacityMask] = void 0;
|
||||
del_count--;
|
||||
}
|
||||
if (index < 0) this._tail = i;
|
||||
} else {
|
||||
this._tail = i;
|
||||
i = (i + count + len) & this._capacityMask;
|
||||
for (k = size - (count + index); k > 0; k--) {
|
||||
this.push(this._list[i++]);
|
||||
}
|
||||
i = this._tail;
|
||||
while (del_count > 0) {
|
||||
this._list[i = (i + 1 + len) & this._capacityMask] = void 0;
|
||||
del_count--;
|
||||
}
|
||||
}
|
||||
if (this._head < 2 && this._tail > 10000 && this._tail <= len >>> 2) this._shrinkArray();
|
||||
return removed;
|
||||
};
|
||||
|
||||
/**
|
||||
* Native splice implementation.
|
||||
* Remove number of items from the specified index from the list and/or add new elements.
|
||||
* Returns array of removed items or empty array if count == 0.
|
||||
* Returns undefined if the list is empty.
|
||||
*
|
||||
* @param index
|
||||
* @param count
|
||||
* @param {...*} [elements]
|
||||
* @returns {array}
|
||||
*/
|
||||
Denque.prototype.splice = function splice(index, count) {
|
||||
var i = index;
|
||||
// expect a number or return undefined
|
||||
if ((i !== (i | 0))) {
|
||||
return void 0;
|
||||
}
|
||||
var size = this.size();
|
||||
if (i < 0) i += size;
|
||||
if (i > size) return void 0;
|
||||
if (arguments.length > 2) {
|
||||
var k;
|
||||
var temp;
|
||||
var removed;
|
||||
var arg_len = arguments.length;
|
||||
var len = this._list.length;
|
||||
var arguments_index = 2;
|
||||
if (!size || i < size / 2) {
|
||||
temp = new Array(i);
|
||||
for (k = 0; k < i; k++) {
|
||||
temp[k] = this._list[(this._head + k) & this._capacityMask];
|
||||
}
|
||||
if (count === 0) {
|
||||
removed = [];
|
||||
if (i > 0) {
|
||||
this._head = (this._head + i + len) & this._capacityMask;
|
||||
}
|
||||
} else {
|
||||
removed = this.remove(i, count);
|
||||
this._head = (this._head + i + len) & this._capacityMask;
|
||||
}
|
||||
while (arg_len > arguments_index) {
|
||||
this.unshift(arguments[--arg_len]);
|
||||
}
|
||||
for (k = i; k > 0; k--) {
|
||||
this.unshift(temp[k - 1]);
|
||||
}
|
||||
} else {
|
||||
temp = new Array(size - (i + count));
|
||||
var leng = temp.length;
|
||||
for (k = 0; k < leng; k++) {
|
||||
temp[k] = this._list[(this._head + i + count + k) & this._capacityMask];
|
||||
}
|
||||
if (count === 0) {
|
||||
removed = [];
|
||||
if (i != size) {
|
||||
this._tail = (this._head + i + len) & this._capacityMask;
|
||||
}
|
||||
} else {
|
||||
removed = this.remove(i, count);
|
||||
this._tail = (this._tail - leng + len) & this._capacityMask;
|
||||
}
|
||||
while (arguments_index < arg_len) {
|
||||
this.push(arguments[arguments_index++]);
|
||||
}
|
||||
for (k = 0; k < leng; k++) {
|
||||
this.push(temp[k]);
|
||||
}
|
||||
}
|
||||
return removed;
|
||||
} else {
|
||||
return this.remove(i, count);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Soft clear - does not reset capacity.
|
||||
*/
|
||||
Denque.prototype.clear = function clear() {
|
||||
this._head = 0;
|
||||
this._tail = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns true or false whether the list is empty.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
Denque.prototype.isEmpty = function isEmpty() {
|
||||
return this._head === this._tail;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns an array of all queue items.
|
||||
* @returns {Array}
|
||||
*/
|
||||
Denque.prototype.toArray = function toArray() {
|
||||
return this._copyArray(false);
|
||||
};
|
||||
|
||||
/**
|
||||
* -------------
|
||||
* INTERNALS
|
||||
* -------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Fills the queue with items from an array
|
||||
* For use in the constructor
|
||||
* @param array
|
||||
* @private
|
||||
*/
|
||||
Denque.prototype._fromArray = function _fromArray(array) {
|
||||
for (var i = 0; i < array.length; i++) this.push(array[i]);
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param fullCopy
|
||||
* @returns {Array}
|
||||
* @private
|
||||
*/
|
||||
Denque.prototype._copyArray = function _copyArray(fullCopy) {
|
||||
var newArray = [];
|
||||
var list = this._list;
|
||||
var len = list.length;
|
||||
var i;
|
||||
if (fullCopy || this._head > this._tail) {
|
||||
for (i = this._head; i < len; i++) newArray.push(list[i]);
|
||||
for (i = 0; i < this._tail; i++) newArray.push(list[i]);
|
||||
} else {
|
||||
for (i = this._head; i < this._tail; i++) newArray.push(list[i]);
|
||||
}
|
||||
return newArray;
|
||||
};
|
||||
|
||||
/**
|
||||
* Grows the internal list array.
|
||||
* @private
|
||||
*/
|
||||
Denque.prototype._growArray = function _growArray() {
|
||||
if (this._head) {
|
||||
// copy existing data, head to end, then beginning to tail.
|
||||
this._list = this._copyArray(true);
|
||||
this._head = 0;
|
||||
}
|
||||
|
||||
// head is at 0 and array is now full, safe to extend
|
||||
this._tail = this._list.length;
|
||||
|
||||
this._list.length *= 2;
|
||||
this._capacityMask = (this._capacityMask << 1) | 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* Shrinks the internal list array.
|
||||
* @private
|
||||
*/
|
||||
Denque.prototype._shrinkArray = function _shrinkArray() {
|
||||
this._list.length >>>= 1;
|
||||
this._capacityMask >>>= 1;
|
||||
};
|
||||
|
||||
|
||||
module.exports = Denque;
|
84
node_modules/denque/package.json
generated
vendored
Normal file
84
node_modules/denque/package.json
generated
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
{
|
||||
"_from": "denque@^1.4.1",
|
||||
"_id": "denque@1.5.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==",
|
||||
"_location": "/denque",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "denque@^1.4.1",
|
||||
"name": "denque",
|
||||
"escapedName": "denque",
|
||||
"rawSpec": "^1.4.1",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^1.4.1"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/mysql2"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
|
||||
"_shasum": "773de0686ff2d8ec2ff92914316a47b73b1c73de",
|
||||
"_spec": "denque@^1.4.1",
|
||||
"_where": "/home/tobias/IdeaProjects/Woam-Antispam-Bot/node_modules/mysql2",
|
||||
"author": {
|
||||
"name": "Invertase",
|
||||
"email": "oss@invertase.io",
|
||||
"url": "http://github.com/invertase/"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/invertase/denque/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Mike Diarmid",
|
||||
"email": "mike@invertase.io",
|
||||
"url": "Salakar"
|
||||
}
|
||||
],
|
||||
"deprecated": false,
|
||||
"description": "The fastest javascript implementation of a double-ended queue. Maintains compatability with deque.",
|
||||
"devDependencies": {
|
||||
"benchmark": "^2.1.4",
|
||||
"coveralls": "^2.13.3",
|
||||
"double-ended-queue": "^2.1.0-0",
|
||||
"istanbul": "^0.4.5",
|
||||
"mocha": "^3.5.3",
|
||||
"typescript": "^3.4.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
},
|
||||
"homepage": "https://github.com/invertase/denque#readme",
|
||||
"keywords": [
|
||||
"data-structure",
|
||||
"data-structures",
|
||||
"queue",
|
||||
"double",
|
||||
"end",
|
||||
"ended",
|
||||
"deque",
|
||||
"denque",
|
||||
"double-ended-queue"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"main": "index.js",
|
||||
"name": "denque",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/invertase/denque.git"
|
||||
},
|
||||
"scripts": {
|
||||
"benchmark_2mil": "node benchmark/two_million",
|
||||
"benchmark_remove": "node benchmark/remove",
|
||||
"benchmark_removeOne": "node benchmark/removeOne",
|
||||
"benchmark_splice": "node benchmark/splice",
|
||||
"benchmark_thousand": "node benchmark/thousand",
|
||||
"coveralls": "cat ./coverage/lcov.info | coveralls",
|
||||
"test": "istanbul cover --report lcov _mocha && npm run typescript",
|
||||
"typescript": "tsc --project ./test/type/tsconfig.json"
|
||||
},
|
||||
"version": "1.5.0"
|
||||
}
|
Reference in New Issue
Block a user