from typing import *
from _typeshed import Incomplete
from typing import Any

class NO_DATA(Exception): ...

class Condition:
    value: Incomplete
    def __init__(self, value: Optional[Any] = ...) -> None: ...
    def eval(self, data: Any = ...) -> bool: ...
    def __or__(self, other: Condition) -> Or: ...
    def __ror__(self, other: Condition) -> Or: ...
    def __and__(self, other: Condition) -> And: ...
    def __rand__(self, other: Condition) -> And: ...
    def __invert__(self) -> Inverse: ...
    def __bool__(self) -> bool: ...

Always: Incomplete
Never: Incomplete

class Inverse(Condition):
    toInvert: Incomplete
    def __init__(self, toInvert: Condition) -> None: ...
    def eval(self, data: Any = ...) -> bool: ...

class AndOrAbstract(Condition):
    args: Incomplete
    def __init__(self, *args: Condition) -> None: ...
    def eval(self, data: Any = ...) -> bool: ...

class And(AndOrAbstract): ...
class Or(AndOrAbstract): ...
