| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 'use strict';
- const {Readable} = require('stream');
- class FromIterable extends Readable {
- constructor(options) {
- super(Object.assign({}, options, {objectMode: true}));
- this._iterable = null;
- this._next = null;
- if (options) {
- 'iterable' in options && (this._iterable = options.iterable);
- }
- !this._iterable && (this._read = this._readStop);
- }
- _read() {
- if (Symbol.asyncIterator && typeof this._iterable[Symbol.asyncIterator] == 'function') {
- this._next = this._iterable[Symbol.asyncIterator]();
- this._iterable = null;
- this._read = this._readNext;
- this._readNext();
- return;
- }
- if (Symbol.iterator && typeof this._iterable[Symbol.iterator] == 'function') {
- this._next = this._iterable[Symbol.iterator]();
- this._iterable = null;
- this._read = this._readNext;
- this._readNext();
- return;
- }
- if (typeof this._iterable.next == 'function') {
- this._next = this._iterable;
- this._iterable = null;
- this._read = this._readNext;
- this._readNext();
- return;
- }
- const result = this._iterable();
- this._iterable = null;
- if (result && typeof result.then == 'function') {
- result.then(value => this.push(value), error => this.emit('error', error));
- this._read = this._readStop;
- return;
- }
- if (result && typeof result.next == 'function') {
- this._next = result;
- this._read = this._readNext;
- this._readNext();
- return;
- }
- this.push(result);
- this._read = this._readStop;
- }
- _readNext() {
- for (;;) {
- const result = this._next.next();
- if (result && typeof result.then == 'function') {
- result.then(
- value => {
- if (value.done || value.value === null) {
- this.push(null);
- this._next = null;
- this._read = this._readStop;
- } else {
- this.push(value.value);
- }
- },
- error => this.emit('error', error)
- );
- break;
- }
- if (result.done || result.value === null) {
- this.push(null);
- this._next = null;
- this._read = this._readStop;
- break;
- }
- if (!this.push(result.value)) break;
- }
- }
- _readStop() {
- this.push(null);
- }
- static make(iterable) {
- return new FromIterable(typeof iterable == 'object' && iterable.iterable ? iterable : {iterable});
- }
- }
- FromIterable.fromIterable = FromIterable.make;
- FromIterable.make.Constructor = FromIterable;
- module.exports = FromIterable;
|