UNPKG

astx

Version:

super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring

514 lines (448 loc) 14.8 kB
'use strict' var _interopRequireDefault = require('@babel/runtime/helpers/interopRequireDefault') Object.defineProperty(exports, '__esModule', { value: true, }) exports['default'] = void 0 var _regenerator = _interopRequireDefault(require('@babel/runtime/regenerator')) var _asyncToGenerator2 = _interopRequireDefault( require('@babel/runtime/helpers/asyncToGenerator') ) var _classCallCheck2 = _interopRequireDefault( require('@babel/runtime/helpers/classCallCheck') ) var _createClass2 = _interopRequireDefault( require('@babel/runtime/helpers/createClass') ) var _defineProperty2 = _interopRequireDefault( require('@babel/runtime/helpers/defineProperty') ) var _RingBuffer = _interopRequireDefault(require('./RingBuffer')) var _Symbol$asyncIterator function _createForOfIteratorHelper(o, allowArrayLike) { var it = (typeof Symbol !== 'undefined' && o[Symbol.iterator]) || o['@@iterator'] if (!it) { if ( Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || (allowArrayLike && o && typeof o.length === 'number') ) { if (it) o = it var i = 0 var F = function F() {} return { s: F, n: function n() { if (i >= o.length) return { done: true, } return { done: false, value: o[i++], } }, e: function e(_e) { throw _e }, f: F, } } throw new TypeError( 'Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.' ) } var normalCompletion = true, didErr = false, err return { s: function s() { it = it.call(o) }, n: function n() { var step = it.next() normalCompletion = step.done return step }, e: function e(_e2) { didErr = true err = _e2 }, f: function f() { try { if (!normalCompletion && it['return'] != null) it['return']() } finally { if (didErr) throw err } }, } } function _unsupportedIterableToArray(o, minLen) { if (!o) return if (typeof o === 'string') return _arrayLikeToArray(o, minLen) var n = Object.prototype.toString.call(o).slice(8, -1) if (n === 'Object' && o.constructor) n = o.constructor.name if (n === 'Map' || n === 'Set') return Array.from(o) if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen) } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i] } return arr2 } _Symbol$asyncIterator = Symbol.asyncIterator var PushPullIterable = /*#__PURE__*/ (function () { function PushPullIterable(capacity) { ;(0, _classCallCheck2['default'])(this, PushPullIterable) ;(0, _defineProperty2['default'])(this, 'queue', void 0) ;(0, _defineProperty2['default'])(this, 'pushQueue', []) ;(0, _defineProperty2['default'])(this, 'pullQueue', []) ;(0, _defineProperty2['default'])(this, 'producing', true) ;(0, _defineProperty2['default'])(this, 'consuming', true) ;(0, _defineProperty2['default'])(this, 'iterating', false) ;(0, _defineProperty2['default'])(this, 'consumeError', void 0) ;(0, _defineProperty2['default'])(this, 'produceError', void 0) if ( (capacity !== Infinity && !Number.isFinite(capacity)) || capacity < 0 || capacity % 1 ) { throw new Error('invalid capacity: '.concat(capacity)) } this.queue = new _RingBuffer['default'](capacity) } ;(0, _createClass2['default'])(PushPullIterable, [ { key: _Symbol$asyncIterator, value: function value() { if (this.iterating) { throw new Error( "this iterable doesn't support creating more than one iterator" ) } this.iterating = true // eslint-disable-next-line @typescript-eslint/no-this-alias var self = this return { next: function next() { return (0, _asyncToGenerator2['default'])( /*#__PURE__*/ _regenerator['default'].mark(function _callee() { return _regenerator['default'].wrap(function _callee$( _context ) { while (1) { switch ((_context.prev = _context.next)) { case 0: return _context.abrupt('return', self.pull()) case 1: case 'end': return _context.stop() } } }, _callee) }) )() }, return: function _return() { return (0, _asyncToGenerator2['default'])( /*#__PURE__*/ _regenerator['default'].mark(function _callee2() { return _regenerator['default'].wrap(function _callee2$( _context2 ) { while (1) { switch ((_context2.prev = _context2.next)) { case 0: self.iteratorReturn() return _context2.abrupt('return', { value: undefined, done: true, }) case 2: case 'end': return _context2.stop() } } }, _callee2) }) )() }, throw: function _throw(error) { return (0, _asyncToGenerator2['default'])( /*#__PURE__*/ _regenerator['default'].mark(function _callee3() { return _regenerator['default'].wrap(function _callee3$( _context3 ) { while (1) { switch ((_context3.prev = _context3.next)) { case 0: self.iteratorThrow({ error: error, }) return _context3.abrupt('return', { value: undefined, done: true, }) case 2: case 'end': return _context3.stop() } } }, _callee3) }) )() }, } }, }, { key: 'push', value: (function () { var _push = (0, _asyncToGenerator2['default'])( /*#__PURE__*/ _regenerator['default'].mark(function _callee4(value) { var _this = this var waitingPull return _regenerator['default'].wrap( function _callee4$(_context4) { while (1) { switch ((_context4.prev = _context4.next)) { case 0: if (this.producing) { _context4.next = 2 break } throw new Error("can't push after returning or throwing") case 2: if (this.consuming) { _context4.next = 4 break } return _context4.abrupt('return', false) case 4: if (!this.consumeError) { _context4.next = 6 break } throw this.consumeError case 6: waitingPull = this.pullQueue.shift() if (!waitingPull) { _context4.next = 10 break } waitingPull.resolve({ value: value, done: false, }) return _context4.abrupt('return', this.consuming) case 10: if (this.queue.isFull) { _context4.next = 13 break } this.queue.push(value) return _context4.abrupt('return', this.consuming) case 13: return _context4.abrupt( 'return', new Promise(function (_resolve, reject) { _this.pushQueue.push({ resolve: function resolve(keepGoing) { if (keepGoing && _this.producing) _this.queue.push(value) _resolve(keepGoing) }, reject: reject, }) }) ) case 14: case 'end': return _context4.stop() } } }, _callee4, this ) }) ) function push(_x) { return _push.apply(this, arguments) } return push })(), }, { key: 'pull', value: (function () { var _pull = (0, _asyncToGenerator2['default'])( /*#__PURE__*/ _regenerator['default'].mark(function _callee5() { var _this2 = this var _this$pushQueue$shift, pulled return _regenerator['default'].wrap( function _callee5$(_context5) { while (1) { switch ((_context5.prev = _context5.next)) { case 0: if (this.consuming) { _context5.next = 2 break } throw new Error( "can't call next after returning or throwing" ) case 2: if (!this.produceError) { _context5.next = 4 break } throw this.produceError case 4: if (!this.queue.size) { _context5.next = 8 break } pulled = this.queue.pull() ;(_this$pushQueue$shift = this.pushQueue.shift()) === null || _this$pushQueue$shift === void 0 ? void 0 : _this$pushQueue$shift.resolve(true) return _context5.abrupt('return', { value: pulled, done: false, }) case 8: if (this.producing) { _context5.next = 10 break } return _context5.abrupt('return', { value: undefined, done: true, }) case 10: return _context5.abrupt( 'return', new Promise(function (resolve, reject) { _this2.pullQueue.push({ resolve: resolve, reject: reject, }) }) ) case 11: case 'end': return _context5.stop() } } }, _callee5, this ) }) ) function pull() { return _pull.apply(this, arguments) } return pull })(), }, { key: 'return', value: function _return() { if (!this.producing) return this.producing = false var pullQueue = this.pullQueue this.pullQueue = [] var _iterator = _createForOfIteratorHelper(pullQueue), _step try { for (_iterator.s(); !(_step = _iterator.n()).done; ) { var pull = _step.value pull.resolve({ value: undefined, done: true, }) } } catch (err) { _iterator.e(err) } finally { _iterator.f() } }, // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types }, { key: 'throw', value: function _throw(error) { if (!this.producing) return this.producing = false this.produceError = error var pullQueue = this.pullQueue this.pullQueue = [] var _iterator2 = _createForOfIteratorHelper(pullQueue), _step2 try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) { var pull = _step2.value pull.reject(error) } } catch (err) { _iterator2.e(err) } finally { _iterator2.f() } }, }, { key: 'iteratorReturn', value: function iteratorReturn() { if (!this.consuming) return this.consuming = false var pushQueue = this.pushQueue this.pushQueue = [] var _iterator3 = _createForOfIteratorHelper(pushQueue), _step3 try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done; ) { var push = _step3.value push.resolve(false) } } catch (err) { _iterator3.e(err) } finally { _iterator3.f() } }, }, { key: 'iteratorThrow', value: function iteratorThrow(error) { if (!this.consuming) return this.consuming = false this.consumeError = error var pushQueue = this.pushQueue this.pushQueue = [] var _iterator4 = _createForOfIteratorHelper(pushQueue), _step4 try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) { var push = _step4.value push.reject(error) } } catch (err) { _iterator4.e(err) } finally { _iterator4.f() } }, }, ]) return PushPullIterable })() exports['default'] = PushPullIterable