import re
from typing import Any, Dict


class AlertMatcher:
    def __init__(self, label: str, value: str) -> None:
        self.label = label
        self.value = value

    def match(self, labels: Dict[str, str]) -> bool:
        return self.label in labels and self.value == labels[self.label]

    def __str__(self) -> str:
        return f"{self.label}={self.value}"

    def __repr__(self) -> str:
        return f"AlertMatcher({self})"

    def __eq__(self, matcher: Any) -> bool:
        return str(self) == str(matcher)


class AlertRegexMatcher(AlertMatcher):
    def __init__(self, label: str, regex: str) -> None:
        super().__init__(label, regex)
        self.regex = re.compile(regex)

    def __str__(self) -> str:
        return f"{self.label}=~{self.value}"

    def __repr__(self) -> str:
        return f"AlertRegexMatcher({self})"

    def match(self, labels: Dict[str, str]) -> bool:
        return self.label in labels and self.regex.match(labels[self.label]) is not None