from __future__ import annotations
from typing_extensions import Any, Self
from covsirphy.util.validator import Validator
from covsirphy.util.term import Term
[docs]
class Alias(Term):
    """Remember and parse aliases, just like defaultdict.
    Args:
        target_class: class of targets or None (all objects)
    """
    def __init__(self, target_class: Any = None) -> None:
        self._dict = {}
        self._target_class = target_class or object
[docs]
    @classmethod
    def for_variables(cls) -> Self:
        """Initialize covsirphy.Alias with preset of variable aliases.
        """
        class_obj = cls(target_class=list)
        _dict = {
            "N": [cls.N], "S": [cls.S], "T": [cls.TESTS], "C": [cls.C], "I": [cls.CI], "F": [cls.F], "R": [cls.R],
            "CFR": [cls.C, cls.F, cls.R],
            "CIRF": [cls.C, cls.CI, cls.R, cls.F],
            "SIRF": [cls.S, cls.CI, cls.R, cls.F],
            "CR": [cls.C, cls.R],
        }
        [class_obj.update(name, target) for name, target in _dict.items()]
        return class_obj 
[docs]
    def update(self, name: str, target: Any) -> Self:
        """Update target of the alias.
        Args:
            name: alias name
            targets: target to link with the name
        Return:
            updated Alias instance
        """
        Validator(name, "name", accept_none=False).instance(str)
        self._dict[name] = Validator(target, "target").instance(expected=self._target_class)
        return self 
[docs]
    def find(self, name: str, default: Any = None) -> Any:
        """Find the target of the alias.
        Args:
            name: alias name
            default: default value when not found
        Returns:
            the target or default value
        """
        try:
            return self._dict.get(name, default)
        except TypeError:
            return default 
[docs]
    def all(self) -> dict[str, Any]:
        """List up all targets of aliases.
        Returns:
            all aliases
        """
        return self._dict 
[docs]
    def delete(self, name: str) -> Self:
        """Delete alias.
        Args:
            name: alias name
        Raises:
            KeyError: the alias has not been registered as an alias
        Return:
            updated Alias instance
        """
        try:
            del self._dict[name]
        except KeyError:
            raise KeyError(f"{name} has not been registered as an alias.") from None
        return self