
    c                         d Z ddlmZmZmZmZ ddlmZmZm	Z	 dZ
dedefdZ G d d	e      Z G d
 de      Z G d de      Zy)z/A generic visitor abstract implementation.




    )AnyCallableOptionalUnion)Node
HTMLWriter
TextWriterzrestructuredtext en_returnc                      y)N    )r
   s    8/usr/lib/python3/dist-packages/logilab/common/visitor.py	no_filterr      s        c            	       B    e Zd Zddededee   ddfdZdee   fdZeZ	y)	FilteredIteratorNnode	list_funcfilter_funcr   c                 D    |dfg| _         |t        } |||      | _        y Nr   )_nextr   _list)selfr   r   r   s       r   __init__zFilteredIterator.__init__$   s(    Qi[
#Kt[1
r   c                 X    	 | j                   j                  d      S # t        $ r Y y w xY wr   )r   pop	Exceptionr   s    r   __next__zFilteredIterator.__next__*   s,    	::>>!$$ 		s    	))N)
__name__
__module____qualname__r   r   r   r   r   r!   nextr   r   r   r   r   #   s?    2T 2h 2Xc] 2^b 2(4.  Dr   r   c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)	VisitorNc                      || _         || _        y r"   _iter_classfilter)r   iterator_classr   s      r   r   zVisitor.__init__5   s    )!r   c                 n     | j                   |g|i | | j                  | j                  |            S )z
        launch the visit on a given node

        call 'open_visit' before the beginning of the visit, with extra args
        given
        when all nodes have been visited, call the 'close_visit' method
        )
open_visitclose_visit_visit)r   r   argskargss       r   visitzVisitor.visit9   s6     	-t-u-D 122r   c                     | j                  |      }t        |      }|r|j                  |       }t        |      }|rS r"   )_get_iteratorr&   accept)r   r   iteratornresults        r   r1   zVisitor._visitD   s@    %%d+NXXd^FXA  r   c                 :    | j                  || j                        S r"   r*   )r   r   s     r   r6   zVisitor._get_iteratorL   s    dkk22r   c                      y)z=
        method called at the beginning of the visit
        Nr   )r   r2   r3   s      r   r/   zVisitor.open_visitO   s    r   c                     |S )z7
        method called at the end of the visit
        r   )r   r:   s     r   r0   zVisitor.close_visitT   s	     r   r"   )	r#   r$   r%   r   r4   r1   r6   r/   r0   r   r   r   r(   r(   4   s     "	33
r   r(   c            	       J    e Zd ZdZdefdZdeeef   de	de	de
e	   fdZd Zy	)
VisitedMixInz?
    Visited interface allow node visitors to use the node
    r   c                     	 | j                   j                  dd      S # t        $ r' | j                  j                  j                         cY S w xY w)z
        return the visit name for the mixed class. When calling 'accept', the
        method <'visit_' + name returned by this method> will be called on the
        visitor
        -r
   )TYPEreplacer   	__class__r#   lowerr    s    r   get_visit_namezVisitedMixIn.get_visit_namea   sH    	3 99$$S#.. 	3>>**0022	3s    -AAvisitorr2   kwargsc                 T    t        |d| j                         z        } || g|i |S )Nzvisit_%sgetattrrF   r   rG   r2   rH   funcs        r   r7   zVisitedMixIn.acceptn   s3     w
T-@-@-B BCD*4*6**r   c                 T    t        |d| j                         z        } || g|i |S )Nzleave_%srJ   rL   s        r   leavezVisitedMixIn.leavet   s1    w
T-@-@-B BCD*4*6**r   N)r#   r$   r%   __doc__strrF   r   r   r	   r   r   r7   rO   r   r   r   r?   r?   \   sK    3 3+Z34+=@+LO+	#++r   r?   N)rP   typingr   r   r   r   logilab.common.typesr   r   r	   __docformat__intr   objectr   r(   r?   r   r   r   <module>rW      sU   $ 2 1 = =% # 
v "$f $P+6 +r   