# builtins stub for paramspec-related test cases

import _typeshed
from typing import (
    Sequence, Generic, TypeVar, Iterable, Iterator, Tuple, Mapping, Optional, Union, Type, overload,
    Protocol
)

T = TypeVar("T")
T_co = TypeVar('T_co', covariant=True)
KT = TypeVar("KT")
VT = TypeVar("VT")

class object:
    def __init__(self) -> None: ...

class function: ...
class ellipsis: ...
class classmethod: ...

class type:
    def __init__(self, *a: object) -> None: ...
    def __call__(self, *a: object) -> object: ...

class list(Sequence[T], Generic[T]):
    @overload
    def __getitem__(self, i: int) -> T: ...
    @overload
    def __getitem__(self, s: slice) -> list[T]: ...
    def __contains__(self, item: object) -> bool: ...
    def __iter__(self) -> Iterator[T]: ...

class int:
    def __neg__(self) -> int: ...
    def __add__(self, other: int) -> int: ...

class bool(int): ...
class float: ...
class slice: ...
class str: ...
class bytes: ...

class tuple(Sequence[T_co], Generic[T_co]):
    def __new__(cls: Type[T], iterable: Iterable[T_co] = ...) -> T: ...
    def __iter__(self) -> Iterator[T_co]: ...
    def __contains__(self, item: object) -> bool: ...
    def __getitem__(self, x: int) -> T_co: ...
    def __mul__(self, n: int) -> Tuple[T_co, ...]: ...
    def __rmul__(self, n: int) -> Tuple[T_co, ...]: ...
    def __add__(self, x: Tuple[T_co, ...]) -> Tuple[T_co, ...]: ...
    def __len__(self) -> int: ...
    def count(self, obj: object) -> int: ...

class _ItemsView(Iterable[Tuple[KT, VT]]): ...

class dict(Mapping[KT, VT]):
    @overload
    def __init__(self, **kwargs: VT) -> None: ...
    @overload
    def __init__(self, arg: Iterable[Tuple[KT, VT]], **kwargs: VT) -> None: ...
    def __getitem__(self, key: KT) -> VT: ...
    def __setitem__(self, k: KT, v: VT) -> None: ...
    def __iter__(self) -> Iterator[KT]: ...
    def __contains__(self, item: object) -> int: ...
    def update(self, a: Mapping[KT, VT]) -> None: ...
    @overload
    def get(self, key: KT, default: None = None, /) -> Optional[VT]: ...
    @overload
    def get(self, key: KT, default: VT, /) -> VT: ...
    @overload
    def get(self, key: KT, default: T, /) -> Union[VT, T]: ...
    def __len__(self) -> int: ...
    def pop(self, k: KT) -> VT: ...
    def items(self) -> _ItemsView[KT, VT]: ...

def isinstance(x: object, t: type) -> bool: ...

class _Sized(Protocol):
    def __len__(self) -> int: ...

def len(x: _Sized) -> int: ...
