| import { root } from '../util/root'; |
| import { Observable } from '../Observable'; |
| import { iterator as Symbol_iterator } from '../symbol/iterator'; |
| /** |
| * We need this JSDoc comment for affecting ESDoc. |
| * @extends {Ignored} |
| * @hide true |
| */ |
| export class IteratorObservable extends Observable { |
| constructor(iterator, scheduler) { |
| super(); |
| this.scheduler = scheduler; |
| if (iterator == null) { |
| throw new Error('iterator cannot be null.'); |
| } |
| this.iterator = getIterator(iterator); |
| } |
| static create(iterator, scheduler) { |
| return new IteratorObservable(iterator, scheduler); |
| } |
| static dispatch(state) { |
| const { index, hasError, iterator, subscriber } = state; |
| if (hasError) { |
| subscriber.error(state.error); |
| return; |
| } |
| let result = iterator.next(); |
| if (result.done) { |
| subscriber.complete(); |
| return; |
| } |
| subscriber.next(result.value); |
| state.index = index + 1; |
| if (subscriber.closed) { |
| if (typeof iterator.return === 'function') { |
| iterator.return(); |
| } |
| return; |
| } |
| this.schedule(state); |
| } |
| _subscribe(subscriber) { |
| let index = 0; |
| const { iterator, scheduler } = this; |
| if (scheduler) { |
| return scheduler.schedule(IteratorObservable.dispatch, 0, { |
| index, iterator, subscriber |
| }); |
| } |
| else { |
| do { |
| let result = iterator.next(); |
| if (result.done) { |
| subscriber.complete(); |
| break; |
| } |
| else { |
| subscriber.next(result.value); |
| } |
| if (subscriber.closed) { |
| if (typeof iterator.return === 'function') { |
| iterator.return(); |
| } |
| break; |
| } |
| } while (true); |
| } |
| } |
| } |
| class StringIterator { |
| constructor(str, idx = 0, len = str.length) { |
| this.str = str; |
| this.idx = idx; |
| this.len = len; |
| } |
| [Symbol_iterator]() { return (this); } |
| next() { |
| return this.idx < this.len ? { |
| done: false, |
| value: this.str.charAt(this.idx++) |
| } : { |
| done: true, |
| value: undefined |
| }; |
| } |
| } |
| class ArrayIterator { |
| constructor(arr, idx = 0, len = toLength(arr)) { |
| this.arr = arr; |
| this.idx = idx; |
| this.len = len; |
| } |
| [Symbol_iterator]() { return this; } |
| next() { |
| return this.idx < this.len ? { |
| done: false, |
| value: this.arr[this.idx++] |
| } : { |
| done: true, |
| value: undefined |
| }; |
| } |
| } |
| function getIterator(obj) { |
| const i = obj[Symbol_iterator]; |
| if (!i && typeof obj === 'string') { |
| return new StringIterator(obj); |
| } |
| if (!i && obj.length !== undefined) { |
| return new ArrayIterator(obj); |
| } |
| if (!i) { |
| throw new TypeError('object is not iterable'); |
| } |
| return obj[Symbol_iterator](); |
| } |
| const maxSafeInteger = Math.pow(2, 53) - 1; |
| function toLength(o) { |
| let len = +o.length; |
| if (isNaN(len)) { |
| return 0; |
| } |
| if (len === 0 || !numberIsFinite(len)) { |
| return len; |
| } |
| len = sign(len) * Math.floor(Math.abs(len)); |
| if (len <= 0) { |
| return 0; |
| } |
| if (len > maxSafeInteger) { |
| return maxSafeInteger; |
| } |
| return len; |
| } |
| function numberIsFinite(value) { |
| return typeof value === 'number' && root.isFinite(value); |
| } |
| function sign(value) { |
| let valueAsNumber = +value; |
| if (valueAsNumber === 0) { |
| return valueAsNumber; |
| } |
| if (isNaN(valueAsNumber)) { |
| return valueAsNumber; |
| } |
| return valueAsNumber < 0 ? -1 : 1; |
| } |
| //# sourceMappingURL=IteratorObservable.js.map |