
    <iWU                     >   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZmZ d dlmZ  G d de          Z G d	 d
e          Z G d d          Ze G d de                      Z G d de          Z G d d          ZdS )    N)Counter)	dataclass)
ListUnionTupleOptional
NamedTupleDictAnySequence	GeneratorAnyStr)	BeforeAnyAfterAny)current_timec                   P    e Zd ZU eed<   eed<   defdZededd fd            Z	dS )StreamEntryKeytsseqreturnc                 H    | j          d| j                                         S )N-)r   r   encodeselfs    /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/fakeredis/model/_stream.pyr   zStreamEntryKey.encode   s&    '&&DH&&--///    	entry_keyc                 P   t          | t                    r|                                 n| }|                    d          }t	          |          dk    rt          |d                   dfn)t          |d                   t          |d                   f\  }}t          ||          S )Nr      r   )
isinstancebytesdecodesplitlenintr   )r   entry_key_strparts	timestampsequences        r   	parse_strzStreamEntryKey.parse_str   s    3=i3O3O^Y--///U^##C((69%jjAooU1X 2 2CPUVWPXMM[^_def_g[h[hKiHi222r   N)
__name__
__module____qualname__r&   __annotations__r"   r   staticmethodr   r+    r   r   r   r      sr         GGG	HHH0 0 0 0 0 3V 3(8 3 3 3 \3 3 3r   r   c                   2    e Zd ZU dZeed<   eed<   eed<   dS )PelEntryzFPending Entry List entry: tracks consumer ownership and delivery countconsumer_name	time_readtimes_deliveredN)r,   r-   r.   __doc__r"   r/   r&   r1   r   r   r3   r3      s9         PPNNNr   r3   c                   z    e Zd ZdZdeeeef         defdZ	e
dedefd            Zeddededd fd	            Zd
S )StreamRangeTestz0Argument converter for sorted set LEX endpoints.value	exclusivec                 "    || _         || _        d S Nr:   r;   )r   r:   r;   s      r   __init__zStreamRangeTest.__init__'   s    
"r   r   r   c                 ^    	 t                               |            dS # t          $ r Y dS w xY w)NTF)r   r+   
ValueError)r   s    r   	valid_keyzStreamRangeTest.valid_key+   sB    	$$Y///4 	 	 	55	s    
,,Fc                 6   |dk    r | t                      d          S |dk    r | t                      d          S |d d         dk    r, | t                              |dd                    d          S  | t                              |          |          S )N   -T   +r       ()r   r   r   r+   )clsr:   r;   s      r   r#   zStreamRangeTest.decode3   s    D==3y{{D)))d]]3xzz4(((2A2Y$3~//abb	::DAAAs>++E22I>>>r   NF)r,   r-   r.   r7   r   r   r   r   boolr?   r0   r   rB   classmethodr"   r#   r1   r   r   r9   r9   $   s        ::#eNIx$GH #UY # # # # V     \ ? ?5 ?T ?>O ? ? ? [? ? ?r   r9   c                   x    e Zd ZU eed<   eed<   eed<   eed<   deddfdZdedeee	eef         f         fd	Z
dS )
StreamConsumerInfonamependinglast_attemptlast_successr   Nc                 Z    || _         d| _        t                      }|| _        || _        d S Nr   )rM   rN   r   rO   rP   )r   rM   _times      r   r?   zStreamConsumerInfo.__init__E   s/    	!!r   	curr_timec                 D    | j         | j        || j        z
  || j        z
  dS )N)rM   rN   idleinactive)rM   rN   rO   rP   )r   rT   s     r   infozStreamConsumerInfo.infoL   s1    I| 11!D$55	
 
 	
r   )r,   r-   r.   r"   r/   r&   r?   r
   strr   rX   r1   r   r   rL   rL   >   s         
KKKLLL"U "t " " " "
c 
d3eSj0A+A&B 
 
 
 
 
 
