
    Dh                        d Z ddlZddlZddlZddlmZ  ej
                  d      Z	 	 ddej                  ej                  edf   ej                  e   f   dej                  e   dej                  ej                     dej                  ej                  e   df   fd	Z	 dd
ej                  e   dedej                   ej                  e   ddf   fdZy)a  
This module provides generator utilities for batching items from
iterables and async iterables.

Functions:
    abatcher(generator, batch_size=None, interval=None):
        Asyncio generator wrapper that returns items with a given batch
        size or interval (whichever is reached first).

    batcher(iterable, batch_size=10):
        Generator wrapper that returns items with a given batch size.
    N)types_T	generator
batch_sizeintervalreturnc           
       K   g }|s	|sJ d       |rt        j                  |      }nd}t        j                         |z   }t	               }	 	 t        j                  |xsP t        j                  t        j                  t        j                  ddt        f   | j                                     g|t
        j                         d{   \  }}|r&|D ]!  }|j                  |j                                # |t#        |      |k(  r| g }|r7|r5t        j                         |kD  r| g }t        j                         |z   }7 # t         $ r
 |r| Y yw xY ww)a8  
    Asyncio generator wrapper that returns items with a given batch size or
    interval (whichever is reached first).

    Args:
        generator: The async generator or iterator to batch.
        batch_size (types.Optional[int], optional): The number of items per
            batch. Defaults to None.
        interval (types.Optional[types.delta_type], optional): The time
            interval to wait before yielding a batch. Defaults to None.

    Yields:
        types.AsyncGenerator[types.List[_T], None]: A generator that yields
        batches of items.
    z*Must specify either batch_size or intervalg    ̲AN)timeoutreturn_when)python_utilsdelta_to_secondstimeperf_countersetasynciowaitcreate_taskr   cast	Coroutiner   	__anext__FIRST_COMPLETEDappendresultStopAsyncIterationlen)	r   r   r   batch
interval_s
next_yieldpendingdoner   s	            y/var/www/fastuser/data/www/generator.snapmosaic.io/flask_app/venv/lib/python3.12/site-packages/python_utils/generators.pyabatcherr"      se    . EO#OO! !228<
 /
))+j8J ,/5G
	"),, ''

!OOD$N;%//1 ##33# MD' " 2FLL12 !c%jJ&>KE$"3"3"5
"BKE **,z9JI $ " 			s>   A
E!A;E E		/E 8AE!	E EE!EE!iterablec              #   x   K   g }| D ](  }|j                  |       t        |      |k(  s#| g }* |r| yyw)ac  
    Generator wrapper that returns items with a given batch size.

    Args:
        iterable (types.Iterable[_T]): The iterable to batch.
        batch_size (int, optional): The number of items per batch. Defaults
            to 10.

    Yields:
        types.Generator[types.List[_T], None, None]: A generator that yields
        batches of items.
    N)r   r   )r#   r   r   items       r!   batcherr&   f   sM       E Tu:#KE	  s   '::)NN)
   )__doc__r   r   r   r   TypeVarr   UnionAsyncGeneratorAsyncIteratorOptionalint
delta_typeListr"   Iterable	Generatorr&        r!   <module>r5      s      U]]4 '+15L:{{RX&B	!L:
 s#L: nnU--.L: %**R.$./L:b nnR  __UZZ^T4/0r4   