| 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(); | 
|   }); | 
| } |