from collections.abc import Generator
from types import EllipsisType
from typing import (
Any,
TypeAlias,
TypeVar,
overload,
)
from numpy import ndarray, dtype, generic
from numpy._typing import DTypeLike, NDArray, _Shape as _AnyShape
__all__ = ["Arrayterator"]
# TODO: Rename to ``_ShapeType``
_Shape = TypeVar("_Shape", bound=_AnyShape)
_DType = TypeVar("_DType", bound=dtype[Any])
_ScalarType = TypeVar("_ScalarType", bound=generic)
_Index: TypeAlias = (
EllipsisType
| int
| slice
| tuple[EllipsisType | int | slice, ...]
)
# NOTE: In reality `Arrayterator` does not actually inherit from `ndarray`,
# but its ``__getattr__` method does wrap around the former and thus has
# access to all its methods
class Arrayterator(ndarray[_Shape, _DType]):
var: ndarray[_Shape, _DType] # type: ignore[assignment]
buf_size: None | int
start: list[int]
stop: list[int]
step: list[int]
@property # type: ignore[misc]
def shape(self) -> tuple[int, ...]: ...
@property
def flat(self: NDArray[_ScalarType]) -> Generator[_ScalarType, None, None]: ...
def __init__(
self, var: ndarray[_Shape, _DType], buf_size: None | int = ...
) -> None: ...
@overload
def __array__(self, dtype: None = ..., copy: None | bool = ...) -> ndarray[_AnyShape, _DType]: ...
@overload
def __array__(self, dtype: DTypeLike, copy: None | bool = ...) -> NDArray[Any]: ...
def __getitem__(self, index: _Index) -> Arrayterator[_AnyShape, _DType]: ...
def __iter__(self) -> Generator[ndarray[_AnyShape, _DType], None, None]: ...