o
    Df                     @   s   d Z ddgZddlZddlmZmZmZmZmZ ddl	m	Z	 ddl
mZmZ dd	lmZ dd
lmZ G dd dZG dd deZG dd deZdS )z+
Classes for reading FASTA and FASTQ files
FastaReaderFastqReader    N)UnionBinaryIOOptionalIteratorList)xopen   )
fastq_iterSequence)shorten)FastaFormatErrorc                   @   sz   e Zd ZU dZdZdZeed< dZe	ed< e
dfdee	ef dee fd	d
Zde	fddZdddZdd Zdd ZdS )BinaryFileReaderze
    A mixin for readers that ensures that a file or a path can be passed in to the constructor.
    FpairedrbmodeNfile_close_filec                 C   s@   t |tr||| j| _d| _dS |rd| _|| _dS || _dS )z
        The file is a path or a file-like object. In both cases, the file may
        be compressed (.gz, .bz2, .xz).
        TN)
isinstancestrr   _file_close_on_exit)selfr   openerr    r   V/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/dnaio/readers.py__init__   s   



zBinaryFileReader.__init__returnc                 C   s   d | jjt| jd| jS )Nz{}({!r})name)format	__class____name__getattrr   r   r   r   r   __repr__%   s   zBinaryFileReader.__repr__c                 C   s,   | j r| jd ur| j  d | _d S d S d S N)r   r   closer$   r   r   r   r'   (   s   

zBinaryFileReader.closec                 C   s   | j d u r	td| S )Nz(I/O operation on closed BinaryFileReader)r   
ValueErrorr$   r   r   r   	__enter__-   s   
zBinaryFileReader.__enter__c                 G   s   |    d S r&   )r'   )r   argsr   r   r   __exit__2   s   zBinaryFileReader.__exit__)r   N)r"   
__module____qualname____doc__r   r   bool__annotations__r   r   r	   r   r   r   r   r%   r'   r)   r+   r   r   r   r   r      s   
 $
r   c                       sV   e Zd ZdZdeedfdeeef de	de
e	 f fddZd	ee fd
dZ  ZS )r   z!
    Reader for FASTA files.
    FNr   keep_linebreaksr   c                    s6   t  j|||d || _d| _|rd| _dS d| _dS )z
        file is a path or a file-like object. In both cases, the file may
        be compressed (.gz, .bz2, .xz).

        keep_linebreaks -- whether to keep newline characters in the sequence
        r   r   F
 N)superr   sequence_classdelivers_qualities
_delimiter)r   r   r1   r6   r   r   r!   r   r   r   ;   s   zFastaReader.__init__r   c                 c   s    d}g }t | j}t|D ]I\}}| }|sq|r;|d dkr;|dur2| || j|dV  |dd }g }q|rD|d dkrDq|durN|| qt	d
t||d|duri| || j|dV  |  dS )zI
        Read next entry from the file (single entry at a time).
        Nr   >r
   #z2Expected '>' at beginning of record, but got {!r}.)line)ioTextIOWrapperr   	enumeratestripr6   r8   joinappendr   r    _shortendetach)r   r   seqfir<   r   r   r   __iter__N   s0   zFastaReader.__iter__)r"   r,   r-   r.   r   r	   r   r   r   r/   r   r   r   rH   __classcell__r   r   r9   r   r   6   s    
c                       sV   e Zd ZdZededfdeeef de	de
e f fddZd	ee fd
dZ  ZS )r   zJ
    Reader for FASTQ files. Does not support multi-line FASTQ files.
    i   Nr   buffer_sizer   c                    s   t  j|||d || _d| _|| _t| j| j| j| _zt| j}t	|t
s)J || _W dS  ty@   d| _td| _Y dS  tyK   |    w )zx
        file is a filename or a file-like object.
        If file is a filename, then .gz files are supported.
        r2   TFr   N)r5   r   r6   r7   rJ   _fastq_iterr   _iternextr   r/   Ztwo_headersStopIterationiter	Exceptionr'   )r   r   r6   rJ   r   r   thr9   r   r   r   s   s    
zFastqReader.__init__r   c                 C   s   | j S r&   )rL   r$   r   r   r   rH      s   zFastqReader.__iter__)r"   r,   r-   r.   r   r	   r   r   r   intr   r/   r   r   rH   rI   r   r   r9   r   r   n   s    
)r.   __all__r=   typingr   r   r   r   r   r	   Z_corer   rK   r   Z_utilr   rC   
exceptionsr   r   r   r   r   r   r   r   <module>   s    '8