# -*- coding: utf-8 -*-

u'''Single-instance strings, intern'ed across modules.
'''

__all__ = ('NN',)
__version__ = '20.07.21'

NN = ''  # no name, empty str, Nomen Nescio <https://Wiktionary.org/wiki/N.N.>

# __DUNDER__ would get mangled in classes
_0_                 = '0'                   # PYCHOK expected
_1_                 = '1'                   # PYCHOK expected
_2_                 = '2'                   # PYCHOK expected
_areaOf_            = 'areaOf'              # PYCHOK expected
_ambiguous_         = 'ambiguous'           # PYCHOK expected
_angle_             = 'angle'               # PYCHOK expected
_AT_                = '@'                   # PYCHOK expected
_azimuth_           = 'azimuth'             # PYCHOK expected
_band_              = 'band'                # PYCHOK expected
_bearing_           = 'bearing'             # PYCHOK expected
_beta_              = 'beta'                # PYCHOK expected
_C_                 = 'C'                   # PYCHOK expected
_Cartesian_         = 'Cartesian'           # PYCHOK expected
_coincident_        = 'coincident'          # PYCHOK expected
_colinear_          = 'colinear'            # PYCHOK expected
_COLON_             = ':'                   # PYCHOK expected
_COMMA_             = ','                   # PYCHOK expected
_convergence_       = 'convergence'         # PYCHOK expected
_cubic_             = 'cubic'               # PYCHOK expected
_CURLY_             = '{%s}'                # PYCHOK expected
_datum_             = 'datum'               # PYCHOK expected
_decode3_           = 'decode3'             # PYCHOK expected
_deg_               = 'deg'                 # PYCHOK expected
_degrees_           = 'degrees'             # PYCHOK expected
_distance_          = 'distance'            # PYCHOK expected
_distanceTo_        = 'distanceTo'          # PYCHOK expected
_doesn_t_exist_     = "doesn't exist"       # PYCHOK expected
_DOT_               = '.'                   # PYCHOK expected
_E_                 = 'E'                   # PYCHOK expected
_easting_           = 'easting'             # PYCHOK expected
_elevation_         = 'elevation'           # PYCHOK expected
_ellipsoid_         = 'ellipsoid'           # PYCHOK expected
_ellipsoidal_       = 'ellipsoidal'         # PYCHOK expected
_encode_            = 'encode'              # PYCHOK expected
_end_               = 'end'                 # PYCHOK expected
_EQUAL_             = '='                   # PYCHOK expected
_exceed_PI_radians_ = 'exceed PI radians'   # PYCHOK expected
_feet_              = 'feet'                # PYCHOK expected
_fraction_          = 'fraction'            # PYCHOK expected
_h_                 = 'h'                   # PYCHOK expected
_height_            = 'height'              # PYCHOK expected
_hemipole_          = 'hemipole'            # PYCHOK expected
_intersection_      = 'intersection'        # PYCHOK expected
_inside_            = 'inside'              # PYCHOK expected
_invalid_           = 'invalid'             # PYCHOK expected
_isclockwise_       = 'isclockwise'         # PYCHOK expected
_ispolar_           = 'ispolar'             # PYCHOK expected
_k0_                = 'k0'                  # PYCHOK expected
_knots_             = 'knots'               # PYCHOK expected
_lam_               = 'lam'                 # PYCHOK expected
_lat_               = 'lat'                 # PYCHOK expected
_lat0_              = 'lat0'                # PYCHOK expected
_lat1_              = 'lat1'                # PYCHOK expected
_LatLon_            = 'LatLon'              # PYCHOK expected
_len_               = 'len'                 # PYCHOK expected
_linear_            = 'linear'              # PYCHOK expected
_lon_               = 'lon'                 # PYCHOK expected
_lon0_              = 'lon0'                # PYCHOK expected
_lon1_              = 'lon1'                # PYCHOK expected
_m_                 = 'm'                   # PYCHOK expected
_meanOf_            = 'meanOf'              # PYCHOK expected
_meter_             = 'meter'               # PYCHOK expected
_MGRS_              = 'MGRS'                # PYCHOK expected
_N_                 = 'N'                   # PYCHOK expected
_n_a_               = 'n/a'                 # PYCHOK expected
_name_              = 'name'                # PYCHOK expected
_near_concentric_   = 'near-concentric'     # PYCHOK expected
_nearestOn2_        = 'nearestOn2'          # PYCHOK expected
_no_convergence_    = 'no convergence'      # PYCHOK expected
_no_conversion_     = 'no conversion'       # PYCHOK expected
_northing_          = 'northing'            # PYCHOK expected
_NorthPole_         = 'NorthPole'           # PYCHOK expected
_not_convex_        = 'not convex'          # PYCHOK expected
_number_            = 'number'              # PYCHOK expected
_Nvector_           = 'Nvector'             # PYCHOK expected
_other_             = 'other'               # PYCHOK expected
_outside_           = 'outside'             # PYCHOK expected
_PARENTH_           = '(%s)'                # PYCHOK expected
_PERCENT_           = '%'                   # PYCHOK expected
_perimeterOf_       = 'perimeterOf'         # PYCHOK expected
_phi_               = 'phi'                 # PYCHOK expected
_PLUS_              = '+'                   # PYCHOK expected
_point_             = 'point'               # PYCHOK expected
_points_            = 'points'              # PYCHOK expected
_pole_              = 'pole'                # PYCHOK expected
_prec_              = 'prec'                # PYCHOK expected
_precision_         = 'precision'           # PYCHOK expected
_radians_           = 'radians'             # PYCHOK expected
_radians2_          = 'radians**2'          # PYCHOK expected
_radius_            = 'radius'              # PYCHOK expected
_range_             = 'range'               # PYCHOK expected
_reciprocal_        = 'reciprocal'          # PYCHOK expected
_res_               = 'res'                 # PYCHOK expected
_resolution_        = 'resolution'          # PYCHOK expected
_S_                 = 'S'                   # PYCHOK expected
_scalar_            = 'scalar'              # PYCHOK expected
_scale_             = 'scale'               # PYCHOK expected
_spherical_         = 'spherical'           # PYCHOK expected
_SouthPole_         = 'SouthPole'           # PYCHOK expected
_SPACE_             = ' '                   # PYCHOK expected
_SQUARE_            = '[%s]'                # PYCHOK expected
_STAR_              = '*'                   # PYCHOK expected
_start_             = 'start'               # PYCHOK expected
_start1_            = 'start1'              # PYCHOK expected
_start2_            = 'start2'              # PYCHOK expected
_std_               = 'std'                 # PYCHOK expected
_sumOf_             = 'sumOf'               # PYCHOK expected
_too_distant_       = 'too distant'         # PYCHOK expected
_too_distant_fmt_   = 'too distant (%.3g)'  # PYCHOK expected
_too_few_           = 'too few'             # PYCHOK expected
_too_small_         = 'too small'           # PYCHOK expected
_transform_         = 'transform'           # PYCHOK expected
_UNDERSCORE_        = '_'                   # PYCHOK expected
_units_             = 'units'               # PYCHOK expected
_UPS_               = 'UPS'                 # PYCHOK expected
_utf_8_             = 'utf-8'               # PYCHOK expected
_UTM_               = 'UTM'                 # PYCHOK expected
_valid_             = 'valid'               # PYCHOK expected
_W_                 = 'W'                   # PYCHOK expected
_x_                 = 'x'                   # PYCHOK expected
_y_                 = 'y'                   # PYCHOK expected
_z_                 = 'z'                   # PYCHOK expected
_zone_              = 'zone'                # PYCHOK expected

