from typing import Union
from Operators import Operator

Term: type = float
Token: type = Union[Operator, Term]


class OperatorExpression:
    def __init__(self, operator: Operator, left, right):
        self.operator = operator
        self.left = left
        self.right = right

    def __repr__(self):
        return f"({self.left} {self.operator} {self.right})"

    def __call__(self) -> Term:
        return self.operator(self.left(), self.right())


class TermExpression:
    def __init__(self, value: Term):
        self.value = value

    def __repr__(self):
        return str(self.value)

    def __call__(self) -> Term:
        return self.value


Expression: type = Union[OperatorExpression, TermExpression]