hunk.code_window: {
     "name": "@reactivex/rxjs",
     "version": "6.0.0-alpha.3",
     "description": "Reactive Extensions for modern JavaScript",
     "main": "index.js",
     "config": {
       "commitizen": {
         "path": "cz-conventional-changelog"
       }
  
hunk.labels: keep keep keep keep add keep keep keep keep
hunk.after_edit:   "sideEffects": false,
  
hunk.file_path: package.json
hunk.type: add
file: import { Operator } from '../Operator';
  import { Observable } from '../Observable';
  import { Subscriber } from '../Subscriber';
  import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
  
  /* tslint:disable:max-line-length */
  export function defaultIfEmpty<T>(defaultValue?: T): MonoTypeOperatorFunction<T>;
  export function defaultIfEmpty<T, R>(defaultValue?: R): OperatorFunction<T, T | R>;
  /* tslint:enable:max-line-length */
  
  /**
   * Emits a given value if the source Observable completes without emitting any
   * `next` value, otherwise mirrors the source Observable.
   *
   * <span class="informal">If the source Observable turns out to be empty, then
   * this operator will emit a default value.</span>
   *
   * <img src="./img/defaultIfEmpty.png" width="100%">
   *
   * `defaultIfEmpty` emits the values emitted by the source Observable or a
   * specified default value if the source Observable is empty (completes without
   * having emitted any `next` value).
   *
   * @example <caption>If no clicks happen in 5 seconds, then emit "no clicks"</caption>
   * var clicks = Rx.Observable.fromEvent(document, 'click');
   * var clicksBeforeFive = clicks.takeUntil(Rx.Observable.interval(5000));
   * var result = clicksBeforeFive.defaultIfEmpty('no clicks');
   * result.subscribe(x => console.log(x));
   *
   * @see {@link empty}
   * @see {@link last}
   *
   * @param {any} [defaultValue=null] The default value used if the source
   * Observable is empty.
   * @return {Observable} An Observable that emits either the specified
   * `defaultValue` if the source Observable emits no items, or the values emitted
   * by the source Observable.
   * @method defaultIfEmpty
   * @owner Observable
   */
  export function defaultIfEmpty<T, R>(defaultValue: R = null): OperatorFunction<T, T | R> {
    return (source: Observable<T>) => source.lift(new DefaultIfEmptyOperator(defaultValue)) as Observable<T | R>;
  }
  
  class DefaultIfEmptyOperator<T, R> implements Operator<T, T | R> {
  
    constructor(private defaultValue: R) {
    }
  
    call(subscriber: Subscriber<T | R>, source: any): any {
      return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
    }
  }
  
  /**
   * We need this JSDoc comment for affecting ESDoc.
   * @ignore
   * @extends {Ignored}
   */
  class DefaultIfEmptySubscriber<T, R> extends Subscriber<T> {
    private isEmpty: boolean = true;
  
    constructor(destination: Subscriber<T | R>, private defaultValue: R) {
      super(destination);
    }
  
    protected _next(value: T): void {
      this.isEmpty = false;
      this.destination.next(value);
    }
  
    protected _complete(): void {
      if (this.isEmpty) {
        this.destination.next(this.defaultValue);
      }
      this.destination.complete();
    }
  }
  