# All files / api geo_point.ts

100% Statements 23/23
100% Branches 14/14
100% Functions 6/6
100% Lines 22/22

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84

    2x
    2x

    2x

    2x

    71x
    71x
    71x
    71x
    5x

    66x
    5x

    61x
    61x

    2x
    15x

    2x
    15x

    2x
    24x

    2x
    484x

    2x
     /**
     * 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 { Code, FirestoreError } from '../util/error';
    import {
      validateArgType,
      validateExactNumberOfArgs
    } from '../util/input_validation';
    import { primitiveComparator } from '../util/misc';

    /**
     * Immutable class representing a geo point as latitude-longitude pair.
     * This class is directly exposed in the public API, including its constructor.
     */
    export class GeoPoint {
      // Prefix with underscore to signal this is a private variable in JS and
      // prevent it showing up for autocompletion when typing latitude or longitude.
      private _lat: number;
      private _long: number;

      constructor(latitude: number, longitude: number) {
        validateExactNumberOfArgs('GeoPoint', arguments, 2);
        validateArgType('GeoPoint', 'number', 1, latitude);
        validateArgType('GeoPoint', 'number', 2, longitude);
        if (!isFinite(latitude) || latitude < -90 || latitude > 90) {
          throw new FirestoreError(
            Code.INVALID_ARGUMENT,
            'Latitude must be a number between -90 and 90, but was: ' + latitude
          );
        }
        if (!isFinite(longitude) || longitude < -180 || longitude > 180) {
          throw new FirestoreError(
            Code.INVALID_ARGUMENT,
            'Longitude must be a number between -180 and 180, but was: ' + longitude
          );
        }

        this._lat = latitude;
        this._long = longitude;
      }

      /**
       * Returns the latitude of this geo point, a number between -90 and 90.
       */
      get latitude(): number {
        return this._lat;
      }

      /**
       * Returns the longitude of this geo point, a number between -180 and 180.
       */
      get longitude(): number {
        return this._long;
      }

      isEqual(other: GeoPoint): boolean {
        return this._lat === other._lat && this._long === other._long;
      }

      /**
       * Actually private to JS consumers of our API, so this function is prefixed
       * with an underscore.
       */
      _compareTo(other: GeoPoint): number {
        return (
          primitiveComparator(this._lat, other._lat) ||
          primitiveComparator(this._long, other._long)
        );
      }
    }