
    Yj                         d Z ddlmZ ddlmZmZmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZ  ede          Z ed	e
          ZddgZ G d de
eef                   Z G d de
eef                   ZdS )z"Pagination wrapper for Honcho SDK.    )annotations)AsyncIterator	AwaitableCallableIterator)AnyGeneric)	BaseModel)TypeVarT)boundU)defaultSyncPage	AsyncPagec                      e Zd ZdZ	 	 d d!dZd"dZd#dZd$dZed%d            Z	ed&d            Z
ed&d            Zed&d            Zed&d            Zd'dZd(dZdS ))r   z
    Paginated result wrapper that transforms objects from type T to type U.

    Provides iteration and transformation capabilities for paginated API responses.
    Ndatadict[str, Any]	item_typetype[T]transform_funcCallable[[T], U] | None
fetch_next(Callable[[int], 'SyncPage[T, U]'] | NonereturnNonec                    || _         | _        || _        || _        |                    dg           }fd|D             | _        dS )a  
        Initialize the page.

        Args:
            data: Raw paginated response data with items, page, size, total, pages
            item_type: Type to parse items as
            transform_func: Optional function to transform objects from type T to type U.
                            If None, objects are passed through unchanged.
            fetch_next: Optional callback to fetch the next page. Takes page number.
        itemsc                :    g | ]}                     |          S  model_validate.0itemr   s     X/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/honcho/pagination.py
<listcomp>z%SyncPage.__init__.<locals>.<listcomp>0   4     $
 $
 $
/3I$$T**$
 $
 $
    N_data
_item_type_transform_func_fetch_nextget
_raw_itemsselfr   r   r   r   	raw_itemss     `   r&   __init__zSyncPage.__init__   sf    " &*
#,8FEO HHWb))	$
 $
 $
 $
7@$
 $
 $
r)   Iterator[U] | Iterator[T]c              #     K   | }|E|j         D ]%}| j        |                     |          V  !|V  &|                                }|CdS dS )aA  
        Iterate over all transformed items across all pages.

        Warning:
            This iterator automatically fetches ALL subsequent pages as you iterate.
            For large datasets, this may result in many API calls. If you only need
            the current page, use the `items` property instead.
        Nr0   r-   get_next_pager2   pager%   s      r&   __iter__zSyncPage.__iter__4   sz       '+  '3..t444444JJJJ%%''D r)   indexintU | Tc                X    | j         |         }| j        |                     |          S |S z4Get a transformed item by index on the current page.r0   r-   r2   r<   r%   s      r&   __getitem__zSyncPage.__getitem__F   0    u%+''---r)   c                *    t          | j                  S z,Get the number of items on the current page.lenr0   r2   s    r&   __len__zSyncPage.__len__M       4?###r)   list[U] | list[T]c                `      j          fd j        D             S t           j                  S ).Get all transformed items on the current page.Nc                :    g | ]}                     |          S r    r-   r$   r%   r2   s     r&   r'   z"SyncPage.items.<locals>.<listcomp>U   '    KKK4D((..KKKr)   r-   r0   listrI   s   `r&   r   zSyncPage.itemsQ   :     +KKKK4?KKKKDO$$$r)   
int | Nonec                6    | j                             d          S z/Get the total number of items across all pages.totalr+   r/   rI   s    r&   rY   zSyncPage.totalX        z~~g&&&r)   c                6    | j                             d          S zGet the current page number.r:   rZ   rI   s    r&   r:   zSyncPage.page]        z~~f%%%r)   c                6    | j                             d          S zGet the page size.sizerZ   rI   s    r&   ra   zSyncPage.sizeb   r^   r)   c                6    | j                             d          S zGet the total number of pages.pagesrZ   rI   s    r&   rd   zSyncPage.pagesg   r[   r)   boolc                6    | j         }| j        }||dS ||k     S zCheck if there's a next page.NFr:   rd   r2   current_pagetotal_pagess      r&   has_next_pagezSyncPage.has_next_pagel   +    yj;#65k))r)   'SyncPage[T, U] | None'c                    |                                  sdS | j        dS | j        }|dS |                     |dz             S zx
        Fetch the next page of results.

        Returns None if there are no more pages or no fetch callback.
        N   rl   r.   r:   r2   rj   s     r&   r8   zSyncPage.get_next_paget   sV     !!## 	4#4y4q 0111r)   NN)
r   r   r   r   r   r   r   r   r   r   )r   r5   r<   r=   r   r>   r   r=   r   rL   r   rV   r   re   )r   rn   )__name__
__module____qualname____doc__r4   r;   rC   rJ   propertyr   rY   r:   ra   rd   rl   r8   r    r)   r&   r   r      sC         37?C
 
 
 
 
8( ( ( ($   $ $ $ $ % % % X% ' ' ' X' & & & X& & & & X& ' ' ' X'* * * *2 2 2 2 2 2r)   c                      e Zd ZdZ	 	 d d!dZd"dZd#dZd$dZed%d            Z	ed&d            Z
ed&d            Zed&d            Zed&d            Zd'dZd(dZdS ))r   z
    Async paginated result wrapper that transforms objects from type T to type U.

    Provides async iteration and transformation capabilities for paginated API responses.
    Nr   r   r   r   r   r   r   4Callable[[int], Awaitable['AsyncPage[T, U]']] | Noner   r   c                    || _         | _        || _        || _        |                    dg           }fd|D             | _        dS )a  
        Initialize the async page.

        Args:
            data: Raw paginated response data with items, page, size, total, pages
            item_type: Type to parse items as
            transform_func: Optional function to transform objects from type T to type U.
                            If None, objects are passed through unchanged.
            fetch_next: Optional async callback to fetch the next page. Takes page number.
        r   c                :    g | ]}                     |          S r    r!   r#   s     r&   r'   z&AsyncPage.__init__.<locals>.<listcomp>   r(   r)   Nr*   r1   s     `   r&   r4   zAsyncPage.__init__   si    " &*
#,8F 	
 HHWb))	$
 $
 $
 $