r   rL   c                   n   e Zd Z	 d#dddededee         fdZdedee         d	dfd
Zded	efdZ	ded	efdZ
d	eeeeeef         f                  fdZd	eeef         fdZdedededed	eeeeeeef         f                           f
dZd$dZdee         d	efdZdee         dee         dee         dee         dee         d	eee                  fdZd	ee         fdZdedeee         ee         f         dedee         d ed	eee         ee         f         fd!Zdededed	ee         fd"ZdS )%StreamGroupNstreamXStreamrM   	start_keyentries_readc                 v    || _         || _        || _        || _        i | _        || _        || _        i | _        d S r=   )r\   rM   r^   r_   	consumerslast_delivered_keylast_ack_keypel)r   r\   rM   r^   r_   s        r   r?   zStreamGroup.__init__V   sE     	"(:<"+% 46r   last_delivered_strr   c                 (   | j                             |          | _        | j                             | j                  \  }}|pd| _        | j                             t          ||pdz   t          | j                   dz
                      | _        dS )z#Set last_delivered_id for the groupr   r    N)	r\   parse_ts_seqr^   
find_indexr_   	get_indexminr%   rb   )r   re   r_   start_index_s        r   set_idzStreamGroup.set_idi   s    112DEE;11$.AAa(-A"&+"7"7K<K\[\<]_bcgcn_o_ors_s8t8t"u"ur   r4   c                 J    || j         v rdS t          |          | j         |<   dS Nr   r    )ra   rL   )r   r4   s     r   add_consumerzStreamGroup.add_consumerp   s-    DN**1(:=(I(I}%qr   c                 P    || j         vrdS | j         |         j        }| j         |= |S rR   )ra   rN   )r   r4   ress      r   del_consumerzStreamGroup.del_consumerv   s2    ..1n]+3N=)
r   c                 *      fd j         D             S )Nc                 h    g | ].}j         |                             t                                /S r1   )ra   rX   r   .0kr   s     r   
<listcomp>z.StreamGroup.consumers_info.<locals>.<listcomp>~   s2    OOO1q!&&|~~66OOOr   )ra   r   s   `r   consumers_infozStreamGroup.consumers_info}   s    OOOOOOOOr   c                 *   | j                             | j                  \  }}| j                             | j                  \  }}| j                             | j                  \  }}|| j        pdz   t          | j                   k    r"t          | j                   |z
  | j        pdz
  }nt          | j                   dz
  |z
  }| j        t          | j                  t          | j	                  | j        
                                | j        |d}|S )Nr   r    )s   names	   consumerss   pendings   last-delivered-ids   entries-reads   lag)r\   rh   r^   rb   rc   r_   r%   rM   ra   rd   r   )r   rk   rl   last_delivered_indexlast_ack_indexlagrr   s          r   
group_infozStreamGroup.group_info   s   //??Q"&+"8"89P"Q"Qa K2243DEE$+0q1C4D4DDDdk""[0D4E4JKCCdk""Q&)==CYdn--DH"&"9"@"@"B"B!.
 
 
r   start_idcountnoackc                     t                      }| j        vrt          |           j        |<   | j        |         _        |dk    r j        }n-t          t                              |           j                  } j        	                    ||          }|s|D ]}t          ||d           j        |<   t          |          dk    r>t           j        |d                    _         j        pdt          |          z    _        | j        |         _         j        |         xj        t          |          z  c_         fd|D             S )N   >r    r   c                 D    g | ]}j                             |          S r1   )r\   format_recordrw   xr   s     r   ry   z*StreamGroup.group_read.<locals>.<listcomp>   s)    ???))!,,???r   )r   ra   rL   rO   rb   maxr   r+   r\   stream_readr3   rd   r%   r_   rP   rN   )	r   r4   r   r   r   rS   r^   ids_readrx   s	   `        r   
group_readzStreamGroup.group_read   sL    ..,>},M,MDN=)5:}%2t/IIN44X>>@WXXI;**9e<< 	@ @ @&}eQ??x==1&)$*A8B<&P&PD#!%!2!7a3x== HD5:}%2}%--X>--????h????r   c                     d t          j        | j                                        d           D             }|D ]R}|| j        vrt          |          | j        |<   ||         | j        |         _        ||         | j        |         _        Sd S )Nc                 D    i | ]\  }}|t          |d            j        S )c                     | j         S r=   )r5   r   s    r   <lambda>zAStreamGroup._calc_consumer_last_time.<locals>.<dictcomp>.<lambda>   s    AK r   key)rj   r5   )rw   rx   vs      r   
<dictcomp>z8StreamGroup._calc_consumer_last_time.<locals>.<dictcomp>   sB      
  
  
1 s1//000: 
  
  
r   c                     | j         S r=   )r4   r   s    r   r   z6StreamGroup._calc_consumer_last_time.<locals>.<lambda>   s    1? r   r   )	itertoolsgroupbyrd   valuesra   rL   rO   rP   )r   new_last_success_mapconsumers      r   _calc_consumer_last_timez$StreamGroup._calc_consumer_last_time   s     
  
