metaapi.cloud-sdk
Version:
SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)
230 lines (229 loc) • 18.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return Queue;
}
});
function _define_property(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
let _Symbol_iterator = Symbol.iterator;
let Queue = class Queue {
/**
* Creates a queue from array
* @param {Array<V>} array Array to create the queue from
* @return {Queue<V>} Queue created from the array
* @deprecated Use constructor instead
*/ static fromArray(array) {
let queue = new Queue();
array.forEach((item)=>queue.push(item));
return queue;
}
/**
* Returns the queue size
* @return {Number} Queue size
*/ get length() {
return this._length;
}
/**
* Iterates by queue items
*/ *[_Symbol_iterator]() {
let current = this._start;
while(current){
yield current.value;
current = current.next;
}
}
/**
* Returns the first element or undefined if the queue is empty
* @return {T} The first value
*/ front() {
var _this__start;
return (_this__start = this._start) === null || _this__start === void 0 ? void 0 : _this__start.value;
}
/**
* Returns the last element or undefined if the queue is empty
* @return {T} The last value
*/ back() {
var _this__end;
return (_this__end = this._end) === null || _this__end === void 0 ? void 0 : _this__end.value;
}
/**
* Pushes new elements to the end of the queue
* @param {T[]} values Values to push
*/ push(...values) {
for (let value of values){
if (this._end) {
this._end.next = {
value,
prev: this._end
};
this._end = this._end.next;
} else {
this._start = this._end = {
value
};
}
this._length++;
}
}
/**
* Removes the last element from the queue
* @return {T} The value removed or undefined
*/ pop() {
if (this._end) {
let result = this._end;
this._remove(this._end);
return result.value;
}
}
/**
* Inserts new elements to the front of the queue
* @param {T} value Values to unshift
*/ unshift(value) {
if (this._start) {
this._start = {
value,
next: this._start
};
this._start.next.prev = this._start;
} else {
this._start = this._end = {
value
};
}
this._length++;
}
/**
* Removes the first element from the queue
* @return {T} The value removed or undefined
*/ shift() {
if (this._start) {
let result = this._start;
this._remove(this._start);
return result.value;
}
}
/**
* Finds an element in the queue by the predicate
* @param {(value: T) => boolean} predicate Predicate to use
* @return {T} Element value found or undefined
*/ find(predicate) {
let current = this._start;
while(current){
if (predicate(current.value)) {
return current.value;
}
current = current.next;
}
}
/**
* Iterates over the queue
* @param {(value: T, index: Number) => any} callable Iterator callable
*/ forEach(callable) {
let current = this._start;
let index = 0;
while(current){
callable(current.value, index++);
current = current.next;
}
}
/**
* Removes elements iterating them and matching by predicate
* @param {(value: T) => boolean|null} predicate Returns true for values to remove. If returns null, iteration stops
*/ remove(predicate) {
let current = this._start;
while(current){
let remove = predicate(current.value);
if (remove === null) {
break;
}
if (remove === true) {
this._remove(current);
}
current = current.next;
}
}
/**
* Removes the first occurence of element matched by predicate
* @param predicate returns true for value to removed
*/ removeOne(predicate) {
let removed = false;
this.remove((item)=>{
if (removed) {
return null;
}
if (predicate(item)) {
removed = true;
return true;
}
});
}
/**
* Creates a new queue from this one in reversed order
* @return {Queue<T>} Reversed queue
*/ reversed() {
let result = new Queue();
let current = this._end;
while(current){
result.push(current.value);
current = current.prev;
}
return result;
}
/**
* Creates an array from the queue
* @return {Array<T>} Array created
*/ toArray() {
let result = [];
this.forEach((value)=>result.push(value));
return result;
}
/**
* Clears the queue
*/ clear() {
delete this._start;
delete this._end;
this._length = 0;
}
_remove(node) {
if (node.prev) {
node.prev.next = node.next;
} else {
this._start = node.next;
}
if (node.next) {
node.next.prev = node.prev;
} else {
this._end = node.prev;
}
this._length--;
}
/**
* Constructs instance
* @param {Iterable<T>} [items] Initial items to add to the queue
*/ constructor(items){
_define_property(this, "_length", void 0);
_define_property(this, "_start", void 0);
_define_property(this, "_end", void 0);
for (let item of items || []){
this.push(item);
}
this._length = 0;
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIHF1ZXVlIHN0cnVjdHVyZVxuICogQHRlbXBsYXRlIFQgUXVldWUgdmFsdWVzIHR5cGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVldWU8VD4ge1xuICBcbiAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0YXJ0OiBhbnk7XG4gIHByaXZhdGUgX2VuZDogYW55O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcXVldWUgZnJvbSBhcnJheVxuICAgKiBAcGFyYW0ge0FycmF5PFY+fSBhcnJheSBBcnJheSB0byBjcmVhdGUgdGhlIHF1ZXVlIGZyb21cbiAgICogQHJldHVybiB7UXVldWU8Vj59IFF1ZXVlIGNyZWF0ZWQgZnJvbSB0aGUgYXJyYXlcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnN0cnVjdG9yIGluc3RlYWRcbiAgICovXG4gIHN0YXRpYyBmcm9tQXJyYXk8Vj4oYXJyYXk6IFZbXSkge1xuICAgIGxldCBxdWV1ZSA9IG5ldyBRdWV1ZTxWPigpO1xuICAgIGFycmF5LmZvckVhY2goaXRlbSA9PiBxdWV1ZS5wdXNoKGl0ZW0pKTtcbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBbaXRlbXNdIEluaXRpYWwgaXRlbXMgdG8gYWRkIHRvIHRoZSBxdWV1ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoaXRlbXM/OiBJdGVyYWJsZTxUPikge1xuICAgIGZvciAobGV0IGl0ZW0gb2YgaXRlbXMgfHwgW10pIHtcbiAgICAgIHRoaXMucHVzaChpdGVtKTtcbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBxdWV1ZSBzaXplXG4gICAqIEByZXR1cm4ge051bWJlcn0gUXVldWUgc2l6ZVxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIGJ5IHF1ZXVlIGl0ZW1zXG4gICAqL1xuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fc3RhcnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIHlpZWxkIGN1cnJlbnQudmFsdWU7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9yIHVuZGVmaW5lZCBpZiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICogQHJldHVybiB7VH0gVGhlIGZpcnN0IHZhbHVlXG4gICAqL1xuICBmcm9udCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnQ/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvciB1bmRlZmluZWQgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqIEByZXR1cm4ge1R9IFRoZSBsYXN0IHZhbHVlXG4gICAqL1xuICBiYWNrKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbmQ/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBuZXcgZWxlbWVudHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHtUW119IHZhbHVlcyBWYWx1ZXMgdG8gcHVzaFxuICAgKi9cbiAgcHVzaCguLi52YWx1ZXM6IFRbXSkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHRoaXMuX2VuZCkge1xuICAgICAgICB0aGlzLl9lbmQubmV4dCA9IHt2YWx1ZSwgcHJldjogdGhpcy5fZW5kfTtcbiAgICAgICAgdGhpcy5fZW5kID0gdGhpcy5fZW5kLm5leHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZCA9IHt2YWx1ZX07XG4gICAgICB9XG4gICAgICB0aGlzLl9sZW5ndGgrKztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIHF1ZXVlXG4gICAqIEByZXR1cm4ge1R9IFRoZSB2YWx1ZSByZW1vdmVkIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcG9wKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9lbmQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9lbmQ7XG4gICAgICB0aGlzLl9yZW1vdmUodGhpcy5fZW5kKTtcbiAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgbmV3IGVsZW1lbnRzIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHtUfSB2YWx1ZSBWYWx1ZXMgdG8gdW5zaGlmdFxuICAgKi9cbiAgdW5zaGlmdCh2YWx1ZTogVCkge1xuICAgIGlmICh0aGlzLl9zdGFydCkge1xuICAgICAgdGhpcy5fc3RhcnQgPSB7dmFsdWUsIG5leHQ6IHRoaXMuX3N0YXJ0fTtcbiAgICAgIHRoaXMuX3N0YXJ0Lm5leHQucHJldiA9IHRoaXMuX3N0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZCA9IHt2YWx1ZX07XG4gICAgfVxuICAgIHRoaXMuX2xlbmd0aCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgcXVldWVcbiAgICogQHJldHVybiB7VH0gVGhlIHZhbHVlIHJlbW92ZWQgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBzaGlmdCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fc3RhcnQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9zdGFydDtcbiAgICAgIHRoaXMuX3JlbW92ZSh0aGlzLl9zdGFydCk7XG4gICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IGluIHRoZSBxdWV1ZSBieSB0aGUgcHJlZGljYXRlXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkaWNhdGUgUHJlZGljYXRlIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtUfSBFbGVtZW50IHZhbHVlIGZvdW5kIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fc3RhcnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0geyh2YWx1ZTogVCwgaW5kZXg6IE51bWJlcikgPT4gYW55fSBjYWxsYWJsZSBJdGVyYXRvciBjYWxsYWJsZVxuICAgKi9cbiAgZm9yRWFjaChjYWxsYWJsZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBhbnkpIHtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuX3N0YXJ0O1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGNhbGxhYmxlKGN1cnJlbnQudmFsdWUsIGluZGV4KyspO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBlbGVtZW50cyBpdGVyYXRpbmcgdGhlbSBhbmQgbWF0Y2hpbmcgYnkgcHJlZGljYXRlXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufG51bGx9IHByZWRpY2F0ZSBSZXR1cm5zIHRydWUgZm9yIHZhbHVlcyB0byByZW1vdmUuIElmIHJldHVybnMgbnVsbCwgaXRlcmF0aW9uIHN0b3BzXG4gICAqL1xuICByZW1vdmUocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9zdGFydDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgbGV0IHJlbW92ZSA9IHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKTtcbiAgICAgIGlmIChyZW1vdmUgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZShjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBlbGVtZW50IG1hdGNoZWQgYnkgcHJlZGljYXRlXG4gICAqIEBwYXJhbSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciB2YWx1ZSB0byByZW1vdmVkXG4gICAqL1xuICByZW1vdmVPbmUocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pIHtcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlKGl0ZW0gPT4ge1xuICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHF1ZXVlIGZyb20gdGhpcyBvbmUgaW4gcmV2ZXJzZWQgb3JkZXJcbiAgICogQHJldHVybiB7UXVldWU8VD59IFJldmVyc2VkIHF1ZXVlXG4gICAqL1xuICByZXZlcnNlZCgpOiBRdWV1ZTxUPiB7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBRdWV1ZTxUPigpO1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fZW5kO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXY7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhcnJheSBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcmV0dXJuIHtBcnJheTxUPn0gQXJyYXkgY3JlYXRlZFxuICAgKi9cbiAgdG9BcnJheSgpOiBUW10ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICB0aGlzLmZvckVhY2godmFsdWUgPT4gcmVzdWx0LnB1c2godmFsdWUpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcXVldWVcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9zdGFydDtcbiAgICBkZWxldGUgdGhpcy5fZW5kO1xuICAgIHRoaXMuX2xlbmd0aCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmUobm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIHtcbiAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydCA9IG5vZGUubmV4dDtcbiAgICB9XG4gICAgaWYgKG5vZGUubmV4dCkge1xuICAgICAgbm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VuZCA9IG5vZGUucHJldjtcbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoLS07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJRdWV1ZSIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiZnJvbUFycmF5IiwiYXJyYXkiLCJxdWV1ZSIsImZvckVhY2giLCJpdGVtIiwicHVzaCIsImxlbmd0aCIsIl9sZW5ndGgiLCJjdXJyZW50IiwiX3N0YXJ0IiwidmFsdWUiLCJuZXh0IiwiZnJvbnQiLCJiYWNrIiwiX2VuZCIsInZhbHVlcyIsInByZXYiLCJwb3AiLCJyZXN1bHQiLCJfcmVtb3ZlIiwidW5zaGlmdCIsInNoaWZ0IiwiZmluZCIsInByZWRpY2F0ZSIsImNhbGxhYmxlIiwiaW5kZXgiLCJyZW1vdmUiLCJyZW1vdmVPbmUiLCJyZW1vdmVkIiwicmV2ZXJzZWQiLCJ0b0FycmF5IiwiY2xlYXIiLCJub2RlIiwiY29uc3RydWN0b3IiLCJpdGVtcyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7ZUFNcUJBOzs7Ozs7Ozs7Ozs7Ozs7O0lBd0NqQkMsbUJBQUFBLE9BQU9DLFFBQVE7QUF4Q0osSUFBQSxBQUFNRixRQUFOLE1BQU1BO0lBTW5COzs7OztHQUtDLEdBQ0QsT0FBT0csVUFBYUMsS0FBVSxFQUFFO1FBQzlCLElBQUlDLFFBQVEsSUFBSUw7UUFDaEJJLE1BQU1FLE9BQU8sQ0FBQ0MsQ0FBQUEsT0FBUUYsTUFBTUcsSUFBSSxDQUFDRDtRQUNqQyxPQUFPRjtJQUNUO0lBYUE7OztHQUdDLEdBQ0QsSUFBSUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDQyxPQUFPO0lBQ3JCO0lBRUE7O0dBRUMsR0FDRCxDQUFDLENBQUNULGlCQUFnQixHQUFnQjtRQUNoQyxJQUFJVSxVQUFVLElBQUksQ0FBQ0MsTUFBTTtRQUN6QixNQUFPRCxRQUFTO1lBQ2QsTUFBTUEsUUFBUUUsS0FBSztZQUNuQkYsVUFBVUEsUUFBUUcsSUFBSTtRQUN4QjtJQUNGO0lBRUE7OztHQUdDLEdBQ0RDLFFBQXVCO1lBQ2Q7UUFBUCxRQUFPLGVBQUEsSUFBSSxDQUFDSCxNQUFNLGNBQVgsbUNBQUEsYUFBYUMsS0FBSztJQUMzQjtJQUVB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