7@$
 $
 $
r)   #AsyncIterator[U] | AsyncIterator[T]c                  K   | }|M|j         D ]'}| j        |                     |          W V  "|W V  (|                                 d{V }|KdS dS )aG  
        Async iterate over all transformed items across all pages.

        Warning:
            This iterator automatically fetches ALL subsequent pages as you iterate.
            For large datasets, this may result in many API calls. If you only need
            the current page, use the `items` property instead.
        Nr7   r9   s      r&   	__aiter__zAsyncPage.__aiter__   s       (,  '3..t4444444JJJJJ++--------D r)   r<   r=   r>   c                X    | j         |         }| j        |                     |          S |S r@   rA   rB   s      r&   rC   zAsyncPage.__getitem__   rD   r)   c                *    t          | j                  S rF   rG   rI   s    r&   rJ   zAsyncPage.__len__   rK   r)   rL   c                `      j          fd j        D             S t           j                  S )rN   Nc                :    g | ]}                     |          S r    rP   rQ   s     r&   r'   z#AsyncPage.items.<locals>.<listcomp>   rR   r)   rS   rI   s   `r&   r   zAsyncPage.items   rU   r)   rV   c                6    | j                             d          S rX   rZ   rI   s    r&   rY   zAsyncPage.total   r[   r)   c                6    | j                             d          S r]   rZ   rI   s    r&   r:   zAsyncPage.page   r^   r)   c                6    | j                             d          S r`   rZ   rI   s    r&   ra   zAsyncPage.size   r^   r)   c                6    | j                             d          S rc   rZ   rI   s    r&   rd   zAsyncPage.pages   r[   r)   re   c                6    | j         }| j        }||dS ||k     S rg   rh   ri   s      r&   rl   zAsyncPage.has_next_page   rm   r)   'AsyncPage[T, U] | None'c                   K   |                                  sdS | j        dS | j        }|dS |                     |dz              d{V S rp   rr   rs   s     r&   r8   zAsyncPage.get_next_page   sl       !!## 	4#4y4%%lQ&6777777777r)   rt   )
r   r   r   r   r   r   r   r   r   r   )r   r   ru   rv   rw   rx   ry   )r   r   )rz   r{   r|   r}   r4   r   rC   rJ   r~   r   rY   r:   ra   rd   rl   r8   r    r)   r&   r   r      sC         37KO
 
 
 
 
<. . . .$   $ $ $ $ % % % X% ' ' ' X' & & & X& & & & X& ' ' ' X'* * * *8 8 8 8 8 8r)   N)r}   
__future__r   collections.abcr   r   r   r   typingr   r	   pydanticr
   typing_extensionsr   r   r   __all__r   r   r    r)   r&   <module>r      s0   ( ( " " " " " " H H H H H H H H H H H H               % % % % % %GCy!!!GC{
#r2 r2 r2 r2 r2wq!t} r2 r2 r2jt8 t8 t8 t8 t81 t8 t8 t8 t8 t8r)   