!)$(//*;*;AZAZ[[[ 
  
  
 - 	S 	SHt~--+=h+G+Gx(4H4RDN8$14H4RDN8$11		S 	Sr   argsc                    d}|D ]q}	 t                               |          }n# t          $ r Y *w xY w|| j        v r:| j        |         j        }| j        |         xj        dz  c_        | j        |= |dz  }r|                                  |S ro   )r   r+   	Exceptionrd   r4   ra   rN   r   )r   r   rr   rx   parsedr4   s         r   ackzStreamGroup.ack   s     		 		A'11!44   !! $ 0 >}-55:55HV$q%%'''
s   #
00rV   startendr   c                 2    t                      t           j                                                  } fd|D             } fd|D             }fd|D             }|t	          |          d |         } fd|D             S )Nc                 @    g | ]}j         |         j        k    |S r1   rd   r4   )rw   rx   r   r   s     r   ry   z'StreamGroup.pending.<locals>.<listcomp>   s-    ]]]!tx{7PT\7\7\A7\7\7\r   c                 F    g | ]}j         |         j        z   k     |S r1   rd   r5   )rw   rx   rS   rV   r   s     r   ry   z'StreamGroup.pending.<locals>.<listcomp>   s2    \\\!tx{7Lt7SV[7[7[A7[7[7[r   c                     g | ]>}j         |k     sj         |k    r&j        sj         |k    sj         |k    5j        <|?S r1   r>   )rw   rx   r   r   s     r   ry   z'StreamGroup.pending.<locals>.<listcomp>   s\       kAoo5;!+;+;EO+;)a--SY!^^CM^	  .<^^r   c                     g | ]M}|                                 j        |         j        j        |         j        z
  j        |         j        gNS r1   )r   rd   r4   r5   r6   )rw   rx   rS   r   s     r   ry   z'StreamGroup.pending.<locals>.<listcomp>   s^     
 
 
 XXZZ!2EDHQK<Q4QSWS[\]S^Sno
 
 
r   )r   listrd   keyssorted)r   rV   r   r   r   r   relevant_idsrS   s   ```` ` @r   rN   zStreamGroup.pending   s     DHMMOO,,]]]]]|]]]L\\\\\\|\\\L    %  L !,//7L
 
 
 
 
!
 
 
 	
r   c                     t           fd j        D                       t           j                  t           j                  dk    r&t           j                                                  nd t           j                  dk    r&t           j                                                  nd fdD             g}|S )Nc                 4    g | ]}j         |         j        S r1   r   rv   s     r   ry   z/StreamGroup.pending_summary.<locals>.<listcomp>   s"    GGG48A;4GGGr   r   c                 $    g | ]}||         gS r1   r1   )rw   icounters     r   ry   z/StreamGroup.pending_summary.<locals>.<listcomp>   s!    ...a_...r   )r   rd   r%   rj   r   r   )r   datar   s   ` @r   pending_summaryzStreamGroup.pending_summary   s    GGGGdhGGGHHMM&)$(mma&7&7CMM  """T&)$(mma&7&7CMM  """T....g...	
 r   min_idle_msmsgsrS   forcec                 L   t                      }||}|| j                            |t          |                    _        g g }}|D ],}		 t          |	t                    rt                              |	          n|	}
