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

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

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

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
_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
_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
_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_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.
