U
     ej"                     @   s  d dl Z d dl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 d dlmZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZmZ dddedeeeef e	e ee	e dddZG dd dZ G dd deZ!G dd deZ"dS )    N)PathLike)BinaryIOIOIterableIteratorListOptionalTupleUnion)xopen   )SequenceRecordrecords_are_mates)FileFormatError)MultipleFileWriter)FastaReaderFastqReader)_open_single_detect_format_from_name)FastaWriterFastqWriterr)
fileformatmode	qualitiesopener)filesr   r   r   c                 G   s   |st d|dkrt dnP|dkr6t|| |dS |dkrn| d krn|D ]"}t|ttjfrJtt|} qJ|dk}| dks|s| d kr|d krt|||d	S t	|||d	S )
NAt least one file is required)r   waz!Mode must be one of 'r', 'w', 'a'r   r   r   r   r   Zfastqr   append)

ValueErrorMultipleFileReader
isinstancestrosr   r   fspathMultipleFastqWriterMultipleFastaWriter)r   r   r   r   r   filer"    r,   0lib/python3.8/site-packages/dnaio/multipleend.py_open_multiple   s    
r.   c                   @   sv   e Zd ZdZdedeeeef e	e dddZ
eddd	Zeeed
f  dddZdd Zdd Zdd ZdS )r$   a  
    Read multiple FASTA/FASTQ files simultaneously. Useful when additional
    FASTQ files with extra information are supplied (UMIs, indices etc.).

    While this class can be instantiated directly, the recommended way is to
    use `dnaio.open` with appropriate arguments.
    Nr    )r   r   c                   sP   t |dk rtd|_t _ fddjD _jd j_d S )Nr   r   c              
      s$   g | ]}j t| d dqS )r   )r   r   r   _stackenter_contextr   .0r+   r   r   selfr,   r-   
<listcomp>;   s   z/MultipleFileReader.__init__.<locals>.<listcomp>r   )lenr#   _files
contextlib	ExitStackr0   _readersZdelivers_qualities)r5   r   r   r   r,   r4   r-   __init__1   s    
zMultipleFileReader.__init__returnc                 C   s&   | j j dddd | jD  dS )N(, c                 s   s   | ]}t |V  qd S Nrepr)r3   readerr,   r,   r-   	<genexpr>E   s     z.MultipleFileReader.__repr__.<locals>.<genexpr>))	__class____name__joinr;   r5   r,   r,   r-   __repr__C   s    $zMultipleFileReader.__repr__.c              	   c   s   t | jdkr$t| jd E dH  nBt| j D ]6}t| s^tdddd |D  ddd	|V  q.| jD ]*}ztt|}W ql t	k
r   Y qlX qld
d | jD }t t
|dkrtdddd | jD  ddd	dS )a  
        Iterate over multiple inputs containing records

        Yields:
            N-tuples of `SequenceRecord` objects where N is equal to the number
            of files.

        Raises:
            `FileFormatError`
                if there was a parse error or if reads are improperly paired,
                that is, if there are more reads in one file than the others or
                if the record IDs do not match (according to
                `records_are_mates`).
        r   r   NzRecords are out of sync, names r@   c                 s   s   | ]}t |jV  qd S rA   )rC   namer3   r   r,   r,   r-   rE   ^   s     z.MultipleFileReader.__iter__.<locals>.<genexpr>z do not match.)linec                 S   s   g | ]
}|j qS r,   )Znumber_of_recordsrM   r,   r,   r-   r6   j   s     z/MultipleFileReader.__iter__.<locals>.<listcomp>zFiles: c                 s   s   | ]}t |V  qd S rA   r&   r2   r,   r,   r-   rE   m   s     z! have an unequal amount of reads.)r7   r8   zipr;   r   r   rI   nextiterStopIterationset)r5   recordsrD   _Zrecord_numbersr,   r,   r-   __iter__I   s(    
zMultipleFileReader.__iter__c                 C   s   | j   d S rA   r0   closerJ   r,   r,   r-   rY   r   s    zMultipleFileReader.closec                 C   s   | S rA   r,   rJ   r,   r,   r-   	__enter__u   s    zMultipleFileReader.__enter__c                 G   s   |    d S rA   rY   r5   excr,   r,   r-   __exit__x   s    zMultipleFileReader.__exit__)rH   
__module____qualname____doc__r   r
   r&   r   r   r   r<   rK   r   r	   r   rW   rY   rZ   r^   r,   r,   r,   r-   r$   (   s   )r$   c                   @   s   e Zd ZdZeddeeeef e	dddZ