n# t          $ r Y Bw xY w|
| j
        vrX|rUt          ||d          | j
        |
<   |
| j        v r|                    |
           n|                    |
           | j
        |
= || j
        |
         j        z
  |k     r| j
        |
         j        }t          |||dz             | j
        |
<   |
| j        v r|                    |
           |                    |
           | j
        |
= .|                                  t#          |          t#          |          fS Nr    )r   ra   getrL   rO   r!   r"   r   r+   r   rd   r3   r\   appendr5   r6   r   r   )r   r   r   r4   rS   r   rT   claimed_msgsdeleted_msgsmsgr   old_times_delivereds               r   claimzStreamGroup.claim   s    !NN	=E\e=*<]*K*KLLY%'l 	" 	"C7A#u7M7MVn..s333SV   $("" *$,]E1$E$EDHSMdk))$++C0000$++C000 HSM48C=22[@@"&(3-"?$]E;NQR;RSSDHSMdk!!##C((((##C(((HSMM%%'''l##VL%9%999s   
1A<<
B	B	c                      t                               |          t                      t           fd j        D                       }t          |t          |                    }|d |         S )Nc                 R    g | ]#}j         |         j        z
  k    |k    !|$S r1   r   )rw   rx   rT   r   r   r^   s     r   ry   z-StreamGroup.read_pel_msgs.<locals>.<listcomp>  s>    tttQy48A;;P/PT_/_/_efjsesesqesesesr   )r   r+   r   r   rd   rj   r%   )r   r   r   r   r   rT   r^   s   ``   @@r   read_pel_msgszStreamGroup.read_pel_msgs  sr    ",,U33	 NN	ttttttt$(tttuuE3t99%%FUF|r   r=   r   N)r,   r-   r.   r"   r   r   r&   r?   rm   rp   rs   r   r
   rY   r   rz   r   r   rI   r   r   r   r   r9   rN   r   r   r   r   r1   r   r   r[   r[   U   s        '+6 66 6 "	6
 sm6 6 6 6&v vhsm vPT v v v v% C    % C    PT#uUCZ/@*@%A B P P P PD,    $@"@.3@<?@HL@	d5UE\ 2234	5@ @ @ @0S S S Se     
sm
 (
 o&	

 }
 5/
 
d5k	
 
 
 
@c    ':': HUOXn%==>': 	':
 }': ': 
tN#T.%99	:': ': ': ':R U 3 4P^K_      r   r[   c            
          e Zd ZdZd2dZdedee         fdZdeded	ee	         ddfd
Z
dede	fdZdeeeef                  fdZdedee         fdZdee         de	fdZd3deeee	f                  dededef         fdZd Zde	fdZdeeeeee         f                  edf         fdZdedeeee         f         fdZde	defdZdedefdZd4dedede e	ef         fdZ!d ede e	ef         fd!Z"e#d"edefd#            Z$	 	 	 d5d$ee	         d%ee         d&ee	         de	fd'Z%d6d)e&d*e&d+edee         fd,Z'defd-Z(d.ed/ee	df         dee         fd0Z)dedeeeeeef         f                  fd1Z*dS )7r]   a  Class representing stream.

    The stream contains entries with keys (timestamp, sequence) and field->value pairs.
    This implementation has them as a sorted list of tuples, the first value in the tuple
    is the key (timestamp, sequence).

    The structure of _values list is:
    [
       ((timestamp, sequence), [field1, value1, field2, value2, ...]),
       ((timestamp, sequence), [field1, value1, field2, value2, ...]),
    ]
    r   Nc                 h    g | _         i | _        i | _        t          dd          | _        d| _        d S rR   )_ids_values_dict_groupsr   _max_deleted_id_entries_addedr   s    r   r?   zXStream.__init__/  s8    *,	?A13-a33r   
