o
    .j                     @   s   d Z ddlZddlmZ ddlmZ ddlmZ ddl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 G dd dZG dd dZG dd deZg dZdS )zSeries calculation for alarms.    N)defaultdict)	Generator)rruleset)Alarm)ComponentAdapter)AlarmOccurrence
Occurrence)Series)Time)convert_to_datetimec                	   @   s   e Zd ZdZejjZdd Zde	de
fddZdejde	de
fd	d
Zdededeeddf fddZdejde	de
defddZdefddZdS )AbsoluteAlarmSerieszA series of absolute alarms.c                 C   s   t dd| _tt| _dS )z'Create a new series of absolute alarms.T)cacheN)r   timesr   listtimes2occurenceself r   W/home/thesage/.local/lib/python3.10/site-packages/recurring_ical_events/series/alarm.py__init__   s   
zAbsoluteAlarmSeries.__init__alarmparentc                 C   s@   |j }| ||| t|jD ]}||j7 }| ||| qdS )z.Add an absolute alarm with a parent component.N)TRIGGER_addrangeREPEATDURATION)r   r   r   trigger_r   r   r   add   s   
zAbsoluteAlarmSeries.adddtc                 C   s*   | j | | j| | ||| dS )z Add an alarm at a specific time.N)r   rdater   append
occurrencer   r    r   r   r   r   r   r   %   s   zAbsoluteAlarmSeries._add
span_start	span_stopreturnNc                 c   sX    t || j}t || j}| jj||ddD ]}| j| D ]}|||r(|V  qqdS )wComponents between the start (inclusive) and end (exclusive).

        The result does not need to be ordered.
        T)incN)r   tzinfor   betweenr   
is_in_span)r   r%   r&   span_start_dtspan_stop_dtr    r#   r   r   r   r+   *   s   zAbsoluteAlarmSeries.betweenc                 C   s   t |||S zCreate a new occurrence.)r   r$   r   r   r   r#   8   s   zAbsoluteAlarmSeries.occurrencec                 C   s   | j  S )zWhether this series is empty.)r   r   r   r   r   is_empty>   s   zAbsoluteAlarmSeries.is_empty)__name__
__module____qualname____doc__datetimetimezoneutcr*   r   r   r   r   r   r
   r   r   r+   r#   boolr0   r   r   r   r   r      s.    

r   c                	   @   sp   e Zd ZdZdededdfddZded	edee	ddf fd
dZ
dejdede	de	fddZdefddZdS )AlarmSeriesRelativeToStart8A series of alarms relative to the start of a component.r   seriesr'   Nc                 C   sB   || _ || _|jg| _t|jD ]}| j| jd |j  qdS )zECreate a series of alarms that are relative to the start of a series.N)_alarm_seriesr   _offsetsr   r   r"   r   )r   r   r;   r   r   r   r   r   F   s   
z#AlarmSeriesRelativeToStart.__init__r%   r&   c                 c   s\    | j D ]'}| j|| || D ]}|| jr*| || j|}|||r*|V  qqdS )r(   N)r?   r>   r+   	has_alarmr=   r#   r,   )r   r%   r&   offsetr   r#   r   r   r   r+   N   s   
z"AlarmSeriesRelativeToStart.betweenrA   r   c                 C      t ||j ||S r/   )r   startr   rA   r   r   r   r   r   r#   _      z%AlarmSeriesRelativeToStart.occurrencec                 C   s4   d| j j d| j d| j ddtt| j d	S )zrepr()<z of z in z with offsets z, >)	__class__r1   r=   r>   joinmapstrr?   r   r   r   r   __repr__e   s   z#AlarmSeriesRelativeToStart.__repr__)r1   r2   r3   r4   r   r	   r   r
   r   r   r+   r5   	timedeltar#   rK   rL   r   r   r   r   r9   C   s(    

r9   c                       s<   e Zd ZdZ fddZdejdededefdd	Z	  Z
S )
AlarmSeriesRelativeToEndr:   c                    s   t  |tjdd |S )r(      )seconds)superr+   r5   rM   )r   r%   r&   rH   r   r   r+   q   s   z AlarmSeriesRelativeToEnd.betweenrA   r   r   r'   c                 C   rB   r/   )r   endrD   r   r   r   r#   y   rE   z#AlarmSeriesRelativeToEnd.occurrence)r1   r2   r3   r4   r+   r5   rM   r   r   r#   __classcell__r   r   rR   r   rN   n   s    rN   )r   rN   r9   )r4   r5   collectionsr   typingr   dateutil.rruler   	icalendarr   (recurring_ical_events.adapters.componentr    recurring_ical_events.occurrencer   r   "recurring_ical_events.series.rruler	   recurring_ical_events.typesr
   recurring_ical_events.utilr   r   r9   rN   __all__r   r   r   r   <module>   s    2+