_COLON_SPACE_       = _COLON_ + _SPACE_     # PYCHOK expected
_COMMA_SPACE_       = _COMMA_ + _SPACE_     # PYCHOK expected
_DUNDER_            = _UNDERSCORE_ * 2      # PYCHOK expected
_EW_                = _E_  + _W_            # PYCHOK common cardinals
_NE_                = _N_  + _E_            # PYCHOK expected
_NS_                = _N_  + _S_            # PYCHOK expected
_NSEW_              = _NS_ + _EW_           # PYCHOK expected
_NW_                = _N_  + _W_            # PYCHOK expected
_SE_                = _S_  + _E_            # PYCHOK expected
_SW_                = _S_  + _W_            # PYCHOK negative ones


class _Missing(object):
    '''(INTERNAL) Singleton.
    '''
    def toRepr(self, **unused):
        return 'MISSING'  # self.__class__.__name__.strip(_UNDERSCORE_),lower()

    __repr__ = toRepr
    __str__  = toRepr
    toStr    = toRepr

_Missing = _Missing()  # PYCHOK singleton


def _dot_(*prefix_names):
    '''(INTERNAL) Period-join C{prefix} and C{name}.
    '''
    return _DOT_.join(prefix_names)


def _dunder_name(inst, *dflt):
    '''(INTERNAL) Get the double_underscore __name__ attr.
    '''
    try:
        return inst.__name__
    except AttributeError:
        pass
    return dflt[0] if dflt else inst.__class__.__name__


def _item_fmt(fmt, name_value_arg, name_value_kwd):
    '''(INTERNAL) Helper for _item_pr, _item_ps and _item_sq.
    '''
    for n_v in name_value_kwd.items():
        break
    else:
        if len(name_value_arg) > 1:
            n_v = name_value_arg[:2]
        elif name_value_arg:
            n_v = name_value_arg, _Missing
        else:
            n_v = _Missing, _Missing
    return fmt % n_v


def _item_cs(*name_value_arg, **name_value_kwd):  # PYCHOK expected
    '''(INTERNAL) Return a named value string.
    '''
    return _item_fmt('%s: %s', name_value_arg, name_value_kwd)


def _item_pr(*name_value_arg, **name_value_kwd):  # PYCHOK expected
    '''(INTERNAL) Return a parenthesized name representation.
    '''
    return _item_fmt('%s(%r)', name_value_arg, name_value_kwd)


def _item_ps(*name_value_arg, **name_value_kwd):  # PYCHOK expected
    '''(INTERNAL) Return a parenthesized name string.
    '''
    return _item_fmt('%s(%s)', name_value_arg, name_value_kwd)


def _item_sq(*name_value_arg, **name_value_kwd):  # PYCHOK expected
    '''(INTERNAL) Return an indexed or keyed name.
    '''
    return _item_fmt('%s[%r]', name_value_arg, name_value_kwd)

# **) MIT License
#
# Copyright (C) 2016-2020 -- mrJean1 at Gmail -- All Rights Reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