group_namec                 8    | j                             |d           S r=   )r   r   r   r   s     r   	group_getzXStream.group_get6  s    |
D111r   rM   start_key_strr_   c                     |dk    r6t          | j                  dk    r| j        d         nt          dd          }nt                              |          }t	          | |||          | j        |<   dS )zAdd a group listening to stream

        :param name: Group name
        :param start_key_str: start_key in `timestamp-sequence` format, or $ listen from last.
        :param entries_read: Number of entries read.
           $r   r   N)r%   r   r   r+   r[   r   )r   rM   r   r_   r^   s        r   	group_addzXStream.group_add9  sq     D  ),TY!););	"PQSTAUAUII&00??I(tYMMTr   c                 ,    || j         v r
| j         |= dS dS )Nr    r   )r   r   s     r   group_deletezXStream.group_deleteF  s#    %%Z(1qr   c                     g }| j                                         D ]+}|                                }|                    |           ,|S r=   )r   r   r   r   )r   rr   group	group_ress       r   groups_infozXStream.groups_infoL  sO    &(\((** 	" 	"E((**IJJy!!!!
r   fullc           	          t           j                  t           j                  t           j                  dk    r                       j        d                   nd t           j                  dk    r                       j        d                   nd  j                                         j        t           j                  dk    r j        d                                         ndd}|r< fd j        D             |d<   d  j                                        D             |d<   t          t          j
        |                                           S )	Nr   r   s   0-0)s   length   groupss   first-entrys
   last-entrys   max-deleted-entry-ids   entries-addeds   recorded-first-entry-idc                 :    g | ]}                     |          S r1   )r   )rw   r   r   s     r   ry   z'XStream.stream_info.<locals>.<listcomp>^  s'    HHHt11!44HHHr   s   entriesc                 6    g | ]}|                                 S r1   )r   )rw   gs     r   ry   z'XStream.stream_info.<locals>.<listcomp>_  s     LLLallnnLLLr   r   )r%   r   r   r   r   r   r   r   r   r   chainitems)r   r   rr   s   `  r   stream_infozXStream.stream_infoS  s9   49~~4<((@CDIQR@R@RD..ty|<<<X\@CDIQR@R@R4--dim<<<X\%)%9%@%@%B%B"1ADTYRSASAS	!(;(;(=(=(=Y_!
 !
  	MHHHHdiHHHC
