³ò
OÉcIc           @   s}   d  Z  d d k l Z d d k Z d d k Z d d k Z d d k Z d d d „  ƒ  YZ e i e ƒ d d	 d „  ƒ  YZ	 d S(
   s=   Define some lazy data structures and functions acting on themiÿÿÿÿ(   t
   generatorsNt   Iterc           B   s’   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „  d „ Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d d d „ Z RS(   s:   Hold static methods for the manipulation of lazy iteratorsc         c   s+   x$ | D] } |  | ƒ o	 | Vq q Wd S(   s5   Like filter in a lazy functional programming languageN(    (   t	   predicatet   iteratort   i(    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   filter   s      c         c   s    x | D] } |  | ƒ Vq Wd S(   s2   Like map in a lazy functional programming languageN(    (   t   functionR   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   map#   s      c         C   s   x | D] } |  | ƒ q Wd S(   s(   Run function on each element in iteratorN(    (   R   R   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   foreach'   s      c          g   s+   x$ |  D] } x | D] } | Vq Wq Wd S(   s   Lazily concatenate iteratorsN(    (   t   iterst   iterR   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   cat+   s
       c         c   s+   x$ |  D] } x | D] } | Vq Wq Wd S(   s6   Lazily concatenate iterators, iterated by big iteratorN(    (   t   iter_of_itersR
   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   cat20   s
       c         C   s   x |  D]
 } d Sq Wd S(   s   True if iterator has length 0i   N(   t   None(   R
   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   empty5   s      c         C   s
   |  | j S(    (    (   t   xt   y(    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   <lambda>:   s    c         C   sÉ   x |  D]y } y | i  ƒ  } Wn. t j
 o" | o d | f GHn d Sn X| | | ƒ p" | o d | | f GHn d Sq q Wy | i  ƒ  } Wn t j
 o d Sn X| o d | f GHn d S(   sl   True if iterator 1 has same elements as iterator 2

		Use equality operator, or == if it is unspecified.

		s   End when i1 = %ss   %s not equal to %si   s   End when i2 = %sN(   t   nextt   StopIterationR   (   t   iter1t   iter2t   verboset   operatort   i1t   i2(    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   equal:   s&       	   	 c         C   s*   d } x |  D] } | o | Sq q W| S(   s:   True if any element in iterator is true.  Short circuitingN(   R   (   R
   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   OrM   s      c         C   s*   d } x |  D] } | p | Sq q W| S(   s<   True if all elements in iterator are true.  Short circuitingi   (    (   R
   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   AndT   s      c         C   sB   d } x5 y |  i  ƒ  Wn t j
 o | Sn X| d } q	 d S(   s   Return length of iteratori    i   N(   R   R   (   R
   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   len[   s      	c      	   C   sF   y | i  ƒ  } Wn t j
 o | Sn X|  | t i |  | | ƒ ƒ S(   s0   foldr the "fundamental list recursion operator"?(   R   R   R   t   foldr(   t   ft   defaultR
   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyR   c   s
      	c         C   sC   x< y | i  ƒ  } Wn t j
 o | Sn X|  | | ƒ } q d S(   s)   the fundamental list iteration operator..N(   R   R   (   R    R!   R
   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   foldli   s      	c      	      sÚ   ˆ  d j o6 ˆ o. ˆ o& t  ˆ ƒ } | i ƒ  | i ƒ  f Sn ˆ p d „  ‰ n ˆ p d „  ‰ n g  ‰ d g ˆ  ‰ ˆ ‰ d g ‰ ‡  ‡ ‡ ‡ ‡ ‡ ‡ ‡ f d †  ‰ ‡ f d †  } t t | t ˆ  ƒ ƒ ƒ S(   sT  Split a single iterater into a number of streams

		The return val will be a list with length num_of_forks, each
		of which will be an iterator like iter.  final_func is the
		function that will be called on each element in iter just as
		it is being removed from the buffer.  closing_func is called
		when all the streams are finished.

		i   c         S   s   d  S(   N(   R   (   R   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyR   }   s    c           S   s   d  S(   N(   R   (    (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyR   ~   s    iÿÿÿÿc      	      s  ˆ |  d j o y ˆ i  d ˆ i ƒ  ƒ WnG t j
 o; ˆ ˆ j o! ˆ d o ˆ ƒ  d ˆ d <n t ‚ n Xx( t ˆ  ƒ D] } ˆ | c d 7<q‚ Wn ˆ ˆ |  } ˆ |  c d 8<t ˆ ƒ } | d ˆ j o= ˆ |  | d j p t ‚ ˆ ˆ | d ƒ ˆ | d =n | S(   s-   Return the next element requested by fork_numiÿÿÿÿi    i   i   N(   t   insertR   R   R   t   rangeR   t   AssertionError(   t   fork_numR   t
   return_valt   blen(   t   num_of_forkst   closing_funct
   final_funct   buffert   starting_forkpositionR
   t   called_closing_funct   forkposition(    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   get_nextŠ   s(       c         3   s   x ˆ  |  ƒ Vq d  S(   N(    (   R&   (   R0   (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   make_iterator¢   s     N(   t   IterMultiplex2t   yieldat   yieldbR   t   tupleR   R$   (   R
   R)   R+   R*   t   im2R1   (    (	   R)   R*   R+   R,   R-   R
   R0   R.   R/   s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt	   multiplexp   s    
  	$N(   t   __name__t
   __module__t   __doc__R   R   R   R   R   R   R   R   R   R   R   R   R"   R7   (    (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyR      s   											R2   c           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   sð   Multiplex an iterator into 2 parts

	This is a special optimized case of the Iter.multiplex function,
	used when there is no closing_func or final_func, and we only want
	to split it into 2.  By profiling, this is a time sensitive class.

	c         C   s   d |  _  g  |  _ | |  _ d  S(   Ni    (   t   a_leading_byR,   R
   (   t   selfR
   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyt   __init__²   s    		c         c   sm   |  i  |  i } } xS |  i d j o | i ƒ  } | i | ƒ n | i d ƒ } |  i d 7_ | Vq d S(   s   Return first iteratori    i   N(   R,   R
   R;   R   t   appendt   pop(   R<   t   bufR
   t   elem(    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyR3   ·   s    c         c   sm   |  i  |  i } } xS |  i d j o | i ƒ  } | i | ƒ n | i d ƒ } |  i d 8_ | Vq d S(   s   Return second iteratori    i   N(   R,   R
   R;   R   R>   R?   (   R<   R@   R
   RA   (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyR4   Â   s    (   R8   R9   R:   R=   R3   R4   (    (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pyR2   ª   s   		(    (    (
   R:   t
   __future__R    t   ost   statt   typest   staticR   t
   MakeStaticR2   (    (    (    s6   /var/lib/python-support/python2.5/rdiff_backup/lazy.pys   <module>   s   $Œ