"""Module defining Trigger and TriggerQueue class."""
from enum import Enum
from re import Pattern
from typing import TypeVar
from ..tokens.token import Token
Timing = Enum("Timing", "AFTER BEFORE ON_ADD")
_D = TypeVar("_D")
[docs]
class Trigger:
"""Base trigger class."""
def __init__(self, match: Pattern[str], token: Token) -> None:
"""Trigger class.
:param match: Pattern to match before executing.
:param token: Token to execute on match.
"""
self.match = match
self.token = token
def __repr__(self) -> str:
"""Return string representation of this object."""
cls = self.__class__.__name__
return f"<{cls} match=/{self.match.pattern}/ token={self.token}>"
[docs]
class TriggerQueue(dict[Timing, list[Trigger]]):
"""Queue for triggers.
:var triggers: Dictionary where the key is a timing and
the value a list of triggers.
"""
def __init__(self) -> None:
"""Init TriggerQueue."""
self.triggers: dict[Timing, list[Trigger]] = {}
return super().__init__()
[docs]
def add_trigger(self, timing: Timing, trigger: Trigger) -> None:
"""Add a trigger to the queue.
:param timing: Timing of the queue.
:param trigger: Trigger to add.
"""
triggers = self.get(timing, [])
triggers.append(trigger)
self[timing] = triggers
[docs]
def clear_triggers(self, timing: Timing | None = None) -> None:
"""Clear a trigger queue.
:param timing: Timing of a queue to clear or none to clear all.
"""
if timing:
self[timing] = []
else:
self.triggers = {}