Repositorio del curso CCOM4030 el semestre B91 del proyecto Artesanías con el Instituto de Cultura

scheduleIterable.ts 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { Observable } from '../Observable';
  2. import { SchedulerLike } from '../types';
  3. import { Subscription } from '../Subscription';
  4. import { iterator as Symbol_iterator } from '../symbol/iterator';
  5. export function scheduleIterable<T>(input: Iterable<T>, scheduler: SchedulerLike) {
  6. if (!input) {
  7. throw new Error('Iterable cannot be null');
  8. }
  9. return new Observable<T>(subscriber => {
  10. const sub = new Subscription();
  11. let iterator: Iterator<T>;
  12. sub.add(() => {
  13. // Finalize generators
  14. if (iterator && typeof iterator.return === 'function') {
  15. iterator.return();
  16. }
  17. });
  18. sub.add(scheduler.schedule(() => {
  19. iterator = input[Symbol_iterator]();
  20. sub.add(scheduler.schedule(function () {
  21. if (subscriber.closed) {
  22. return;
  23. }
  24. let value: T;
  25. let done: boolean;
  26. try {
  27. const result = iterator.next();
  28. value = result.value;
  29. done = result.done;
  30. } catch (err) {
  31. subscriber.error(err);
  32. return;
  33. }
  34. if (done) {
  35. subscriber.complete();
  36. } else {
  37. subscriber.next(value);
  38. this.schedule();
  39. }
  40. }));
  41. }));
  42. return sub;
  43. });
  44. }