import { endEvent, EventStream, EventStreamSeed, isEventStream, isValue, } from "./abstractions" import { applyScope } from "./applyscope" import { EventStreamSeedImpl } from "./eventstream" import { nop } from "./util" export function merge(a: EventStream, b: EventStream): EventStream export function merge( a: EventStream, b: EventStream ): EventStream export function merge( a: EventStream, b: EventStream, c: EventStream ): EventStream export function merge( a: EventStream, b: EventStream, c: EventStream, d: EventStream ): EventStream export function merge( a: EventStream, b: EventStream, c: EventStream, d: EventStream, e: EventStream ): EventStream export function merge( a: EventStreamSeed, b: EventStreamSeed ): EventStreamSeed export function merge( a: EventStreamSeed, b: EventStreamSeed ): EventStreamSeed export function merge( a: EventStreamSeed, b: EventStreamSeed, c: EventStreamSeed ): EventStreamSeed export function merge( a: EventStreamSeed, b: EventStreamSeed, c: EventStreamSeed, d: EventStreamSeed ): EventStreamSeed export function merge( a: EventStreamSeed, b: EventStreamSeed, c: EventStreamSeed, d: EventStreamSeed, e: EventStreamSeed ): EventStreamSeed export function merge(streams: EventStream[]): EventStream export function merge(streams: EventStreamSeed[]): EventStreamSeed export function merge(...args: any[]) { let streams: (EventStream | EventStreamSeed)[] if (args[0] instanceof Array) { streams = args[0] } else { streams = args } const sources = streams.map((s) => s.consume()) const seed = new EventStreamSeedImpl( ["merge", streams], (onValue, onEnd = nop) => { let endCount = 0 const unsubs = sources.map((s) => s.subscribe( (event) => { onValue(event) }, () => { endCount++ if (endCount === sources.length) { onEnd() } } ) ) return () => unsubs.forEach((f) => f()) } ) if (sources.every(isEventStream)) { return applyScope(sources[0].getScope())(seed) } return seed }