import { endEvent, Event, EventStream, EventStreamSeed, isEnd, Scope, ObservableSeed, Observer, } from "./abstractions" import { applyScopeMaybe } from "./applyscope" import { fromSubscribe } from "./fromsubscribe" import { nop, rename } from "./util" export function repeat( generator: (iteration: number) => ObservableSeed | undefined ): EventStreamSeed export function repeat( generator: (iteration: number) => ObservableSeed | undefined, scope: Scope ): EventStream export function repeat( generator: (iteration: number) => ObservableSeed | undefined, scope?: Scope ): any { var index = 0 return applyScopeMaybe( rename( "repeat(fn)", fromSubscribe(function ( onValue: Observer, onEnd: Observer = nop ) { var flag = false var unsub = function () {} function handleEnd() { if (!flag) { flag = true } else { subscribeNext() } } function subscribeNext() { var next: ObservableSeed | undefined flag = true while (flag) { next = generator(index++) flag = false if (next) { unsub = next.consume().subscribe(onValue, handleEnd) } else { onEnd() } } flag = true } subscribeNext() return () => unsub() }) ), scope ) }