o
    a                     @   s   d dl mZ d dlmZ d dlmZ d dlZd dlZedZ	dd Z
dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd deZG dd deZG d d! d!eZdS )"    timestampNow)DefaultTable)reduceNzfontTools.mergec                    s>   t | } t| }t| t fdd|D sJ d|   S )Nc                 3   s    | ]}| kV  qd S N .0itemfirstr   6/usr/lib/python3/dist-packages/fontTools/merge/util.py	<genexpr>       zequal.<locals>.<genexpr>z"Expected all items to be equal: %s)listiternextall)lsttr   r   r   equal   s
   "r   c                 C   s   t t| S r   )r   r   r   r   r   r   r         r   c                 C   s   t S r   NotImplementedr   r   r   r   recalculate   s   r   c                 C   s   t  S r   r   r   r   r   r   current_time   s   r   c                 C      t tj| S r   )r   operatorand_r   r   r   r   bitwise_and!   r   r    c                 C   r   r   )r   r   or_r   r   r   r   
bitwise_or$   r   r"   c                 C   s   t | } t| t|  S r   )r   sumlenr   r   r   r   avg_int'   s   r%   c                        fdd}|S )zReturns a filter func that when called with a list,
	only calls func on the non-NotImplemented items of the list,
	and only so if there's at least one item remaining.
	Otherwise returns NotImplemented.c                    s   dd | D }|r |S t S )Nc                 S   s   g | ]}|t ur|qS r   r   r   r   r   r   
<listcomp>2   s    z1onlyExisting.<locals>.wrapper.<locals>.<listcomp>r   )r   itemsfuncr   r   wrapper1   s   zonlyExisting.<locals>.wrapperr   )r*   r+   r   r)   r   onlyExisting+   s   r,   c                 C   s   g }| D ]}| | q|S r   )extend)r   lr
   r   r   r   sumLists7      r/   c                 C   s   i }| D ]}| | q|S r   )update)r   dr
   r   r   r   sumDicts=   r0   r3   c                    r&   )Nc                    s   t | } d}td D ];}z| }W n ty1   zd }W n ty.   td| w Y nw d|>  | fdd| D }|||> O }q|S )Nr   size*zDon't know how to merge bit %s   c                 3   s    | ]	}t | @ V  qd S r   )boolr   Z
shiftedBitr   r   r   Q   s    z-mergeBits.<locals>.wrapper.<locals>.<genexpr>)r   rangeKeyError	Exception)r   ZreturnValueZ	bitNumberZ
mergeLogicZmergedValuebitmapr8   r   r+   E   s"   zmergeBits.<locals>.wrapperr   )r=   r+   r   r<   r   	mergeBitsC   s   r>   c                   @       e Zd ZdZdd Zdd ZdS )AttendanceRecordingIdentityDictzVA dictionary-like object that records indices of items actually accessed
	from a list.c                 C   s&   || _ dd t|D | _t | _d S )Nc                 S      i | ]	\}}t ||qS r   idr	   ivr   r   r   
<dictcomp>^       z<AttendanceRecordingIdentityDict.__init__.<locals>.<dictcomp>)r.   	enumerater2   setsselfr   r   r   r   __init__\   s   z(AttendanceRecordingIdentityDict.__init__c                 C   s   | j | jt|  |S r   )rK   addr2   rC   rM   rF   r   r   r   __getitem__a   s   z+AttendanceRecordingIdentityDict.__getitem__N__name__
__module____qualname____doc__rN   rQ   r   r   r   r   r@   X   s    r@   c                   @   r?   )GregariousIdentityDictzoA dictionary-like object that welcomes guests without reservations and
	adds them to the end of the guest list.c                 C   s   || _ tdd |D | _d S )Nc                 s   s    | ]}t |V  qd S r   rB   )r	   rF   r   r   r   r   k   r   z2GregariousIdentityDict.__init__.<locals>.<genexpr>)r.   rJ   rK   rL   r   r   r   rN   i   s   zGregariousIdentityDict.__init__c                 C   s.   t || jvr| jt | | j| |S r   )rC   rK   rO   r.   appendrP   r   r   r   rQ   m   s   z"GregariousIdentityDict.__getitem__NrR   r   r   r   r   rW   e   s    rW   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )NonhashableDictz3A dictionary-like object mapping objects to values.Nc                 C   s:   |d u rdd t |D | _d S dd t||D | _d S )Nc                 S   rA   r   rB   rD   r   r   r   rG   x   rH   z,NonhashableDict.__init__.<locals>.<dictcomp>c                 S   s   i | ]	\}}t ||qS r   rB   )r	   krF   r   r   r   rG   z   rH   )rI   r2   zip)rM   keysvaluesr   r   r   rN   v   s   zNonhashableDict.__init__c                 C   s   | j t| S r   r2   rC   rM   rZ   r   r   r   rQ   |   s   zNonhashableDict.__getitem__c                 C   s   || j t|< d S r   r^   )rM   rZ   rF   r   r   r   __setitem__   s   zNonhashableDict.__setitem__c                 C   s   | j t|= d S r   r^   r_   r   r   r   __delitem__   s   zNonhashableDict.__delitem__r   )rS   rT   rU   rV   rN   rQ   r`   ra   r   r   r   r   rY   s   s    
rY   )ZfontTools.misc.timeToolsr   Z#fontTools.ttLib.tables.DefaultTabler   	functoolsr   r   ZloggingZ	getLoggerlogr   r   r   r   r    r"   r%   r,   r/   r3   r>   objectr@   rW   rY   r   r   r   r   <module>   s(   
