from abc import abstractmethod
from functools import singledispatchmethod
from typing import Iterable, Iterator, Sequence
from pathex.machines.machine import Machine
__all__ = ['Branches', 'Decomposer', 'DecomposerMatch',
'DecomposerMismatch', 'DecomposerMatchMismatch']
Branches = Iterator[tuple[object, object]]
[docs]class Decomposer(Machine):
def __init_subclass__(cls):
cls._populate_transformer()
@classmethod
def _populate_transformer(cls): ...
def __init__(self, simplifier=None):
if simplifier is None:
from pathex.machines.simplifier import Simplifier
simplifier = Simplifier()
self._simplifier = simplifier
@singledispatchmethod
@abstractmethod
def _transform(self, exp: object) -> Branches: ...
Matches = Iterable[object]
[docs]class DecomposerMatch(Decomposer):
[docs] @abstractmethod
def match(self, value1: object, value2: object) -> Matches: ...
[docs]class DecomposerMismatch(Decomposer):
[docs] @abstractmethod
def mismatch(self, value1: object,
value2: object) -> Sequence[tuple[object, object]]: ...
[docs]class DecomposerMatchMismatch(DecomposerMatch, DecomposerMismatch):
pass