import { Subject, subject } from './subject' export const of = (...items: any[]) => subject(({ next, complete }) => { items.forEach(item => { next(item) }) complete() }) export const fromEvent = (element: EventTarget, eventName: string) => subject(({ next }) => { element.addEventListener(eventName, next) return () => element.removeEventListener(eventName, next) }) export const fromPromise = (promise: Promise) => subject(({ next, complete, error }) => { promise.then(next).catch(error).finally(complete) }) export const bindCallback = (cb: (...args: any[]) => any, ...args_: any[]) => subject(({ next }) => { cb(...args_, next) }) export const concat = (...subjects: Subject[]) => subject(({ next, complete }) => { const copiedSubjects = [...subjects] const handleNext = () => { const s = copiedSubjects.shift() if (!s) { complete() } s.subscribe({ next, complete: () => { handleNext() }, }) } handleNext() })