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
}