UNPKG

hjs-future

Version:

Future classes of Hubrijs framework

677 lines (611 loc) 24.9 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.LinkedBlockingQueue = exports.LinkedBlockingQueueIterator = exports.BlockingQueue = undefined; var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _events = require('events'); var _events2 = _interopRequireDefault(_events); var _util = require('hjs-core/lib/util'); var util = _interopRequireWildcard(_util); var _time = require('hjs-core/lib/time'); var _iterator3 = require('hjs-collection/lib/iterator'); var _list = require('hjs-collection/lib/list'); var _queue = require('hjs-collection/lib/queue'); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** @babel */ var BlockingQueue = exports.BlockingQueue = function (_AbstractQueue) { (0, _inherits3.default)(BlockingQueue, _AbstractQueue); function BlockingQueue() { (0, _classCallCheck3.default)(this, BlockingQueue); var _this = (0, _possibleConstructorReturn3.default)(this, (BlockingQueue.__proto__ || (0, _getPrototypeOf2.default)(BlockingQueue)).call(this)); _this.mEventEmitter = new _events2.default(); return _this; } (0, _createClass3.default)(BlockingQueue, [{ key: 'isAvailable', value: function isAvailable() { return !this.isEmpty(); } }, { key: 'isEmpty', value: function isEmpty() { return true; } }, { key: 'offer', value: function offer(e) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$timeout = _ref.timeout, timeout = _ref$timeout === undefined ? 0 : _ref$timeout, _ref$unit = _ref.unit, unit = _ref$unit === undefined ? _time.MILLISECONDS : _ref$unit, _ref$callback = _ref.callback, callback = _ref$callback === undefined ? null : _ref$callback; return false; } }, { key: 'poll', value: function poll() { var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$timeout = _ref2.timeout, timeout = _ref2$timeout === undefined ? 0 : _ref2$timeout, _ref2$unit = _ref2.unit, unit = _ref2$unit === undefined ? _time.MILLISECONDS : _ref2$unit, _ref2$listener = _ref2.listener, listener = _ref2$listener === undefined ? null : _ref2$listener; return null; } }, { key: 'put', value: function put(e) { var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; } }, { key: 'remainingCapacity', value: function remainingCapacity() { return 0; } }, { key: 'take', value: function take() { var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; return null; } }]); return BlockingQueue; }(_queue.AbstractQueue); var LinkedBlockingQueueIterator = exports.LinkedBlockingQueueIterator = function (_Iterator) { (0, _inherits3.default)(LinkedBlockingQueueIterator, _Iterator); function LinkedBlockingQueueIterator() { var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; (0, _classCallCheck3.default)(this, LinkedBlockingQueueIterator); var _this2 = (0, _possibleConstructorReturn3.default)(this, (LinkedBlockingQueueIterator.__proto__ || (0, _getPrototypeOf2.default)(LinkedBlockingQueueIterator)).call(this, list)); _this2.mLastRet = null; _this2.mCurrentElement = null; _this2.mCurrent = _this2.list.mHead.next; if (_this2.mCurrent) { _this2.mCurrentElement = _this2.mCurrent.item; } return _this2; } (0, _createClass3.default)(LinkedBlockingQueueIterator, [{ key: 'hasNext', value: function hasNext() { return this.mCurrent !== null || this.mCurrent !== undefined; } }, { key: 'next', value: function next() { if (!this.mCurrent) { throw new RangeError("NoSuchElementException"); } var x = null; this.mLastRet = this.mCurrent; for (var p = this.mCurrent, item, q;; p = q) { if ((q = p.next) === p) { q = this.list.mHead.next; } if (!q || (item = q.item) !== null) { this.mCurrent = q; x = this.mCurrentElement; this.mCurrentElement = item; return x; } } return null; } }, { key: 'remove', value: function remove() { if (!this.mLastRet) { throw new RangeError("NoSuchElementException"); } this.mLastRet = null; var node = this.mLastRet; for (var trail = this.list.mHead, p = trail.next; p !== null; trail = p, p = p.next) { if (p === node) { this.list.unlink(p, trail); break; } } } }]); return LinkedBlockingQueueIterator; }(_iterator3.Iterator); var NO_ID = -1; var LinkedBlockingQueue = exports.LinkedBlockingQueue = function (_BlockingQueue) { (0, _inherits3.default)(LinkedBlockingQueue, _BlockingQueue); function LinkedBlockingQueue() { var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref3$capacity = _ref3.capacity, capacity = _ref3$capacity === undefined ? Number.MAX_VALUE : _ref3$capacity, _ref3$data = _ref3.data, data = _ref3$data === undefined ? [] : _ref3$data; (0, _classCallCheck3.default)(this, LinkedBlockingQueue); var _this3 = (0, _possibleConstructorReturn3.default)(this, (LinkedBlockingQueue.__proto__ || (0, _getPrototypeOf2.default)(LinkedBlockingQueue)).call(this)); _this3.mCount = 0; _this3.mLast = _this3.mHead = new _list.LinkedNode(); if (data.length > 0) { _this3.mCapacity = data.length; var n = 0; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(data), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var v = _step.value; if (!util.isDefined(v)) { throw new ReferenceError("NullPointerException"); } if (n === _this3.mCapacity) { throw new RangeError("IllegalStateException Queue full"); } _this3.enqueue(new _list.LinkedNode({ item: v })); ++n; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } _this3.mCount = n; } else { if (capacity < 0) { throw new RangeError("IllegalArgumentException"); } else { _this3.mCapacity = capacity; } } return _this3; } (0, _createClass3.default)(LinkedBlockingQueue, [{ key: 'add', value: function add(e) { var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var success = this.offer(e, { callback: callback }); if (!success) { throw new RangeError("IllegalStateException Queue full"); } return success; } }, { key: 'addAll', value: function addAll() { var collection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; if (!util.isDefined(collection)) { throw new ReferenceError("NullPointerException"); } var modified = false; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = (0, _getIterator3.default)(collection), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var v = _step2.value; if (this.add(v, callback)) { modified = true; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return modified; } }, { key: 'clear', value: function clear() { this.stopListeners(0x16); for (var p, h = this.mHead; p = h.next; h.next = h) { p.item = null; } this.mHead = this.mLast; this.mCount = 0; } }, { key: 'contains', value: function contains(o) { if (!util.isDefined(o)) { return false; } for (var p = this.mHead.next; p; p = p.next) { if (o === p.item) { return true; } } return false; } }, { key: 'drainTo', value: function drainTo(c) { var maxElements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; if (!util.isDefined(c)) { throw new ReferenceError("NullPointerException"); } if (!Array.isArray(c) || maxElements <= 0) { return 0; } var p = null; var n = Math.min(maxElements, this.mCount); var h = this.mHead; var i = 0; while (i < n) { p = h.next; c.push(p.item); p.item = null; h.next = h; h = p; ++i; } if (i > 0) { this.mHead = h; this.mCount = this.mCount - i; } return n; } }, { key: 'dequeue', value: function dequeue() { var h = this.mHead; var first = h.next; if (first) { h.next = h; this.mHead = first; var x = first.item; first.item = null; return x; } return first; } }, { key: 'element', value: function element() { var x = this.peek(); if (!util.isDefined(x)) { throw new ReferenceError("NoSuchElementException"); } return x; } }, { key: 'enqueue', value: function enqueue(node) { this.mLast = this.mLast.next = node; } }, { key: 'isAvailable', value: function isAvailable() { return this.mCount <= this.mCapacity; } }, { key: 'isEmpty', value: function isEmpty() { return this.mCount === 0; } }, { key: 'iterator', value: function iterator() { return new LinkedBlockingQueueIterator(this); } }, { key: 'offer', value: function offer(e) { var _this4 = this; var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref4$timeout = _ref4.timeout, timeout = _ref4$timeout === undefined ? 0 : _ref4$timeout, _ref4$unit = _ref4.unit, unit = _ref4$unit === undefined ? _time.MILLISECONDS : _ref4$unit, _ref4$callback = _ref4.callback, callback = _ref4$callback === undefined ? null : _ref4$callback; if (!util.isDefined(e)) { throw new ReferenceError("NullPointerException"); } var node = new _list.LinkedNode({ item: e }); if (this.isAvailable()) { return this.offerNode({ node: node, callback: callback }); } var waitId = NO_ID; var millis = !timeout ? 0 : unit.toMillis(timeout); var wait = function wait() { var future = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; if (_this4.offerNode({ node: node, time: time, millis: millis, callback: callback })) { _this4.stopListeners(0x4, wait); } clearTimeout(waitId); waitId = NO_ID; }; this.startListeners(0x4, wait); var err = function err(e) { _this4.stopListeners(0x4, wait); _this4.stopListeners(0x2, err); }; this.startListeners(0x2, err); if (timeout) { var time = Date.now(); waitId = setTimeout(function (time) { wait(null, time); }, millis, time); } return false; } }, { key: 'offerNode', value: function offerNode() { var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, node = _ref5.node, _ref5$time = _ref5.time, time = _ref5$time === undefined ? 0 : _ref5$time, _ref5$millis = _ref5.millis, millis = _ref5$millis === undefined ? 0 : _ref5$millis, _ref5$callback = _ref5.callback, callback = _ref5$callback === undefined ? null : _ref5$callback; var now = Date.now(); var ellapsed = now - time; var expired = ellapsed !== now && ellapsed > millis; var available = false; var item = null; if (expired) { item = new RangeError("TimeoutException"); callback(item); this.mEventEmitter.emit(LinkedBlockingQueue.EXCEPTION, item); } else { available = this.isAvailable(); if (available) { this.mCount++; this.enqueue(node); item = node.item; callback(item); this.mEventEmitter.emit(LinkedBlockingQueue.OFFER, item); } } return available; } }, { key: 'peek', value: function peek() { return !this.isEmpty() ? this.mHead.next.item : null; } }, { key: 'poll', value: function poll() { var _this5 = this; var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref6$timeout = _ref6.timeout, timeout = _ref6$timeout === undefined ? 0 : _ref6$timeout, _ref6$unit = _ref6.unit, unit = _ref6$unit === undefined ? _time.MILLISECONDS : _ref6$unit, _ref6$callback = _ref6.callback, callback = _ref6$callback === undefined ? null : _ref6$callback; if (!this.isEmpty()) { return this.pollNode({ callback: callback }); } var waitId = NO_ID; var millis = !timeout ? 0 : unit.toMillis(timeout); var wait = function wait() { var future = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; if (_this5.pollNode({ time: time, millis: millis, callback: callback })) { _this5.stopListeners(0x8, wait); } clearTimeout(waitId); waitId = NO_ID; }; this.startListeners(0x8, wait); var err = function err(e) { _this5.stopListeners(0x8, wait); _this5.stopListeners(0x2, err); }; this.startListeners(0x2, err); if (timeout) { var time = Date.now(); waitId = setTimeout(function (time) { wait(null, time); }, millis, time); } return null; } }, { key: 'pollNode', value: function pollNode() { var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref7$time = _ref7.time, time = _ref7$time === undefined ? 0 : _ref7$time, _ref7$millis = _ref7.millis, millis = _ref7$millis === undefined ? 0 : _ref7$millis, _ref7$callback = _ref7.callback, callback = _ref7$callback === undefined ? null : _ref7$callback; var now = Date.now(); var ellapsed = now - time; var expired = ellapsed !== now && ellapsed > millis; var item = null; if (expired) { item = new RangeError("TimeoutException"); callback(item); this.mEventEmitter.emit(LinkedBlockingQueue.EXCEPTION, item); } else { if (!this.isEmpty()) { this.mCount--; item = this.dequeue(); callback(item); this.mEventEmitter.emit(LinkedBlockingQueue.POLL, item); } } return item; } }, { key: 'put', value: function put(e) { var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; this.offer(e, { callback: callback }); } }, { key: 'remainingCapacity', value: function remainingCapacity() { return this.mCapacity - this.mCount; } }, { key: 'remove', value: function remove(e) { if (!util.isDefined(e)) { return false; } for (var trail = this.mHead, p = trail.next; p !== null; trail = p, p = p.next) { if (e === p.item) { this.unlink(p, trail); this.mCount = this.mCount - 1; return true; } } return false; } }, { key: 'size', value: function size() { return this.mCount; } }, { key: 'startListeners', value: function startListeners() { var flag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var listener = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; switch (flag) { case 0x16: this.mEventEmitter.on(LinkedBlockingQueue.OFFER, listener); this.mEventEmitter.on(LinkedBlockingQueue.POLL, listener); this.mEventEmitter.on(LinkedBlockingQueue.EXCEPTION, listener); case 0x8: this.mEventEmitter.on(LinkedBlockingQueue.OFFER, listener); break; case 0x4: this.mEventEmitter.on(LinkedBlockingQueue.POLL, listener); break; case 0x2: this.mEventEmitter.on(LinkedBlockingQueue.EXCEPTION, listener); break; } } }, { key: 'stopListeners', value: function stopListeners() { var flag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var listener = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; switch (flag) { case 0x16: default: if (!listener) { this.mEventEmitter.removeAllListeners(LinkedBlockingQueue.OFFER); this.mEventEmitter.removeAllListeners(LinkedBlockingQueue.POLL); this.mEventEmitter.removeAllListeners(LinkedBlockingQueue.EXCEPTION); } else { this.mEventEmitter.removeListener(LinkedBlockingQueue.OFFER, listener); this.mEventEmitter.removeListener(LinkedBlockingQueue.POLL, listener); this.mEventEmitter.removeListener(LinkedBlockingQueue.EXCEPTION, listener); } break; case 0x8: if (!listener) { this.mEventEmitter.removeAllListeners(LinkedBlockingQueue.OFFER); } else { this.mEventEmitter.removeListener(LinkedBlockingQueue.OFFER, listener); } break; case 0x4: if (!listener) { this.mEventEmitter.removeAllListeners(LinkedBlockingQueue.POLL); } else { this.mEventEmitter.removeListener(LinkedBlockingQueue.POLL, listener); } case 0x2: if (!listener) { this.mEventEmitter.removeAllListeners(LinkedBlockingQueue.EXCEPTION); } else { this.mEventEmitter.removeListener(LinkedBlockingQueue.EXCEPTION, listener); } break; } } }, { key: 'take', value: function take() { var callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; return this.poll({ callback: callback }); } }, { key: 'toArray', value: function toArray() { var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var k = 0; for (var p = this.mHead.next; p !== null; p = p.next) { list[k] = p.item; k++; } } }, { key: 'unlink', value: function unlink(p, tail) { p.item = null; tail.next = p.next; if (this.mLast === p) { this.mLast = tail; } } }]); return LinkedBlockingQueue; }(BlockingQueue); LinkedBlockingQueue.OFFER = "offer"; LinkedBlockingQueue.POLL = "poll"; LinkedBlockingQueue.EXCEPTION = "exception";