o
    .dk                     @  s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ er@ddlmZ G dd dZdS )zGA wrapper for token iterators that lets us step through and peek ahead.    )annotations)deque)TYPE_CHECKING)Deque)Iterator)LiquidSyntaxError)	TOKEN_EOF)TOKEN_INITIAL)reverse_operators)Tokenc                   @  s   e Zd ZdZd!ddZG dd dZd"d	d
Zd#ddZd$ddZd#ddZ	e
d#ddZd%ddZd&ddZd'ddZd'ddZd S )(TokenStreamz+Step through or iterate a stream of tokens.	tokeniterIterator[Token]c                 C  s&   || _ t | _dtdf| _t|  d S )Nr    )iterr   _pushedr	   currentnext)selfr    r   Q/var/www/Matress/matenv/lib/python3.10/site-packages/liquid/expressions/stream.py__init__   s   zTokenStream.__init__c                   @  s.   e Zd ZdZdddZddd	ZdddZdS )zTokenStream.TokenStreamIteratorzAn iterable token stream.streamr   c                 C  s
   || _ d S N)r   )r   r   r   r   r   r          
z(TokenStream.TokenStreamIterator.__init__returnr   c                 C  s   | S r   r   r   r   r   r   __iter__#   s   z(TokenStream.TokenStreamIterator.__iter__r   c                 C  s0   | j j}|d tu r| j   tt| j  |S N   )r   r   r   closeStopIterationr   r   tokr   r   r   __next__&   s   

z(TokenStream.TokenStreamIterator.__next__N)r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r   r$   r   r   r   r   TokenStreamIterator   s
    

r+   r   c                 C  s
   |  | S r   )r+   r   r   r   r   r   .   r   zTokenStream.__iter__r   c                 C  s^   | j }| jr| j | _ |S | j d tur-z	t| j| _ W |S  ty,   |   Y |S w |S r   )r   r   popleftr   r   r   r!   r    r"   r   r   r   r$   1   s   
zTokenStream.__next__strc                 C  s"   d| j  d| j g}d|S )Nz	current: znext: 
)r   peekjoin)r   bufr   r   r   __str__<   s   


zTokenStream.__str__c                 C  s   t | S )z&Return the next token from the stream.)r   r   r   r   r   
next_tokenC   s   zTokenStream.next_tokenc                 C  s   t | }| j}| | |S )zLook at the next token.)r   r   push)r   r   resultr   r   r   r/   G   s   
zTokenStream.peekr#   Nonec                 C  s   | j | j || _dS )z Push a token back to the stream.N)r   appendr   r"   r   r   r   r4   O   s   
zTokenStream.pushc                 C  s   dt df| _dS )zClose the stream.r   r   N)r   r   r   r   r   r   r    T   s   zTokenStream.closetypc              	   C  L   | j d |kr$tdt||dt| j d | j d | j d ddS )zJRaise a `LiquidSyntaxError` if the current token type doesn't match `typ`.r   	expected , found r   linenumN)r   r   r
   getr   r8   r   r   r   expectX      zTokenStream.expectc              	   C  r9   )zHRaise a `LiquidSyntaxError` if the next token type does not match `typ`.r   r:   r;   r   r<   N)r/   r   r
   r>   r?   r   r   r   expect_peeka   rA   zTokenStream.expect_peekN)r   r   r%   r&   )r   r-   )r#   r   r   r6   )r   r6   )r8   r-   r   r6   )r'   r(   r)   r*   r   r+   r   r$   r2   r3   propertyr/   r4   r    r@   rB   r   r   r   r   r      s    







	r   N)r*   
__future__r   collectionsr   typingr   r   r   liquid.exceptionsr   liquid.tokenr   r	   r
   liquid.expressions.commonr   r   r   r   r   r   <module>   s    