from typing import (
    Any,
    Self,
)

import numpy as np

class OpsMixin:
    def __eq__(self, other: object) -> Self: ...  # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-method-override]
    def __ne__(self, other: object) -> Self: ...  # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-method-override]
    def __lt__(self, other: Any) -> Self: ...
    def __le__(self, other: Any) -> Self: ...
    def __gt__(self, other: Any) -> Self: ...
    def __ge__(self, other: Any) -> Self: ...
    # -------------------------------------------------------------
    # Logical Methods
    def __and__(self, other: Any) -> Self: ...
    def __rand__(self, other: Any) -> Self: ...
    def __or__(self, other: Any) -> Self: ...
    def __ror__(self, other: Any) -> Self: ...
    def __xor__(self, other: Any) -> Self: ...
    def __rxor__(self, other: Any) -> Self: ...
    # -------------------------------------------------------------
    # Arithmetic Methods
    def __mod__(self, other: Any) -> Self: ...
    def __rmod__(self, other: Any) -> Self: ...
    def __divmod__(self, other: Any) -> tuple[Self, Self]: ...
    def __rdivmod__(self, other: Any) -> tuple[Self, Self]: ...
    def __pow__(self, other: Any) -> Self: ...
    def __rpow__(self, other: Any) -> Self: ...

# The following unpublished function is added to reduce type checking ignores
def dispatch_ufunc_with_out(
    self: Any, ufunc: np.ufunc, method: str, *inputs: Any, **kwargs: Any
) -> Any: ...

# The following unpublished function is added to reduce type checking ignores
def dispatch_reduction_ufunc(
    self: Any, ufunc: np.ufunc, method: str, *inputs: Any, **kwargs: Any
) -> Any: ...
