hjs-future
Version:
Future classes of Hubrijs framework
677 lines (611 loc) • 24.9 kB
JavaScript
'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";