from _typeshed import Incomplete
from collections.abc import Generator

def is_iterable(obj) -> bool: ...
def is_scalar(obj) -> bool: ...
def is_collection(obj) -> bool: ...
def split(src, sep: Incomplete | None = None, maxsplit: Incomplete | None = None): ...
def split_iter(
    src, sep: Incomplete | None = None, maxsplit: Incomplete | None = None
) -> Generator[Incomplete, None, Incomplete]: ...
def lstrip(iterable, strip_value: Incomplete | None = None): ...
def lstrip_iter(iterable, strip_value: Incomplete | None = None) -> Generator[Incomplete, None, None]: ...
def rstrip(iterable, strip_value: Incomplete | None = None): ...
def rstrip_iter(iterable, strip_value: Incomplete | None = None) -> Generator[Incomplete, None, None]: ...
def strip(iterable, strip_value: Incomplete | None = None): ...
def strip_iter(iterable, strip_value: Incomplete | None = None): ...
def chunked(src, size, count: Incomplete | None = None, **kw): ...
def chunked_iter(src, size, **kw) -> Generator[Incomplete, None, Incomplete]: ...
def chunk_ranges(
    input_size: int, chunk_size: int, input_offset: int = 0, overlap_size: int = 0, align: bool = False
) -> Generator[tuple[int, int], None, None]: ...
def pairwise(src): ...
def pairwise_iter(src): ...
def windowed(src, size): ...
def windowed_iter(src, size): ...
def xfrange(stop, start: Incomplete | None = None, step: float = 1.0) -> Generator[Incomplete, None, None]: ...
def frange(stop, start: Incomplete | None = None, step: float = 1.0): ...
def backoff(start, stop, count: Incomplete | None = None, factor: float = 2.0, jitter: bool = False): ...
def backoff_iter(
    start, stop, count: Incomplete | None = None, factor: float = 2.0, jitter: bool = False
) -> Generator[Incomplete, None, None]: ...
def bucketize(src, key=..., value_transform: Incomplete | None = None, key_filter: Incomplete | None = None): ...
def partition(src, key=...): ...
def unique(src, key: Incomplete | None = None): ...
def unique_iter(src, key: Incomplete | None = None) -> Generator[Incomplete, None, Incomplete]: ...
def redundant(src, key: Incomplete | None = None, groups: bool = False): ...
def one(src, default: Incomplete | None = None, key: Incomplete | None = None): ...
def first(iterable, default: Incomplete | None = None, key: Incomplete | None = None): ...
def flatten_iter(iterable) -> Generator[Incomplete, None, None]: ...
def flatten(iterable): ...
def same(iterable, ref=...): ...
def default_visit(path, key, value): ...
def default_enter(path, key, value): ...
def default_exit(path, key, old_parent, new_parent, new_items): ...
def remap(root, visit=..., enter=..., exit=..., **kwargs): ...

class PathAccessError(KeyError, IndexError, TypeError):
    exc: Incomplete
    seg: Incomplete
    path: Incomplete
    def __init__(self, exc, seg, path) -> None: ...

def get_path(root, path, default=...): ...
def research(root, query=..., reraise: bool = False): ...

class GUIDerator:
    size: Incomplete
    count: Incomplete
    def __init__(self, size: int = 24) -> None: ...
    pid: Incomplete
    salt: Incomplete
    def reseed(self) -> None: ...
    def __iter__(self): ...
    def __next__(self): ...
    next: Incomplete

class SequentialGUIDerator(GUIDerator):
    start: Incomplete
    def reseed(self) -> None: ...
    def __next__(self): ...
    next: Incomplete

guid_iter: Incomplete
seq_guid_iter: Incomplete

def soft_sorted(
    iterable,
    first: Incomplete | None = None,
    last: Incomplete | None = None,
    key: Incomplete | None = None,
    reverse: bool = False,
): ...
def untyped_sorted(iterable, key: Incomplete | None = None, reverse: bool = False): ...
