Home Reference Source Repository

src/operators/filter.js

/**
 * Filters one stream and returns another with only filtered values.
 *
 * @example
 * import { Subject, filter } from 'rxstream';
 *
 * let numbers$ = new Subject();
 * let evenNumbers$ = filter(Subject, numbers$, (num) => num % 2 === 0);
 *
 * evenNumbers$.subscribe(num => console.log(num));
 *
 * numbers$.next(1);
 * numbers$.next(2);
 * numbers$.next(3);
 * numbers$.next(4);
 *
 * // Output is going to be: 2, 4
 *
 * @function filter<T>
 * @param {Subject|BehaviorSubject|ReplaySubject} SubjectConstructor Pass a constructor of result/filtered stream
 * @param {Subject|BehaviorSubject|ReplaySubject} stream$ Stream to be filtered
 * @param {function(value: T): boolean} conditionCallback Predicate function, to test each element of the stream. Return true to keep the element, false otherwise
 * @returns {Subject|BehaviorSubject|ReplaySubject}
 */
export function filter(SubjectConstructor, stream$, conditionCallback) {
  let filteredStream$ = new SubjectConstructor();

  stream$.subscribe(function (payload) {
    (conditionCallback(payload)) ? filteredStream$.next(payload) : null
  });

  return filteredStream$;
}