B
    Sc  ใ               @   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:td|   S )Nc             3   s   | ]}| kV  qd S )Nฉ )ฺ.0ฺitem)ฺfirstr   ๚3lib/python3.7/site-packages/fontTools/merge/util.py๚	<genexpr>   s    zequal.<locals>.<genexpr>z"Expected all items to be equal: %s)ฺlistฺiterฺnextฺallฺAssertionError)ฺlstฺtr   )r   r	   ฺequal   s
    "r   c             C   s   t t| S )N)r   r   )r   r   r   r	   r      s    r   c             C   s   t S )N)ฺNotImplemented)r   r   r   r	   ฺrecalculate   s    r   c             C   s   t  S )N)r   )r   r   r   r	   ฺcurrent_time   s    r   c             C   s   t tj| S )N)r   ฺoperatorฺand_)r   r   r   r	   ฺbitwise_and!   s    r   c             C   s   t tj| S )N)r   r   ฺor_)r   r   r   r	   ฺ
bitwise_or$   s    r   c             C   s   t | } t| t|  S )N)r   ฺsumฺlen)r   r   r   r	   ฺavg_int'   s    r   c                s    fdd}|S )zษReturns 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 k	r|qS r   )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 }x| D ]}|  |ก q
W |S )N)ฺextend)r   ฺlr   r   r   r	   ฺsumLists7   s    
r%   c             C   s    i }x| D ]}|  |ก q
W |S )N)ฺupdate)r   ฺdr   r   r   r	   ฺsumDicts=   s    
r(   c                s    fdd}|S )Nc                s    t | } d}xtd D ]~}y| }W nB tk
rl   yd }W n  tk
rf   td| Y nX Y nX d|>  | fdd| D }|||> O }qW |S )Nr   ฺsizeฺ*zDon't know how to merge bit %s้   c             3   s   | ]}t | @ V  qd S )N)ฺbool)r   r   )ฺ
shiftedBitr   r	   r
   Q   s    z-mergeBits.<locals>.wrapper.<locals>.<genexpr>)r   ฺrangeฺKeyErrorฺ	Exception)r   ZreturnValueZ	bitNumberZ
mergeLogicZmergedValue)ฺbitmap)r-   r	   r!   E   s    zmergeBits.<locals>.wrapperr   )r1   r!   r   )r1   r	   ฺ	mergeBitsC   s    r2   c               @   s    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   s   i | ]\}}|t |qS r   )ฺid)r   ฺiฺvr   r   r	   ๚
<dictcomp>^   s    z<AttendanceRecordingIdentityDict.__init__.<locals>.<dictcomp>)r$   ฺ	enumerater'   ฺsetฺs)ฺselfr   r   r   r	   ฺ__init__\   s    z(AttendanceRecordingIdentityDict.__init__c             C   s   | j  | jt| ก |S )N)r:   ฺaddr'   r4   )r;   r6   r   r   r	   ฺ__getitem__a   s    z+AttendanceRecordingIdentityDict.__getitem__N)ฺ__name__ฺ
__module__ฺ__qualname__ฺ__doc__r<   r>   r   r   r   r	   r3   X   s   r3   c               @   s    e Zd ZdZdd Zdd ZdS )ฺ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 )N)r4   )r   r6   r   r   r	   r
   k   s    z2GregariousIdentityDict.__init__.<locals>.<genexpr>)r$   r9   r:   )r;   r   r   r   r	   r<   i   s    zGregariousIdentityDict.__init__c             C   s.   t || jkr*| j t |ก | j |ก |S )N)r4   r:   r=   r$   ฺappend)r;   r6   r   r   r	   r>   m   s    z"GregariousIdentityDict.__getitem__N)r?   r@   rA   rB   r<   r>   r   r   r   r	   rC   e   s   rC   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   s8   |d krdd t |D | _ndd t||D | _d S )Nc             S   s   i | ]\}}|t |qS r   )r4   )r   r5   r6   r   r   r	   r7   x   s    z,NonhashableDict.__init__.<locals>.<dictcomp>c             S   s   i | ]\}}|t |qS r   )r4   )r   ฺkr6   r   r   r	   r7   z   s    )r8   r'   ฺzip)r;   ฺkeysฺvaluesr   r   r	   r<   v   s    zNonhashableDict.__init__c             C   s   | j t| S )N)r'   r4   )r;   rF   r   r   r	   r>   |   s    zNonhashableDict.__getitem__c             C   s   || j t|< d S )N)r'   r4   )r;   rF   r6   r   r   r	   ฺ__setitem__   s    zNonhashableDict.__setitem__c             C   s   | j t|= d S )N)r'   r4   )r;   rF   r   r   r	   ฺ__delitem__   s    zNonhashableDict.__delitem__)N)r?   r@   rA   rB   r<   r>   rJ   rK   r   r   r   r	   rE   s   s
   
rE   )ZfontTools.misc.timeToolsr   Z#fontTools.ttLib.tables.DefaultTabler   ฺ	functoolsr   r   ZloggingZ	getLoggerฺlogr   r   r   r   r   r   r   r"   r%   r(   r2   ฺobjectr3   rC   rE   r   r   r   r	   ฺ<module>   s&   
