from pandas import DataFrame as DataFrame, Index as Index, MultiIndex as MultiIndex, Series as Series
from pandas._typing import Axis, FrameOrSeries, Label
from pandas.core.arrays.categorical import factorize_from_iterable as factorize_from_iterable, factorize_from_iterables as factorize_from_iterables
from pandas.core.generic import NDFrame as NDFrame
from pandas.core.indexes.api import all_indexes_same as all_indexes_same, ensure_index as ensure_index, get_consensus_names as get_consensus_names, get_objs_combined_axis as get_objs_combined_axis
from pandas.core.internals import concatenate_block_managers as concatenate_block_managers
from typing import Any, Iterable, Mapping, overload

# For some reason mypy won't read this declaration correctly if we use 2 overloads with union
@overload
def concat(objs: Iterable[DataFrame], axis: Axis = ..., join: str=..., ignore_index: bool=..., keys: Any = ..., levels: Any = ..., names: Any = ..., verify_integrity: bool=..., sort: bool=..., copy: bool=...) -> DataFrame: ...
@overload
def concat(objs: Mapping[Label, DataFrame], axis: Axis = ..., join: str=..., ignore_index: bool=..., keys: Any = ..., levels: Any = ..., names: Any = ..., verify_integrity: bool=..., sort: bool=..., copy: bool=...) -> DataFrame: ...
@overload
def concat(objs: Iterable[Series], axis: Axis = ..., join: str=..., ignore_index: bool=..., keys: Any = ..., levels: Any = ..., names: Any = ..., verify_integrity: bool=..., sort: bool=..., copy: bool=...) -> FrameOrSeries: ...
@overload
def concat(objs: Mapping[Label, Series], axis: Axis = ..., join: str=..., ignore_index: bool=..., keys: Any = ..., levels: Any = ..., names: Any = ..., verify_integrity: bool=..., sort: bool=..., copy: bool=...) -> FrameOrSeries: ...

class _Concatenator:
    intersect: bool = ...
    objs: Any = ...
    axis: Any = ...
    keys: Any = ...
    names: Any = ...
    levels: Any = ...
    sort: Any = ...
    ignore_index: Any = ...
    verify_integrity: Any = ...
    copy: Any = ...
    new_axes: Any = ...
    def __init__(self, objs: Any, axis: Any = ..., join: str=..., keys: Any = ..., levels: Any = ..., names: Any = ..., ignore_index: bool=..., verify_integrity: bool=..., copy: bool=..., sort: Any = ...) -> None: ...
    def get_result(self) -> Any: ...
