UNPKG

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)

225 lines (224 loc) 18.4 kB
'use strict'; 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; } }; /** * Implements a queue structure * @template T Queue values type */ export { Queue as default }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIHF1ZXVlIHN0cnVjdHVyZVxuICogQHRlbXBsYXRlIFQgUXVldWUgdmFsdWVzIHR5cGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVldWU8VD4ge1xuICBcbiAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0YXJ0OiBhbnk7XG4gIHByaXZhdGUgX2VuZDogYW55O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcXVldWUgZnJvbSBhcnJheVxuICAgKiBAcGFyYW0ge0FycmF5PFY+fSBhcnJheSBBcnJheSB0byBjcmVhdGUgdGhlIHF1ZXVlIGZyb21cbiAgICogQHJldHVybiB7UXVldWU8Vj59IFF1ZXVlIGNyZWF0ZWQgZnJvbSB0aGUgYXJyYXlcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnN0cnVjdG9yIGluc3RlYWRcbiAgICovXG4gIHN0YXRpYyBmcm9tQXJyYXk8Vj4oYXJyYXk6IFZbXSkge1xuICAgIGxldCBxdWV1ZSA9IG5ldyBRdWV1ZTxWPigpO1xuICAgIGFycmF5LmZvckVhY2goaXRlbSA9PiBxdWV1ZS5wdXNoKGl0ZW0pKTtcbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBbaXRlbXNdIEluaXRpYWwgaXRlbXMgdG8gYWRkIHRvIHRoZSBxdWV1ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoaXRlbXM/OiBJdGVyYWJsZTxUPikge1xuICAgIGZvciAobGV0IGl0ZW0gb2YgaXRlbXMgfHwgW10pIHtcbiAgICAgIHRoaXMucHVzaChpdGVtKTtcbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBxdWV1ZSBzaXplXG4gICAqIEByZXR1cm4ge051bWJlcn0gUXVldWUgc2l6ZVxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIGJ5IHF1ZXVlIGl0ZW1zXG4gICAqL1xuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fc3RhcnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIHlpZWxkIGN1cnJlbnQudmFsdWU7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9yIHVuZGVmaW5lZCBpZiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICogQHJldHVybiB7VH0gVGhlIGZpcnN0IHZhbHVlXG4gICAqL1xuICBmcm9udCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnQ/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvciB1bmRlZmluZWQgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqIEByZXR1cm4ge1R9IFRoZSBsYXN0IHZhbHVlXG4gICAqL1xuICBiYWNrKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbmQ/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyBuZXcgZWxlbWVudHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHtUW119IHZhbHVlcyBWYWx1ZXMgdG8gcHVzaFxuICAgKi9cbiAgcHVzaCguLi52YWx1ZXM6IFRbXSkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHRoaXMuX2VuZCkge1xuICAgICAgICB0aGlzLl9lbmQubmV4dCA9IHt2YWx1ZSwgcHJldjogdGhpcy5fZW5kfTtcbiAgICAgICAgdGhpcy5fZW5kID0gdGhpcy5fZW5kLm5leHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZCA9IHt2YWx1ZX07XG4gICAgICB9XG4gICAgICB0aGlzLl9sZW5ndGgrKztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIHF1ZXVlXG4gICAqIEByZXR1cm4ge1R9IFRoZSB2YWx1ZSByZW1vdmVkIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcG9wKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9lbmQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9lbmQ7XG4gICAgICB0aGlzLl9yZW1vdmUodGhpcy5fZW5kKTtcbiAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgbmV3IGVsZW1lbnRzIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHtUfSB2YWx1ZSBWYWx1ZXMgdG8gdW5zaGlmdFxuICAgKi9cbiAgdW5zaGlmdCh2YWx1ZTogVCkge1xuICAgIGlmICh0aGlzLl9zdGFydCkge1xuICAgICAgdGhpcy5fc3RhcnQgPSB7dmFsdWUsIG5leHQ6IHRoaXMuX3N0YXJ0fTtcbiAgICAgIHRoaXMuX3N0YXJ0Lm5leHQucHJldiA9IHRoaXMuX3N0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZCA9IHt2YWx1ZX07XG4gICAgfVxuICAgIHRoaXMuX2xlbmd0aCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgcXVldWVcbiAgICogQHJldHVybiB7VH0gVGhlIHZhbHVlIHJlbW92ZWQgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBzaGlmdCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fc3RhcnQpIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9zdGFydDtcbiAgICAgIHRoaXMuX3JlbW92ZSh0aGlzLl9zdGFydCk7XG4gICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IGluIHRoZSBxdWV1ZSBieSB0aGUgcHJlZGljYXRlXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkaWNhdGUgUHJlZGljYXRlIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtUfSBFbGVtZW50IHZhbHVlIGZvdW5kIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZChwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fc3RhcnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0geyh2YWx1ZTogVCwgaW5kZXg6IE51bWJlcikgPT4gYW55fSBjYWxsYWJsZSBJdGVyYXRvciBjYWxsYWJsZVxuICAgKi9cbiAgZm9yRWFjaChjYWxsYWJsZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBhbnkpIHtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuX3N0YXJ0O1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGNhbGxhYmxlKGN1cnJlbnQudmFsdWUsIGluZGV4KyspO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBlbGVtZW50cyBpdGVyYXRpbmcgdGhlbSBhbmQgbWF0Y2hpbmcgYnkgcHJlZGljYXRlXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufG51bGx9IHByZWRpY2F0ZSBSZXR1cm5zIHRydWUgZm9yIHZhbHVlcyB0byByZW1vdmUuIElmIHJldHVybnMgbnVsbCwgaXRlcmF0aW9uIHN0b3BzXG4gICAqL1xuICByZW1vdmUocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9zdGFydDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgbGV0IHJlbW92ZSA9IHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKTtcbiAgICAgIGlmIChyZW1vdmUgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZShjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBlbGVtZW50IG1hdGNoZWQgYnkgcHJlZGljYXRlXG4gICAqIEBwYXJhbSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciB2YWx1ZSB0byByZW1vdmVkXG4gICAqL1xuICByZW1vdmVPbmUocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pIHtcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlKGl0ZW0gPT4ge1xuICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHF1ZXVlIGZyb20gdGhpcyBvbmUgaW4gcmV2ZXJzZWQgb3JkZXJcbiAgICogQHJldHVybiB7UXVldWU8VD59IFJldmVyc2VkIHF1ZXVlXG4gICAqL1xuICByZXZlcnNlZCgpOiBRdWV1ZTxUPiB7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBRdWV1ZTxUPigpO1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5fZW5kO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXY7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhcnJheSBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcmV0dXJuIHtBcnJheTxUPn0gQXJyYXkgY3JlYXRlZFxuICAgKi9cbiAgdG9BcnJheSgpOiBUW10ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICB0aGlzLmZvckVhY2godmFsdWUgPT4gcmVzdWx0LnB1c2godmFsdWUpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcXVldWVcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9zdGFydDtcbiAgICBkZWxldGUgdGhpcy5fZW5kO1xuICAgIHRoaXMuX2xlbmd0aCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmUobm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIHtcbiAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydCA9IG5vZGUubmV4dDtcbiAgICB9XG4gICAgaWYgKG5vZGUubmV4dCkge1xuICAgICAgbm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VuZCA9IG5vZGUucHJldjtcbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoLS07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTeW1ib2wiLCJpdGVyYXRvciIsIlF1ZXVlIiwiZnJvbUFycmF5IiwiYXJyYXkiLCJxdWV1ZSIsImZvckVhY2giLCJpdGVtIiwicHVzaCIsImxlbmd0aCIsIl9sZW5ndGgiLCJjdXJyZW50IiwiX3N0YXJ0IiwidmFsdWUiLCJuZXh0IiwiZnJvbnQiLCJiYWNrIiwiX2VuZCIsInZhbHVlcyIsInByZXYiLCJwb3AiLCJyZXN1bHQiLCJfcmVtb3ZlIiwidW5zaGlmdCIsInNoaWZ0IiwiZmluZCIsInByZWRpY2F0ZSIsImNhbGxhYmxlIiwiaW5kZXgiLCJyZW1vdmUiLCJyZW1vdmVPbmUiLCJyZW1vdmVkIiwicmV2ZXJzZWQiLCJ0b0FycmF5IiwiY2xlYXIiLCJub2RlIiwiY29uc3RydWN0b3IiLCJpdGVtcyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0lBOENJQSxtQkFBQUEsT0FBT0MsUUFBUTtBQXhDSixJQUFBLEFBQU1DLFFBQU4sTUFBTUE7SUFNbkI7Ozs7O0dBS0MsR0FDRCxPQUFPQyxVQUFhQyxLQUFVLEVBQUU7UUFDOUIsSUFBSUMsUUFBUSxJQUFJSDtRQUNoQkUsTUFBTUUsT0FBTyxDQUFDQyxDQUFBQSxPQUFRRixNQUFNRyxJQUFJLENBQUNEO1FBQ2pDLE9BQU9GO0lBQ1Q7SUFhQTs7O0dBR0MsR0FDRCxJQUFJSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUNDLE9BQU87SUFDckI7SUFFQTs7R0FFQyxHQUNELENBQUMsQ0FBQ1YsaUJBQWdCLEdBQWdCO1FBQ2hDLElBQUlXLFVBQVUsSUFBSSxDQUFDQyxNQUFNO1FBQ3pCLE1BQU9ELFFBQVM7WUFDZCxNQUFNQSxRQUFRRSxLQUFLO1lBQ25CRixVQUFVQSxRQUFRRyxJQUFJO1FBQ3hCO0lBQ0Y7SUFFQTs7O0dBR0MsR0FDREMsUUFBdUI7WUFDZDtRQUFQLFFBQU8sZUFBQSxJQUFJLENBQUNILE1BQU0sY0FBWCxtQ0FBQSxhQUFhQyxLQUFLO0lBQzNCO0lBRUE7OztHQUdDLEdBQ0RHLE9B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