OLLdl6I6I6K6KLLLC	NIOSYY[[1222r   lstc                     d}|D ]a}|                      |          \  }}|rEt          | j        |         | j                  | _        | j        | j        |         = | j        |= |dz  }b|S )zDelete items from stream

        :param lst: List of IDs to delete, in the form of `timestamp-sequence`.
        :returns: Number of items deleted
        r   r    )find_index_key_as_strr   r   r   r   )r   r   rr   itemindfounds         r   deletezXStream.deleteb  s{      	 	D33D99JC '*49S>4;O'P'P$%din5IcNq
r   *fieldsr   c                 ^   t          |          dz  dk    sJ t          |t                    r|                                }||dk    rt	          dt          j                    z            d}}t          | j                  dk    rS| j        d         j        |k    r=| j        d         j        |k    r'| j        d         j        }| j        d         j        dz   }t          ||          }n|d         dk    r|
                    d          }t          |          dk    rdS t	          |d                   |d         }}t          | j                  dk    r,|| j        d         j        k    r| j        d         j        dz   }nd}t          ||          }nt                              |          }t          | j                  dk    r| j        d         |k    rdS | j                            |           t          |          | j        |<   | xj        dz  c_        |                                S )	a+  Add entry to a stream.

        If the entry_key cannot be added (because its timestamp is before the last entry, etc.),
        nothing is added.

        :param fields: List of fields to add, must [key1, value1, key2, value2, ... ]
        :param entry_key:
            Key for the entry, formatted as 'timestamp-sequence'
            If entry_key is '*', the timestamp will be calculated as current time and the sequence based
            on the last entry key of the stream.
            If entry_key is 'ts-*', and the timestamp is greater or equal than the last entry timestamp,
            then the sequence will be calculated accordingly.
        :returns:
            The key of the added entry.
            None if nothing was added.
        :raises AssertionError: If len(fields) is not even.
           r   Nr   i  r   r    r   )r%   r!   r"   r#   r&   timer   r   r   r   r$   r+   r   r   r   r   r   )r   r   r   r   r   ts_seqr$   s          r   addzXStream.addr  s   $ 6{{Q!####i'' 	+!((**I	S 0 0$,--qB49~~!!dim&6"&<&<2ARVYAYAYYr]%im'!+#B,,FFr]c!!OOC((E5zzQt%(mmU1XB49~~!!bDIbM,<&<&<im'!+#B,,FF#--i88Fty>>A$)B-&"8"84	   $(LL&!q }}r   c                     dS )NTr1   r   s    r   __bool__zXStream.__bool__  s    tr   c                 *    t          | j                  S r=   )r%   r   r   s    r   __len__zXStream.__len__  s    49~~r   c                      dt           t          t          t          t          t                   f                  t          d f         f fd} |            S )Nr   c               3   N   K   j         D ]}                     |           V  d S r=   )r   r   )rx   r   s    r   genzXStream.__iter__.<locals>.gen  s?      Y , ,((++++++, ,r   )r   r   r   r"   r   )r   r   s   ` r   __iter__zXStream.__iter__  sT    	,YtE%e*<$=>TIJ 	, 	, 	, 	, 	, 	, suur   r   c                 L    | j         t                              |                   S r=   )r   r   r+   r   r   s     r   __getitem__zXStream.__getitem__  s     !9!9#!>!>??r   r   c                     | j         |         S r=   )r   )r   r   s     r   ri   zXStream.get_index  s    y~r   c                     || j         v S r=   )r   r   s     r   __contains__zXStream.__contains__  s    d'''r   T	from_leftc                    t          | j                  dk    rdS |rt          j        | j        |          }|}nt          j        | j        |          }|dz
  }||t          | j                  k     o| j        |         |k    fS )a^  Find the closest index to entry_key_str in the stream
        :param entry_key: Key for the entry.
        :param from_left: If not found exact match, return index of last smaller element
        :returns: A tuple
            (index of entry with the closest (from the left) key to entry_key_str,
             whether the entry key is equal)
        r   )r   Fr    )r%   r   bisectbisect_leftbisect_right)r   r   r  r   	check_idxs        r   rh   zXStream.find_index  s     ty>>Q8 	 $TY	::CII%di;;CaIYTY/UDIi4HI4UVVr   r'   c                     |dk    r't          t          | j                  dz
  d          dfS t                              |          }|                     |          S )a,  Find the closest index to entry_key_str in the stream
        :param entry_key_str: key for the entry, formatted as 'timestamp-sequence.'
        :returns: A tuple
            (index of entry with the closest (from the left) key to entry_key_str,
             whether the entry key is equal)
        r   r    r   T)r   r%   r   r   r+   rh   )r   r'   r   s      r   r   zXStream.find_index_key_as_str  sV     D  s49~~)1--t33))-88v&&&r   
