from collections.abc import Callable, Mapping from enum import Enum from typing import Any, Generic, ParamSpec, Self, TypeAlias, overload from typing import Literal as L from typing_extensions import TypeVar __all__ = ["Expr"] ### _Tss = ParamSpec("_Tss") _ExprT = TypeVar("_ExprT", bound=Expr) _ExprT1 = TypeVar("_ExprT1", bound=Expr) _ExprT2 = TypeVar("_ExprT2", bound=Expr) _OpT_co = TypeVar("_OpT_co", bound=Op, default=Op, covariant=True) _LanguageT_co = TypeVar("_LanguageT_co", bound=Language, default=Language, covariant=True) _DataT_co = TypeVar("_DataT_co", default=Any, covariant=True) _LeftT_co = TypeVar("_LeftT_co", default=Any, covariant=True) _RightT_co = TypeVar("_RightT_co", default=Any, covariant=True) _RelCOrPy: TypeAlias = L["==", "!=", "<", "<=", ">", ">="] _RelFortran: TypeAlias = L[".eq.", ".ne.", ".lt.", ".le.", ".gt.", ".ge."] _ToExpr: TypeAlias = Expr | complex | str _ToExprN: TypeAlias = _ToExpr | tuple[_ToExprN, ...] _NestedString: TypeAlias = str | tuple[_NestedString, ...] | list[_NestedString] ### class OpError(Exception): ... class ExprWarning(UserWarning): ... class Language(Enum): Python = 0 Fortran = 1 C = 2 class Op(Enum): INTEGER = 10 REAL = 12 COMPLEX = 15 STRING = 20 ARRAY = 30 SYMBOL = 40 TERNARY = 100 APPLY = 200 INDEXING = 210 CONCAT = 220 RELATIONAL = 300 TERMS = 1_000 FACTORS = 2_000 REF = 3_000 DEREF = 3_001 class RelOp(Enum): EQ = 1 NE = 2 LT = 3 LE = 4 GT = 5 GE = 6 @overload @classmethod def fromstring(cls, s: _RelCOrPy, language: L[Language.C, Language.Python] = ...) -> RelOp: ... @overload @classmethod def fromstring(cls, s: _RelFortran, language: L[Language.Fortran]) -> RelOp: ... # @overload def tostring(self, /, language: L[Language.C, Language.Python] = ...) -> _RelCOrPy: ... @overload def tostring(self, /, language: L[Language.Fortran]) -> _RelFortran: ... class ArithOp(Enum): POS = 1 NEG = 2 ADD = 3 SUB = 4 MUL = 5 DIV = 6 POW = 7 class Precedence(Enum): ATOM = 0 POWER = 1 UNARY = 2 PRODUCT = 3 SUM = 4 LT = 6 EQ = 7 LAND = 11 LOR = 12 TERNARY = 13 ASSIGN = 14 TUPLE = 15 NONE = 100 class Expr(Generic[_OpT_co, _DataT_co]): op: _OpT_co data: _DataT_co @staticmethod def parse(s: str, language: Language = ...) -> Expr: ... # def __init__(self, /, op: Op, data: _DataT_co) -> None: ... # def __lt__(self, other: Expr, /) -> bool: ... def __le__(self, other: Expr, /) -> bool: ... def __gt__(self, other: Expr, /) -> bool: ... def __ge__(self, other: Expr, /) -> bool: ... # def __pos__(self, /) -> Self: ... def __neg__(self, /) -> Expr: ... # def __add__(self, other: Expr, /) -> Expr: ... def __radd__(self, other: Expr, /) -> Expr: ... # def __sub__(self, other: Expr, /) -> Expr: ... def __rsub__(self, other: Expr, /) -> Expr: ... # def __mul__(self, other: Expr, /) -> Expr: ... def __rmul__(self, other: Expr, /) -> Expr: ... # def __pow__(self, other: Expr, /) -> Expr: ... # def __truediv__(self, other: Expr, /) -> Expr: ... def __rtruediv__(self, other: Expr, /) -> Expr: ... # def __floordiv__(self, other: Expr, /) -> Expr: ... def __rfloordiv__(self, other: Expr, /) -> Expr: ... # def __call__( self, /, *args: _ToExprN, **kwargs: _ToExprN, ) -> Expr[L[Op.APPLY], tuple[Self, tuple[Expr, ...], dict[str, Expr]]]: ... # @overload def __getitem__(self, index: _ExprT | tuple[_ExprT], /) -> Expr[L[Op.INDEXING], tuple[Self, _ExprT]]: ... @overload def __getitem__(self, index: _ToExpr | tuple[_ToExpr], /) -> Expr[L[Op.INDEXING], tuple[Self, Expr]]: ... # def substitute(self, /, symbols_map: Mapping[Expr, Expr]) -> Expr: ... # @overload def traverse(self, /, visit: Callable[_Tss, None], *args: _Tss.args, **kwargs: _Tss.kwargs) -> Expr: ... @overload def traverse(self, /, visit: Callable[_Tss, _ExprT], *args: _Tss.args, **kwargs: _Tss.kwargs) -> _ExprT: ... # def contains(self, /, other: Expr) -> bool: ... # def symbols(self, /) -> set[Expr]: ... def polynomial_atoms(self, /) -> set[Expr]: ... # def linear_solve(self, /, symbol: Expr) -> tuple[Expr, Expr]: ... # def tostring(self, /, parent_precedence: Precedence = ..., language: Language = ...) -> str: ... class _Pair(Generic[_LeftT_co, _RightT_co]): left: _LeftT_co right: _RightT_co def __init__(self, /, left: _LeftT_co, right: _RightT_co) -> None: ... # @overload def substitute(self: _Pair[_ExprT1, _ExprT2], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Expr, Expr]: ... @overload def substitute(self: _Pair[_ExprT1, object], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Expr, Any]: ... @overload def substitute(self: _Pair[object, _ExprT2], /, symbols_map: Mapping[Expr, Expr]) -> _Pair[Any, Expr]: ... @overload def substitute(self, /, symbols_map: Mapping[Expr, Expr]) -> _Pair: ... class _FromStringWorker(Generic[_LanguageT_co]): language: _LanguageT_co original: str | None quotes_map: dict[str, str] @overload def __init__(self: _FromStringWorker[L[Language.C]], /, language: L[Language.C] = ...) -> None: ... @overload def __init__(self, /, language: _LanguageT_co) -> None: ... # def finalize_string(self, /, s: str) -> str: ... # def parse(self, /, inp: str) -> Expr | _Pair: ... # @overload def process(self, /, s: str, context: str = "expr") -> Expr | _Pair: ... @overload def process(self, /, s: list[str], context: str = "expr") -> list[Expr | _Pair]: ... @overload def process(self, /, s: tuple[str, ...], context: str = "expr") -> tuple[Expr | _Pair, ...]: ... @overload def process(self, /, s: _NestedString, context: str = "expr") -> Any: ... # noqa: ANN401