
v^'                 @   s3   d  Z  d d l m Z e Gd d   d   Z d S)z
This module contains a base type which provides list-style mutations
without specific data storage methods.

See also http://static.aryehleib.com/oldsite/MutableLists.html

Author: Aryeh Leib Taurog.
    )total_orderingc                   s  e  Z d  Z d Z d Z d Z   f d d   Z d d   Z d d	   Z d
 d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d%   Z d@ d' d(  Z d) d*   Z d+ d,   Z d d- d. d/  Z d0 d1   Z d2 d3   Z d4 d5   Z d6 d7   Z d8 d9   Z d: d;   Z  d< d=   Z! d> d?   Z"   S)A	ListMixinay  
    A base class which provides complete list interface.
    Derived classes must call ListMixin's __init__() function
    and implement the following:

    function _get_single_external(self, i):
        Return single item with index i for general use.
        The index i will always satisfy 0 <= i < len(self).

    function _get_single_internal(self, i):
        Same as above, but for use within the class [Optional]
        Note that if _get_single_internal and _get_single_internal return
        different types of objects, _set_list must distinguish
        between the two and handle each appropriately.

    function _set_list(self, length, items):
        Recreate the entire object.

        NOTE: items may be a generator which calls _get_single_internal.
        Therefore, it is necessary to cache the values in a temporary:
            temp = list(items)
        before clobbering the original storage.

    function _set_single(self, i, value):
        Set the single item at index i to value [Optional]
        If left undefined, all mutations will result in rebuilding
        the object using _set_list.

    function __len__(self):
        Return the length

    int _minlength:
        The minimum legal length [Optional]

    int _maxlength:
        The maximum legal length [Optional]

    type or tuple _allowed:
        A type or tuple of allowed item types [Optional]
    r   Nc                sY   t  |  d  s |  j |  _ t  |  d  sB |  j |  _ |  j |  _ t   j | |   d  S)N_get_single_internal_set_single)	hasattr_get_single_externalr   _set_single_rebuildr   _assign_extended_slice_rebuild_assign_extended_slicesuper__init__)selfargskwargs)	__class__ F/tmp/pip-build-8lau8j11/django/django/contrib/gis/geos/mutable_list.pyr   >   s    zListMixin.__init__c                s[   t  | t  r;   f d d   t | j t       D S  j |  }   j |  Sd S)z-Get the item(s) at the specified index/slice.c                s   g  |  ] }   j  |   q Sr   )r   ).0i)r   r   r   
<listcomp>K   s   	 z)ListMixin.__getitem__.<locals>.<listcomp>N)
isinstanceslicerangeindiceslen_checkindexr   )r   indexr   )r   r   __getitem__H   s    ,zListMixin.__getitem__c                s   t  | t t f  s% t d |   t   } t  | t  r[  j |  } | g   n t | j |      | t    }    f d d   t |  D }  j | |  d S)z0Delete the item(s) at the specified index/slice.z%s is not a legal indexc             3   s*   |  ]  } |   k r  j  |  Vq d  S)N)r   )r   r   )
indexRanger   r   r   	<genexpr>^   s   z(ListMixin.__delitem__.<locals>.<genexpr>N)	r   intr   	TypeErrorr   r   r   r   _rebuild)r   r   origLennewLennewItemsr   )r   r   r   __delitem__P   s    zListMixin.__delitem__c             C   sU   t  | t  r" |  j | |  n/ |  j |  } |  j | f  |  j | |  d S)z-Set the item(s) at the specified index/slice.N)r   r   
_set_slicer   _check_allowedr   )r   r   valr   r   r   __setitem__d   s
    zListMixin.__setitem__c             C   s   |  j  |  |   S)zadd another list-like object)r   )r   otherr   r   r   __add__n   s    zListMixin.__add__c             C   s   | j  | |    S)zadd to another list-like object)r   )r   r+   r   r   r   __radd__r   s    zListMixin.__radd__c             C   s   |  j  |  |  S)z$add another list-like object to self)extend)r   r+   r   r   r   __iadd__v   s    zListMixin.__iadd__c             C   s   |  j  t |   |  S)multiply)r   list)r   nr   r   r   __mul__{   s    zListMixin.__mul__c             C   s   |  j  t |   |  S)r0   )r   r1   )r   r2   r   r   r   __rmul__   s    zListMixin.__rmul__c             C   sT   | d k r |  d d  =n4 t  |   } x% t | d  D] } |  j |  q9 W|  S)r0   r   N   )r1   r   r.   )r   r2   cacher   r   r   r   __imul__   s    zListMixin.__imul__c             C   sn   t  |  } xO t |  D]A } y |  | | | k } Wn t k
 rO d SYn X| s d Sq Wt  |   | k S)NF)r   r   
IndexError)r   r+   olenr   cr   r   r   __eq__   s    	zListMixin.__eq__c             C   s   t  |  } xg t |  D]Y } y |  | | | k  } Wn t k
 rO d SYn X| rZ | S| | |  | k  r d Sq Wt  |   | k  S)NTF)r   r   r8   )r   r+   r9   r   r:   r   r   r   __lt__   s    	zListMixin.__lt__c             C   s1   d } x$ |  D] } | | k r | d 7} q W| S)zStandard list count methodr   r5   r   )r   r)   countr   r   r   r   r=      s
    zListMixin.countc             C   sH   x1 t  d t |    D] } |  | | k r | Sq Wt d |   d S)zStandard list index methodr   z%s not found in objectN)r   r   