eddd	Zd
d ZedddZeeedf  dddZdd Zdd ZdS )r*   
    Write multiple FASTA files simultaneously.

    While this class can be instantiated directly, the recommended way is to
    use `dnaio.open` with appropriate arguments.
    Fr!   r   r"   c                   sX   t |dk rtd|rdnd |_t |_t _ fddjD _d S )Nr   r   r   r   c                    s&   g | ]}j t|d  ddqS )ZfastaF)r   r   r   r   r/   r2   r   r   r5   r,   r-   r6      s   
z0MultipleFastaWriter.__init__.<locals>.<listcomp>r7   r#   r8   _number_of_filesr9   r:   r0   _writersr5   r   r"   r   r,   rd   r-   r<      s    


zMultipleFastaWriter.__init__r=   c                 C   s&   | j j dddd | jD  dS )Nr?   r@   c                 s   s   | ]}t |V  qd S rA   rB   )r3   writerr,   r,   r-   rE      s     z/MultipleFastaWriter.__repr__.<locals>.<genexpr>rF   )rG   rH   rI   rg   rJ   r,   r,   r-   rK      s    $zMultipleFastaWriter.__repr__c                 C   s   | j   d S rA   rX   rJ   r,   r,   r-   rY      s    zMultipleFastaWriter.closerU   c                 G   sB   t || jkrtd| j t|| jD ]\}}|| q*d S Nzrecords must have length )r7   rf   r#   rP   rg   writer5   rU   recordri   r,   r,   r-   rl      s    zMultipleFastaWriter.write.records_iterablec                 C   s   |D ]}| j |  qd S rA   )rl   )r5   rp   rU   r,   r,   r-   write_iterable   s    z"MultipleFastaWriter.write_iterablec                 C   s   | S rA   r,   rJ   r,   r,   r-   rZ      s    zMultipleFastaWriter.__enter__c                 G   s   |    d S rA   r[   r\   r,   r,   r-   r^      s    zMultipleFastaWriter.__exit__NrH   r_   r`   ra   r   r
   r&   r   r   boolr<   rK   rY   r   rl   r   r	   rq   rZ   r^   r,   r,   r,   r-   r*   |   s   
r*   c                   @   s   e Zd ZdZeddeeeef e	dddZ
eddd	Zd
d ZedddZeeedf  dddZdd Zdd ZdS )r)   rb   Fr!   rc   c                   sX   t |dk rtd|rdnd |_t |_t _ fddjD _d S )Nr   r   r   r   c                    s0   g | ](}j t|d s&| d n|qS )rl   b)r0   r1   hasattrr2   rd   r,   r-   r6      s   z0MultipleFastqWriter.__init__.<locals>.<listcomp>re   rh   r,   rd   r-   r<      s    

zMultipleFastqWriter.__init__r=   c                 C   s&   | j j dddd | jD  dS )Nr?   r@   c                 s   s   | ]}t |V  qd S rA   rO   )r3   fr,   r,   r-   rE      s     z/MultipleFastqWriter.__repr__.<locals>.<genexpr>rF   )rG   rH   rI   r8   rJ   r,   r,   r-   rK      s    $zMultipleFastqWriter.__repr__c                 C   s   | j   d S rA   rX   rJ   r,   r,   r-   rY      s    zMultipleFastqWriter.closerj   c                 G   sF   t || jkrtd| j t|| jD ]\}}||  q*d S rk   )r7   rf   r#   rP   rg   rl   fastq_bytesrm   r,   r,   r-   rl      s    zMultipleFastqWriter.write.ro   c                 C   s  | j dkr0| jd }|D ]\}||  qn| j dkrz| jd }| jd }|D ]$\}}||  ||  qRn| j dkr| jd }| jd }| jd }|D ]4\}}}	||  ||  ||	  qn2| j}
|D ]&}t||
D ]\}}||  qqd S )Nr   r         )rf   rg   rl   rw   rP   )r5   rp   outputrn   Zoutput1Zoutput2Zrecord1Zrecord2Zoutput3Zrecord3writersrU   r,   r,   r-   rq      s,    









z"MultipleFastqWriter.write_iterablec                 C   s   | S rA   r,   rJ   r,   r,   r-   rZ      s    zMultipleFastqWriter.__enter__c                 G   s   |    d S rA   r[   r\   r,   r,   r-   r^      s    zMultipleFastqWriter.__exit__Nrr   r,   r,   r,   r-   r)      s   
r)   )#r9   r'   r   typingr   r   r   r   r   r   r	   r
   r   Z_corer   r   
exceptionsr   Z
interfacesr   Zreadersr   r   Z	singleendr   r   r{   r   r   r&   rs   r.   r$   r*   r)   r,   r,   r,   r-   <module>   s.   (T;