astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
172 lines (150 loc) • 14.2 kB
JavaScript
import RingBuffer from './RingBuffer.mjs'
export default class PushPullIterable {
queue
pushQueue = []
pullQueue = []
producing = true
consuming = true
iterating = false
consumeError
produceError
constructor(capacity) {
if (
(capacity !== Infinity && !Number.isFinite(capacity)) ||
capacity < 0 ||
capacity % 1
) {
throw new Error(`invalid capacity: ${capacity}`)
}
this.queue = new RingBuffer(capacity)
}
[Symbol.asyncIterator]() {
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
const self = this
return {
async next() {
return self.pull()
},
async return() {
self.iteratorReturn()
return {
value: undefined,
done: true,
}
},
async throw(error) {
self.iteratorThrow({
error,
})
return {
value: undefined,
done: true,
}
},
}
}
async push(value) {
if (!this.producing) {
throw new Error(`can't push after returning or throwing`)
}
if (!this.consuming) return false
if (this.consumeError) throw this.consumeError
const waitingPull = this.pullQueue.shift()
if (waitingPull) {
waitingPull.resolve({
value,
done: false,
})
return this.consuming
}
if (!this.queue.isFull) {
this.queue.push(value)
return this.consuming
}
return new Promise((resolve, reject) => {
this.pushQueue.push({
resolve: (keepGoing) => {
if (keepGoing && this.producing) this.queue.push(value)
resolve(keepGoing)
},
reject,
})
})
}
async pull() {
if (!this.consuming) {
throw new Error(`can't call next after returning or throwing`)
}
if (this.produceError) throw this.produceError
if (this.queue.size) {
var _this$pushQueue$shift
const pulled = this.queue.pull()
;(_this$pushQueue$shift = this.pushQueue.shift()) === null ||
_this$pushQueue$shift === void 0
? void 0
: _this$pushQueue$shift.resolve(true)
return {
value: pulled,
done: false,
}
}
if (!this.producing) {
return {
value: undefined,
done: true,
}
}
return new Promise((resolve, reject) => {
this.pullQueue.push({
resolve,
reject,
})
})
}
return() {
if (!this.producing) return
this.producing = false
const { pullQueue } = this
this.pullQueue = []
for (const pull of pullQueue) {
pull.resolve({
value: undefined,
done: true,
})
}
} // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
throw(error) {
if (!this.producing) return
this.producing = false
this.produceError = error
const { pullQueue } = this
this.pullQueue = []
for (const pull of pullQueue) {
pull.reject(error)
}
}
iteratorReturn() {
if (!this.consuming) return
this.consuming = false
const { pushQueue } = this
this.pushQueue = []
for (const push of pushQueue) {
push.resolve(false)
}
}
iteratorThrow(error) {
if (!this.consuming) return
this.consuming = false
this.consumeError = error
const { pushQueue } = this
this.pushQueue = []
for (const push of pushQueue) {
push.reject(error)
}
}
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSaW5nQnVmZmVyIiwiUHVzaFB1bGxJdGVyYWJsZSIsInF1ZXVlIiwicHVzaFF1ZXVlIiwicHVsbFF1ZXVlIiwicHJvZHVjaW5nIiwiY29uc3VtaW5nIiwiaXRlcmF0aW5nIiwiY29uc3VtZUVycm9yIiwicHJvZHVjZUVycm9yIiwiY29uc3RydWN0b3IiLCJjYXBhY2l0eSIsIkluZmluaXR5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJFcnJvciIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJzZWxmIiwibmV4dCIsInB1bGwiLCJyZXR1cm4iLCJpdGVyYXRvclJldHVybiIsInZhbHVlIiwidW5kZWZpbmVkIiwiZG9uZSIsInRocm93IiwiZXJyb3IiLCJpdGVyYXRvclRocm93IiwicHVzaCIsIndhaXRpbmdQdWxsIiwic2hpZnQiLCJyZXNvbHZlIiwiaXNGdWxsIiwiUHJvbWlzZSIsInJlamVjdCIsImtlZXBHb2luZyIsInNpemUiLCJwdWxsZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9QdXNoUHVsbEl0ZXJhYmxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSaW5nQnVmZmVyIGZyb20gJy4vUmluZ0J1ZmZlcidcblxudHlwZSBSZXNvbHZlUmVqZWN0PFQ+ID0ge1xuICByZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWRcbiAgcmVqZWN0OiAoZXJyb3I/OiBhbnkpID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaFB1bGxJdGVyYWJsZTxUPiBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8VD4ge1xuICBwcml2YXRlIHF1ZXVlOiBSaW5nQnVmZmVyPFQ+XG4gIHByaXZhdGUgcHVzaFF1ZXVlOiBSZXNvbHZlUmVqZWN0PGJvb2xlYW4+W10gPSBbXVxuICBwcml2YXRlIHB1bGxRdWV1ZTogUmVzb2x2ZVJlamVjdDxJdGVyYXRvclJlc3VsdDxUPj5bXSA9IFtdXG4gIHByaXZhdGUgcHJvZHVjaW5nID0gdHJ1ZVxuICBwcml2YXRlIGNvbnN1bWluZyA9IHRydWVcbiAgcHJpdmF0ZSBpdGVyYXRpbmcgPSBmYWxzZVxuICBwcml2YXRlIGNvbnN1bWVFcnJvcjogYW55XG4gIHByaXZhdGUgcHJvZHVjZUVycm9yOiBhbnlcblxuICBjb25zdHJ1Y3RvcihjYXBhY2l0eTogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgKGNhcGFjaXR5ICE9PSBJbmZpbml0eSAmJiAhTnVtYmVyLmlzRmluaXRlKGNhcGFjaXR5KSkgfHxcbiAgICAgIGNhcGFjaXR5IDwgMCB8fFxuICAgICAgY2FwYWNpdHkgJSAxXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgY2FwYWNpdHk6ICR7Y2FwYWNpdHl9YClcbiAgICB9XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBSaW5nQnVmZmVyKGNhcGFjaXR5KVxuICB9XG5cbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhdG9yPFQ+IHtcbiAgICBpZiAodGhpcy5pdGVyYXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHRoaXMgaXRlcmFibGUgZG9lc24ndCBzdXBwb3J0IGNyZWF0aW5nIG1vcmUgdGhhbiBvbmUgaXRlcmF0b3JgXG4gICAgICApXG4gICAgfVxuICAgIHRoaXMuaXRlcmF0aW5nID0gdHJ1ZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICByZXR1cm4gc2VsZi5wdWxsKClcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICBzZWxmLml0ZXJhdG9yUmV0dXJuKClcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgdGhyb3coZXJyb3I/OiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgICAgIHNlbGYuaXRlcmF0b3JUaHJvdyh7IGVycm9yIH0pXG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICBhc3luYyBwdXNoKHZhbHVlOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLnByb2R1Y2luZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBwdXNoIGFmdGVyIHJldHVybmluZyBvciB0aHJvd2luZ2ApXG4gICAgfVxuICAgIGlmICghdGhpcy5jb25zdW1pbmcpIHJldHVybiBmYWxzZVxuICAgIGlmICh0aGlzLmNvbnN1bWVFcnJvcikgdGhyb3cgdGhpcy5jb25zdW1lRXJyb3JcbiAgICBjb25zdCB3YWl0aW5nUHVsbCA9IHRoaXMucHVsbFF1ZXVlLnNoaWZ0KClcbiAgICBpZiAod2FpdGluZ1B1bGwpIHtcbiAgICAgIHdhaXRpbmdQdWxsLnJlc29sdmUoeyB2YWx1ZSwgZG9uZTogZmFsc2UgfSlcbiAgICAgIHJldHVybiB0aGlzLmNvbnN1bWluZ1xuICAgIH1cbiAgICBpZiAoIXRoaXMucXVldWUuaXNGdWxsKSB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2godmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy5jb25zdW1pbmdcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucHVzaFF1ZXVlLnB1c2goe1xuICAgICAgICByZXNvbHZlOiAoa2VlcEdvaW5nOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKGtlZXBHb2luZyAmJiB0aGlzLnByb2R1Y2luZykgdGhpcy5xdWV1ZS5wdXNoKHZhbHVlKVxuICAgICAgICAgIHJlc29sdmUoa2VlcEdvaW5nKVxuICAgICAgICB9LFxuICAgICAgICByZWplY3QsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1bGwoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIGlmICghdGhpcy5jb25zdW1pbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3QgY2FsbCBuZXh0IGFmdGVyIHJldHVybmluZyBvciB0aHJvd2luZ2ApXG4gICAgfVxuICAgIGlmICh0aGlzLnByb2R1Y2VFcnJvcikgdGhyb3cgdGhpcy5wcm9kdWNlRXJyb3JcbiAgICBpZiAodGhpcy5xdWV1ZS5zaXplKSB7XG4gICAgICBjb25zdCBwdWxsZWQ6IFQgPSB0aGlzLnF1ZXVlLnB1bGwoKSBhcyBhbnlcbiAgICAgIHRoaXMucHVzaFF1ZXVlLnNoaWZ0KCk/LnJlc29sdmUodHJ1ZSlcbiAgICAgIHJldHVybiB7IHZhbHVlOiBwdWxsZWQsIGRvbmU6IGZhbHNlIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb2R1Y2luZykge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wdWxsUXVldWUucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb2R1Y2luZykgcmV0dXJuXG4gICAgdGhpcy5wcm9kdWNpbmcgPSBmYWxzZVxuICAgIGNvbnN0IHsgcHVsbFF1ZXVlIH0gPSB0aGlzXG4gICAgdGhpcy5wdWxsUXVldWUgPSBbXVxuICAgIGZvciAoY29uc3QgcHVsbCBvZiBwdWxsUXVldWUpIHtcbiAgICAgIHB1bGwucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICB0aHJvdyhlcnJvcj86IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcm9kdWNpbmcpIHJldHVyblxuICAgIHRoaXMucHJvZHVjaW5nID0gZmFsc2VcbiAgICB0aGlzLnByb2R1Y2VFcnJvciA9IGVycm9yXG4gICAgY29uc3QgeyBwdWxsUXVldWUgfSA9IHRoaXNcbiAgICB0aGlzLnB1bGxRdWV1ZSA9IFtdXG4gICAgZm9yIChjb25zdCBwdWxsIG9mIHB1bGxRdWV1ZSkge1xuICAgICAgcHVsbC5yZWplY3QoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpdGVyYXRvclJldHVybigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uc3VtaW5nKSByZXR1cm5cbiAgICB0aGlzLmNvbnN1bWluZyA9IGZhbHNlXG4gICAgY29uc3QgeyBwdXNoUXVldWUgfSA9IHRoaXNcbiAgICB0aGlzLnB1c2hRdWV1ZSA9IFtdXG4gICAgZm9yIChjb25zdCBwdXNoIG9mIHB1c2hRdWV1ZSkge1xuICAgICAgcHVzaC5yZXNvbHZlKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXRlcmF0b3JUaHJvdyhlcnJvcj86IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25zdW1pbmcpIHJldHVyblxuICAgIHRoaXMuY29uc3VtaW5nID0gZmFsc2VcbiAgICB0aGlzLmNvbnN1bWVFcnJvciA9IGVycm9yXG4gICAgY29uc3QgeyBwdXNoUXVldWUgfSA9IHRoaXNcbiAgICB0aGlzLnB1c2hRdWV1ZSA9IFtdXG4gICAgZm9yIChjb25zdCBwdXNoIG9mIHB1c2hRdWV1ZSkge1xuICAgICAgcHVzaC5yZWplY3QoZXJyb3IpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFVBQVAsTUFBdUIsY0FB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