Buckets:
| import { Observable } from '../Observable'; | |
| import { SchedulerLike } from '../types'; | |
| import { iterator as Symbol_iterator } from '../symbol/iterator'; | |
| import { isFunction } from '../util/isFunction'; | |
| import { executeSchedule } from '../util/executeSchedule'; | |
| /** | |
| * Used in {@link scheduled} to create an observable from an Iterable. | |
| * @param input The iterable to create an observable from | |
| * @param scheduler The scheduler to use | |
| */ | |
| export function scheduleIterable<T>(input: Iterable<T>, scheduler: SchedulerLike) { | |
| return new Observable<T>((subscriber) => { | |
| let iterator: Iterator<T, T>; | |
| // Schedule the initial creation of the iterator from | |
| // the iterable. This is so the code in the iterable is | |
| // not called until the scheduled job fires. | |
| executeSchedule(subscriber, scheduler, () => { | |
| // Create the iterator. | |
| iterator = (input as any)[Symbol_iterator](); | |
| executeSchedule( | |
| subscriber, | |
| scheduler, | |
| () => { | |
| let value: T; | |
| let done: boolean | undefined; | |
| try { | |
| // Pull the value out of the iterator | |
| ({ value, done } = iterator.next()); | |
| } catch (err) { | |
| // We got an error while pulling from the iterator | |
| subscriber.error(err); | |
| return; | |
| } | |
| if (done) { | |
| // If it is "done" we just complete. This mimics the | |
| // behavior of JavaScript's `for..of` consumption of | |
| // iterables, which will not emit the value from an iterator | |
| // result of `{ done: true: value: 'here' }`. | |
| subscriber.complete(); | |
| } else { | |
| // The iterable is not done, emit the value. | |
| subscriber.next(value); | |
| } | |
| }, | |
| 0, | |
| true | |
| ); | |
| }); | |
| // During finalization, if we see this iterator has a `return` method, | |
| // then we know it is a Generator, and not just an Iterator. So we call | |
| // the `return()` function. This will ensure that any `finally { }` blocks | |
| // inside of the generator we can hit will be hit properly. | |
| return () => isFunction(iterator?.return) && iterator.return(); | |
| }); | |
| } | |
Xet Storage Details
- Size:
- 2.18 kB
- Xet hash:
- 9efa9dad6af20c694ebea69be51d842e60687c0e017b5d981dabd1f4daaff23f
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.