ó
Ý²k^c           @  sé   d  Z  d d l m Z d d l m Z d d l m Z m Z y d d l m	 Z	 Wn! e
 k
 rs d d l m	 Z	 n Xd d l Z y# d d l m Z e d d	 ƒ Z Wn e
 k
 r¿ e ƒ  Z n Xd
 g Z d Z d
 e	 f d „  ƒ  YZ d S(   s¿  
The :class:`set` type brings the practical expressiveness of
set theory to Python. It has a very rich API overall, but lacks a
couple of fundamental features. For one, sets are not ordered. On top
of this, sets are not indexable, i.e, ``my_set[8]`` will raise an
:exc:`TypeError`. The :class:`IndexedSet` type remedies both of these
issues without compromising on the excellent complexity
characteristics of Python's built-in set implementation.
iÿÿÿÿ(   t   print_function(   t   bisect_left(   t   chaint   islice(   t
   MutableSetN(   t   make_sentinelt   var_namet   _MISSINGt
   IndexedSeti   c           B  s¿  e  Z d  Z d* d „ Z e d „  ƒ Z d „  Z d „  Z d „  Z	 d* d „ Z
 d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e Z  Z! e Z" Z# e Z$ Z% e Z& Z' d „  Z( d „  Z) d „  Z* d „  Z+ d „  Z, d  „  Z- d! „  Z. d" „  Z/ d* d# „ Z0 d$ „  Z1 d* d% „ Z2 d& „  Z3 d' „  Z4 d( „  Z5 d) „  Z6 RS(+   s   ``IndexedSet`` is a :class:`collections.MutableSet` that maintains
    insertion order and uniqueness of inserted elements. It's a hybrid
    type, mostly like an OrderedSet, but also :class:`list`-like, in
    that it supports indexing and slicing.

    Args:
        other (iterable): An optional iterable used to initialize the set.

    >>> x = IndexedSet(list(range(4)) + list(range(8)))
    >>> x
    IndexedSet([0, 1, 2, 3, 4, 5, 6, 7])
    >>> x - set(range(2))
    IndexedSet([2, 3, 4, 5, 6, 7])
    >>> x[-1]
    7
    >>> fcr = IndexedSet('freecreditreport.com')
    >>> ''.join(fcr[:fcr.index('.')])
    'frecditpo'

    Standard set operators and interoperation with :class:`set` are
    all supported:

    >>> fcr & set('cash4gold.com')
    IndexedSet(['c', 'd', 'o', '.', 'm'])

    As you can see, the ``IndexedSet`` is almost like a ``UniqueList``,
    retaining only one copy of a given value, in the order it was
    first added. For the curious, the reason why IndexedSet does not
    support setting items based on index (i.e, ``__setitem__()``),
    consider the following dilemma::

      my_indexed_set = [A, B, C, D]
      my_indexed_set[2] = A

    At this point, a set requires only one *A*, but a :class:`list` would
    overwrite *C*. Overwriting *C* would change the length of the list,
    meaning that ``my_indexed_set[2]`` would not be *A*, as expected with a
    list, but rather *D*. So, no ``__setitem__()``.

    Otherwise, the API strives to be as complete a union of the
    :class:`list` and :class:`set` APIs as possible.
    c         C  sJ   t  ƒ  |  _ g  |  _ g  |  _ d |  _ d |  _ | rF |  j | ƒ n  d  S(   Ni    (   t   dictt   item_index_mapt	   item_listt   dead_indicest   _compactionst   _c_max_sizet   update(   t   selft   other(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __init__Y   s    				c         C  s   t  |  j ƒ t  |  j ƒ S(   N(   t   lenR   R
   (   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   _dead_index_countc   s    c         C  s—   |  j  s d  S|  j d 7_ |  j } |  j |  j } } t |  j t | ƒ ƒ |  _ x. t |  ƒ D]  \ } } | | | <| | | <q` W| | 3|  j  2d  S(   Ni   (	   R   R   R   R   R
   t   maxR   R   t	   enumerate(   R   t   dead_index_countt   itemst	   index_mapt   it   item(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   _compactg   s    		
c         C  sñ   |  j  } | s d  S|  j |  j } } | s7 | 2| 2n¶ t | ƒ d k rV |  j ƒ  n— |  j t | ƒ t k r| |  j ƒ  nq | d t k rí d } x# | | d t k r· | d 7} q• W| râ | d d t | ƒ k râ | d =n  | | 3n  d  S(   Ni€  iÿÿÿÿi   (   R   R   R
   R   R   R   t   _COMPACTION_FACTORR   (   R   t   dedR   t   ii_mapt   num_dead(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   _cullt   s$    	 
c         C  sn   | d k  r | t  |  ƒ 7} n  |  j s, | S| } x5 |  j D]* \ } } | | k  rX Pn  | | | 7} q< W| S(   Ni    (   R   R   (   R   t   indext
   real_indext   d_startt   d_stop(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   _get_real_indexˆ   s    	c   	      C  sÔ   |  j  } | d  k r" | d } n  | | g } | sE | j | ƒ d  St | | ƒ } | | d } | \ } } | | k o… | k n r— | | d <n9 | | k o® | k n rÀ | | d <n | j | | ƒ d  S(   Ni   i    (   R   t   Nonet   appendR   t   insert(	   R   t   startt   stopt   dintst   cand_intt   int_idxt   dintR$   R%   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt	   _add_dead”   s     	c         C  s   t  |  j ƒ S(   N(   R   R
   (   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __len__ª   s    c         C  s   | |  j  k S(   N(   R
   (   R   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __contains__­   s    c         C  s   d „  |  j  Dƒ S(   Nc         s  s!   |  ] } | t  k	 r | Vq d  S(   N(   R   (   t   .0R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pys	   <genexpr>±   s    (   R   (   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __iter__°   s    c         C  s   |  j  } d „  t | ƒ Dƒ S(   Nc         s  s!   |  ] } | t  k	 r | Vq d  S(   N(   R   (   R3   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pys	   <genexpr>µ   s    (   R   t   reversed(   R   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __reversed__³   s    	c         C  s   d |  j  j t |  ƒ f S(   Ns   %s(%r)(   t	   __class__t   __name__t   list(   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __repr__·   s    c         C  sS   t  | t ƒ r= t |  ƒ t | ƒ k o< t |  ƒ t | ƒ k St |  ƒ t | ƒ k S(   N(   t
   isinstanceR   R   R9   t   set(   R   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __eq__º   s    .c         C  s
   |  | ƒ S(   s2   from_iterable(it) -> create a set from an iterable(    (   t   clst   it(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   from_iterable¿   s    c         C  s<   | |  j  k r8 t |  j ƒ |  j  | <|  j j | ƒ n  d S(   s    add(item) -> add item to the setN(   R
   R   R   R(   (   R   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   addÅ   s    c         C  s^   y |  j  j | ƒ } Wn t k
 r5 t | ƒ ‚ n Xt |  j | <|  j | ƒ |  j ƒ  d S(   s?   remove(item) -> remove item from the set, raises if not presentN(   R
   t   popt   KeyErrorR   R   R0   R!   (   R   R   t   didx(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   removeË   s    c         C  s)   y |  j  | ƒ Wn t k
 r$ n Xd S(   s;   discard(item) -> discard item from the set (does not raise)N(   RE   RC   (   R   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   discardÕ   s    c         C  s   |  j  2|  j 2|  j j ƒ  d S(   s   clear() -> empty the setN(   R   R   R
   t   clear(   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyRG   Ü   s    c         C  s.   |  j  } x | D] } | | k r t Sq Wt S(   s9   isdisjoint(other) -> return True if no overlap with other(   R
   t   Falset   True(   R   R   t   iimt   k(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt
   isdisjointâ   s
    	c         C  sD   t  | ƒ t  |  ƒ k  r t Sx! |  j D] } | | k r& t Sq& Wt S(   s9   issubset(other) -> return True if other contains this set(   R   RH   R
   RI   (   R   R   RK   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   issubsetê   s    c         C  sJ   t  | ƒ t  |  ƒ k r t S|  j } x | D] } | | k r, t Sq, Wt S(   s6   issuperset(other) -> return True if set contains other(   R   RH   R
   RI   (   R   R   RJ   RK   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt
   issupersetó   s    	c         G  s   |  j  t |  | Œ ƒ S(   sA   union(*others) -> return a new set containing this set and others(   R@   R   (   R   t   others(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   unioný   s    c         g  s;   x4 |  D], } x# | D] } | | k r Pq q W| Vq Wd S(   sB   iter_intersection(*others) -> iterate over elements also in othersN(    (   R   RO   RK   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   iter_intersection  s    	c           sO   t  | ƒ d k r9 | d ‰  |  j ‡  f d †  |  Dƒ ƒ S|  j |  j | Œ  ƒ S(   sB   intersection(*others) -> get a set with overlap of this and othersi   i    c         3  s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   R3   RK   (   R   (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pys	   <genexpr>  s    (   R   R@   RQ   (   R   RO   (    (   R   s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   intersection  s    
c         g  s;   x4 |  D], } x# | D] } | | k r Pq q W| Vq Wd S(   s?   iter_difference(*others) -> iterate over elements not in othersN(    (   R   RO   RK   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   iter_difference  s    	c           sO   t  | ƒ d k r9 | d ‰  |  j ‡  f d †  |  Dƒ ƒ S|  j |  j | Œ  ƒ S(   s@   difference(*others) -> get a new set with elements not in othersi   i    c         3  s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   R3   RK   (   R   (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pys	   <genexpr>   s    (   R   R@   RS   (   R   RO   (    (   R   s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt
   difference  s    
c         G  s%   |  j  | Œ  } | j |  j | Œ  ƒ S(   s;   symmetric_difference(*others) -> XOR set of this and others(   RP   RT   RR   (   R   RO   t   ret(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   symmetric_difference#  s    c         G  sW   | s
 d St  | ƒ d k r) | d } n t | ƒ } x | D] } |  j | ƒ q< Wd S(   s8   update(*others) -> add values from one or more iterablesNi   i    (   R   R   RA   (   R   RO   R   t   o(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyR   .  s    c         G  s+   x$ |  j  | Œ  D] } |  j | ƒ q Wd S(   s@   intersection_update(*others) -> discard self.difference(*others)N(   RT   RF   (   R   RO   t   val(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   intersection_update9  s    c         G  sD   |  | k r |  j  ƒ  n  x$ |  j | Œ  D] } |  j | ƒ q) Wd S(   s@   difference_update(*others) -> discard self.intersection(*others)N(   RG   RR   RF   (   R   RO   RX   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   difference_update>  s    c         C  sW   |  | k r |  j  ƒ  n  x7 | D]/ } | |  k rB |  j | ƒ q  |  j | ƒ q  Wd S(   s=   symmetric_difference_update(other) -> in-place XOR with otherN(   RG   RF   RA   (   R   R   RX   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   symmetric_difference_updateE  s    c         G  s   |  j  | Œ  |  S(   N(   R   (   R   RO   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __ior__O  s    c         G  s   |  j  | Œ  |  S(   N(   RY   (   R   RO   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __iand__S  s    c         G  s   |  j  | Œ  |  S(   N(   RZ   (   R   RO   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __isub__W  s    c         G  s   |  j  | Œ  |  S(   N(   R[   (   R   RO   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __ixor__[  s    c         C  sƒ   |  } | d k	 r$ |  j | ƒ } n  | d k	 rB |  j | ƒ } n  | d k	 rp | d k  rp | } t |  ƒ } n  t | | | | ƒ S(   s   iterate over a slice of the seti    N(   R'   R&   R5   R   (   R   R*   R+   t   stept   iterable(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt
   iter_slice_  s    c         C  sÉ   y! | j  | j | j } } } Wn  t k
 rC t j | ƒ } n# X|  j | | | ƒ } |  j | ƒ S| d k  r… | t |  ƒ 7} n  |  j	 | ƒ } y |  j
 | } Wn t k
 rÄ t d ƒ ‚ n X| S(   Ni    s   IndexedSet index out of range(   R*   R+   R`   t   AttributeErrort   operatorR"   Rb   R@   R   R&   R   t
   IndexError(   R   R"   R*   R+   R`   Rb   R#   RU   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   __getitem__l  s    !c         C  s¡   |  j  } t | ƒ } | d k s= | d k s= | | d k rV |  j j ƒ  } | | =n= |  j | ƒ } |  j | } t |  j | <| | =|  j | ƒ |  j ƒ  | S(   s>   pop(index) -> remove the item at a given index (-1 by default)iÿÿÿÿi   N(	   R
   R   R'   R   RB   R&   R   R0   R!   (   R   R"   R
   t   len_selfRU   R#   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyRB   }  s    	(

c         C  s   | |  j  k r d Sd S(   s9   count(val) -> count number of instances of value (0 or 1)i   i    (   R
   (   R   RX   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   count  s    c         C  sT   t  t |  ƒ ƒ } | |  j (x* t |  j ƒ D] \ } } | |  j | <q, W|  j 2d S(   s5   reverse() -> reverse the contents of the set in-placeN(   R9   R5   R   R   R
   R   (   R   t   reversed_listR   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   reverse“  s
    
c         C  sa   t  |  ƒ } | |  j k r d S| |  j (x* t |  j ƒ D] \ } } | |  j | <q9 W|  j 2d S(   s/   sort() -> sort the contents of the set in-placeN(   t   sortedR   R   R
   R   (   R   t   sorted_listR   R   (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   sort›  s    
c         C  sI   y |  j  | SWn3 t k
 rD |  j j } t d | | f ƒ ‚ n Xd S(   s=   index(val) -> get the index of a value, raises if not presents   %r is not in %sN(   R
   RC   R7   R8   t
   ValueError(   R   RX   t   cn(    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyR"   ¥  s
    N(7   R8   t
   __module__t   __doc__R'   R   t   propertyR   R   R!   R&   R0   R1   R2   R4   R6   R:   R=   t   classmethodR@   RA   RE   RF   RG   RL   RM   RN   RP   RQ   RR   RS   RT   RV   t   __or__t   __ror__t   __and__t   __rand__t   __sub__t   __rsub__t   __xor__t   __rxor__R   RY   RZ   R[   R\   R]   R^   R_   Rb   Rf   RB   Rh   Rj   Rm   R"   (    (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyR   .   s\   *
											
						
		
		
		



				
								
(   Rq   t
   __future__R    t   bisectR   t	   itertoolsR   R   t   collections.abcR   t   ImportErrort   collectionsRd   t	   typeutilsR   R   t   objectt   __all__R   R   (    (    (    s=   lib/python2.7/site-packages/conda/_vendor/boltons/setutils.pyt   <module>   s    	