ts_seq_strc                 b    | dk    rt          dd          S t                               |           S )Nr   r   )r   r+   )r  s    r   rg   zXStream.parse_ts_seq  s1    !!Q'''''
333r   
max_lengthstart_entry_keylimitc                 V   ||t          d          d}|t          | j                  |z
  }n||                     |          \  }}|}t	          t          |pdd          |pt          j                  }| j        d|         | j        |d         c}| _        |D ]
}	| j        |	= |S )a  Trim a stream

        :param max_length: Max length of the resulting stream after trimming (number of last values to keep)
        :param start_entry_key: Min entry-key to keep, cannot be given together with max_length.
        :param limit: Number of entries to keep from minid.
        :returns: The resulting stream after trimming.
        :raises ValueError: When both max_length and start_entry_key are passed.
        Nz/Can not use both max_length and start_entry_keyr   )	rA   r%   r   r   rj   r   sysmaxsizer   )
r   r
  r  r  	start_indr   exactrr   remove_keysrx   s
             r   trimzXStream.trim  s     !o&ANOOO#'	!DI3II(33ODDJCIs9>1--u/CDD!%4C4$)CDD/TY 	% 	%A!!$$
r   Fr   stopreversec                      d	dt           dt          dt          f fd} ||          } ||d          } fdt          ||          D             }|rt	          t          |                    S |S )
zReturns a range of the stream values from start to stop.

        :param start: Start key
        :param stop: Stop key
        :param reverse: Should the range be in reverse order?
        :returns: The range between start and stop
        Telemr  r   c                     t          | j        t                    rdS t          | j        t                    rt	          j                  S                     | j        |          \  }}|r| j        r	||rdndz  }|S )Nr   r    r   )r!   r:   r   r   r%   r   rh   r;   )r  r  r   r   r   s       r   _find_indexz#XStream.irange.<locals>._find_index  s    $*i00 q$*h// &49~~%Y??JC . .I-qq2-Jr   F)r  c                 P    g | ]"}                     j        |                   #S r1   )r   r   r   s     r   ry   z"XStream.irange.<locals>.<listcomp>  s-    XXX4%%dil33XXXr   T)r9   rI   r&   ranger   reversed)r   r   r  r  r  r  stop_indmatchess   `       r   irangezXStream.irange  s    	 	o 	$ 	# 	 	 	 	 	 	  K&&	;tu555XXXXU9h=W=WXXX 	+))***r   c                     t          | j                  dk    r| j        d                                         nd                                S )Nr   r   z0-0)r%   r   r   r   s    r   last_item_keyzXStream.last_item_key  s9    ),TY!););ty}##%%%Or   r^   r   c                     |                      |          \  }}|r|dz  }|t          |           k    rg S |||z   t          |           k    rt          |           n||z   }| j        ||         S r   )rh   r%   r   )r   r^   r   r  r   end_inds         r   r   zXStream.stream_read  s    ??955	5 	NID		!!I$}	E0ASYY0N0N#d)))T]`eTey7*++r   c                 H    | j         |         }|                                |gS r=   )r   r   )r   r   resultss      r   r   zXStream.format_record  s"    #C(

g&&r   r   )r   r  )NNNrH   )+r,   r-   r.   r7   r?   r"   r   r[   r   r&   r   r   r   r
   r   r   rI   r   r   r   r   r   rY   r   r   r   r   r   r   r   ri   r   r   rh   r   r0   rg   r  r9   r   r"  r   r   r1   r   r   r]   r]   !  s               2E 2h{.C 2 2 2 2Ne NE NRU N[_ N N N Nu     T$ucz"23    3 3c 3 3 3 3$v, 3     . .(5#45 .# .PUVZ\aVaPb . . . .`      )Dud5k/A)B$CS$$NO    @u @~tE{/J)K @ @ @ @S ^    ( (4 ( ( ( (W WN Wt WuUXZ^U^O_ W W W W$
'6 
'eCI>N 
' 
' 
' 
' 4 4N 4 4 4 \4 %))-#	 SM "# }	
 
   : O ? T ^bcf^g    4Pu P P P P,^ ,E#t)<L ,QUVdQe , , , ,' 'Dud5RW<FX?X9Y4Z ' ' ' ' ' 'r   r]   )r  r   r  r   collectionsr   dataclassesr   typingr   r   r   r   r	   r
   r   r   r   r   fakeredis._commandsr   r   fakeredis._helpersr   r   r3   r9   objectrL   r[   r]   r1   r   r   <module>r-     s        



        ! ! ! ! ! ! c c c c c c c c c c c c c c c c c c c c c c c c 3 3 3 3 3 3 3 3 + + + + + +3 3 3 3 3Z 3 3 3    z   ? ? ? ? ? ? ? ?4 
 
 
 
 
 
 
 
,I I I I I& I I IXA' A' A' A' A' A' A' A' A' A'r   