o
    êi\                     @   s4   d Z ddlmZmZ G dd dZG dd dZdS )z0Audio stream wrappers with collection utilities.    )AsyncIteratorIteratorc                   @   B   e Zd ZdZdee fddZdee fddZdefdd	Zd
S )AudioStreama4  Wrapper for sync audio byte streams with collection utilities.

    This class wraps an iterator of audio bytes and provides a convenient
    `.collect()` method to gather all chunks into a single bytes object.

    Examples:
        ```python
        from fishaudio import FishAudio

        client = FishAudio(api_key="...")

        # Collect all audio at once
        audio = client.tts.stream(text="Hello!").collect()

        # Or stream chunks manually
        for chunk in client.tts.stream(text="Hello!"):
            process_chunk(chunk)
        ```
    iteratorc                 C   
   || _ dS )z{Initialize the audio iterator wrapper.

        Args:
            iterator: The underlying iterator of audio bytes
        N_iter)selfr    r   L/home/ubuntu/.local/lib/python3.10/site-packages/fishaudio/core/iterators.py__init__      
zAudioStream.__init__returnc                 C      | j S )z)Allow direct iteration over audio chunks.r   r
   r   r   r   __iter__#      zAudioStream.__iter__c                 C   s$   g }| j D ]}|| qd|S )a  Collect all audio chunks into a single bytes object.

        This consumes the iterator and returns all audio data as bytes.
        After calling this method, the iterator cannot be used again.

        Returns:
            Complete audio data as bytes

        Examples:
            ```python
            audio = client.tts.stream(text="Hello!").collect()
            with open("output.mp3", "wb") as f:
                f.write(audio)
            ```
            r	   appendjoinr
   chunkschunkr   r   r   collect'   s   

zAudioStream.collectN)	__name__
__module____qualname____doc__r   bytesr   r   r   r   r   r   r   r      s
    r   c                   @   r   )AsyncAudioStreama{  Wrapper for async audio byte streams with collection utilities.

    This class wraps an async iterator of audio bytes and provides a convenient
    `.collect()` method to gather all chunks into a single bytes object.

    Examples:
        ```python
        from fishaudio import AsyncFishAudio

        client = AsyncFishAudio(api_key="...")

        # Collect all audio at once
        stream = await client.tts.stream(text="Hello!")
        audio = await stream.collect()

        # Or stream chunks manually
        async for chunk in await client.tts.stream(text="Hello!"):
            await process_chunk(chunk)
        ```
    async_iteratorc                 C   r   )zInitialize the async audio iterator wrapper.

        Args:
            async_iterator: The underlying async iterator of audio bytes
        Nr   )r
   r"   r   r   r   r   S   r   zAsyncAudioStream.__init__r   c                 C   r   )z/Allow direct async iteration over audio chunks.r   r   r   r   r   	__aiter__[   r   zAsyncAudioStream.__aiter__c                    s0   g }| j 2 z3 dH W }|| q6 d|S )a  Collect all audio chunks into a single bytes object.

        This consumes the async iterator and returns all audio data as bytes.
        After calling this method, the iterator cannot be used again.

        Returns:
            Complete audio data as bytes

        Examples:
            ```python
            stream = await client.tts.stream(text="Hello!")
            audio = await stream.collect()
            with open("output.mp3", "wb") as f:
                f.write(audio)
            ```
        Nr   r   r   r   r   r   r   _   s   
zAsyncAudioStream.collectN)	r   r   r   r   r   r    r   r#   r   r   r   r   r   r!   =   s
    r!   N)r   typingr   r   r   r!   r   r   r   r   <module>   s    7