Home Reference Source Repository

src/operators/merge.js

/**
 * Merges two or more streams into one.
 *
 * @example
 * import { Subject, BehaviorSubject, merge } from 'rxstream';
 *
 * let first$ = new BehaviorSubject();
 * let second$ = new Subject();
 * let merged$ = merge(Subject, [first$, second$])
 *
 * first$.next(1);
 *
 * merged$.subscribe(value => console.log(value));
 * first$.next(2);
 * second$.next(3);
 * second$.next(4);
 *
 * // Output is going to be: 2, 3, 4.
 * // Notice that despite the fact that merged stream has BehaviorSubject
 * // we are getting in output only 2, 3 and 4 but not 1. This is because we specified
 * // that our result stream should be of type Subject, which does not remember
 * // previous values.
 *
 * @function merge<T>
 * @param {Subject|BehaviorSubject|ReplaySubject} SubjectConstructor Pass a constructor of result/merged stream
 * @param {Array} subjectList An array of subjects/streams to be merged
 * @returns {Subject|BehaviorSubject|ReplaySubject}
 */
export function merge(SubjectConstructor, subjectList) {
  let stream$ = new SubjectConstructor();

  subjectList.forEach(function (subject) {
    subject.subscribe(payload => stream$.next(payload));
  });

  return stream$;
}