ValueError)r   r)   r   r   r   r   r      s    zListMixin.indexc             C   s   | g |  t  |   d  <d S)zStandard list append methodN)r   )r   r)   r   r   r   append   s    zListMixin.appendc             C   s   | |  t  |   d  <d S)zStandard list extend methodN)r   )r   valsr   r   r   r.      s    zListMixin.extendc             C   s6   t  | t  s t d |   | g |  | |  <d S)zStandard list insert methodz%s is not a legal indexN)r   r    r!   )r   r   r)   r   r   r   insert   s    zListMixin.insertr5   c             C   s   |  | } |  | =| S)zStandard list pop methodr   )r   r   resultr   r   r   pop   s    
zListMixin.popc             C   s   |  |  j  |  =d S)zStandard list remove methodN)r   )r   r)   r   r   r   remove   s    zListMixin.removec             C   s!   |  d d d  |  d d  <d S)zStandard list reverse methodr5   NrE   r   )r   r   r   r   reverse   s    zListMixin.reverseFc             C   s&   t  |  d | d | |  d d  <d S)zStandard list sort methodkeyrF   N)sorted)r   rG   rF   r   r   r   sort   s    zListMixin.sortc             C   sm   | r( | |  j  k  r( t d |  j    |  j d  k	 rY | |  j k rY t d |  j   |  j | |  d  S)NzMust have at least %d itemszCannot have more than %d items)
_minlengthr>   
_maxlengthZ	_set_list)r   r$   r%   r   r   r   r"      s
    zListMixin._rebuildc             C   s'   |  j  t | | d d  | g  d  S)Nr5   )r'   r   )r   r   valuer   r   r   r      s    zListMixin._set_single_rebuildc             C   se   t  |   } d | k o# | k  n r, | S| | k oD d k  n rQ | | St d |   d  S)Nr   zinvalid index: %s)r   r8   )r   r   lengthr   r   r   r      s    zListMixin._checkindexc                s>   t    d  r: d   f d d   | D k r: t d   d  S)N_allowedFc                s"   g  |  ] } t  |   j   q Sr   )r   rN   )r   r)   )r   r   r   r      s   	 z,ListMixin._check_allowed.<locals>.<listcomp>z*Invalid type encountered in the arguments.)r   r!   )r   itemsr   )r   r   r(      s    zListMixin._check_allowedc             C   s   y t  |  } Wn t k
 r0 t d   Yn X|  j |  t |   } | j |  \ } } } | j d k r |  j | | |  n |  j | | | |  d S)z&Assign values to a slice of the objectz&can only assign an iterable to a sliceN)r1   r!   r(   r   r   step_assign_simple_slicer
   )r   r   values	valueListr#   startstoprP   r   r   r   r'      s    zListMixin._set_slicec                s   t  | | |  } t |  t |  k rL t d t |  t |  f   t     t t | |        f d d   }  j   |    d S)z2Assign an extended slice by rebuilding entire listzBattempt to assign sequence of size %d to extended slice of size %dc              3   sA   x: t     D], }  |   k r+  |  Vq  j |   Vq Wd  S)N)r   r   )r   )r$   newValsr   r   r   r%     s    z:ListMixin._assign_extended_slice_rebuild.<locals>.newItemsN)r   r   r>   dictzipr"   )r   rT   rU   rP   rS   	indexListr%   r   )r$   rV   r   r   r	     s    z(ListMixin._assign_extended_slice_rebuildc             C   s   t  | | |  } t |  t |  k rL t d t |  t |  f   x- t | |  D] \ } } |  j | |  q\ Wd S)z9Assign an extended slice by re-assigning individual itemszBattempt to assign sequence of size %d to extended slice of size %dN)r   r   r>   rX   r   )r   rT   rU   rP   rS   rY   r   r)   r   r   r   r
     s    z ListMixin._assign_extended_slicec                sh   t      t         t    }       f d d   }  j | |    d S)z5Assign a simple slice; Can assign slice of any lengthc              3   sf   x_ t    d  D]M }  |   k r,  Ed  H|    k  r |   k  sP |   k r  j |   Vq Wd  S)Nr5   )r   r   )r   )r#   r   rT   rU   rS   r   r   r%   -  s    	z0ListMixin._assign_simple_slice.<locals>.newItemsN)r   maxr"   )r   rT   rU   rS   r$   r%   r   )r#   r   rT   rU   rS   r   rQ   '  s
    	zListMixin._assign_simple_slicerE   )#__name__
__module____qualname____doc__rJ   rK   r   r   r&   r*   r,   r-   r/   r3   r4   r7   r;   r<   r=   r   r?   r.   rA   rC   rD   rF   rI   r"   r   r   r(   r'   r	   r
   rQ   r   r   )r   r   r      s@   )


r   N)r^   	functoolsr   r   r   r   r   r   <module>
   s   