# All files / api observer.ts

90% Statements 9/10
75% Branches 6/8
100% Functions 2/2
88.89% Lines 8/9

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59

    2x
    86x

    86x
    60x

    26x
    78x
    78x

    26x

     /**
     * Copyright 2017 Google Inc.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *   http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */

    import { AnyJs } from '../util/misc';
    import { JsonObject } from '../model/field_value';

    /**
     * Observer/Subscribe interfaces.
     */
    export type NextFn<T> = (value: T) => void;
    export type ErrorFn = (error: Error) => void;
    export type CompleteFn = () => void;

    // Allow for any of the Observer methods to be undefined.
    export interface PartialObserver<T> {
      next?: NextFn<T>;
      error?: ErrorFn;
      complete?: CompleteFn;
    }

    export interface Unsubscribe {
      (): void;
    }

    export function isPartialObserver(obj: AnyJs): boolean {
      return implementsAnyMethods(obj, ['next', 'error', 'complete']);
    }

    /**
     * Returns true if obj is an object and contains at least one of the specified
     * methods.
     */
    function implementsAnyMethods(obj: AnyJs, methods: string[]): boolean {
      if (typeof obj !== 'object' || obj === null) {
        return false;
      }

      const object = obj as JsonObject<AnyJs>;
      for (const method of methods) {
        Iif (method in object && typeof object[method] === 'function') {
          return true;
        }
      }
      return false;
    }