





from typing import List, Optional, TypeVar

from .arrow_dataset import Dataset, _concatenate_map_style_datasets, _interleave_map_style_datasets
from .dataset_dict import DatasetDict, IterableDatasetDict
from .info import DatasetInfo
from .iterable_dataset import IterableDataset, _concatenate_iterable_datasets, _interleave_iterable_datasets
from .splits import NamedSplit
from .utils import logging
from .utils.py_utils import Literal


a__:      Tuple									=		logging.get_logger(__name__)


a__:      List[Any]									=		TypeVar('DatasetType', Dataset, IterableDataset)


def 	UpperCamelCase__(       UpperCamelCase__			:       List[DatasetType] ,     UpperCamelCase__			:       Optional[List[float]] = None ,     UpperCamelCase__			:       Optional[int] = None ,     UpperCamelCase__			:       Optional[DatasetInfo] = None ,     UpperCamelCase__			:       Optional[NamedSplit] = None ,     UpperCamelCase__			:       Literal["first_exhausted", "all_exhausted"] = "first_exhausted" ,     )->DatasetType:
       from .arrow_dataset import Dataset
       from .iterable_dataset import IterableDataset

       if not datasets:
              raise ValueError('''Unable to interleave an empty list of datasets.'''  )
       for i, dataset in enumerate(UpperCamelCase__  ):
              if not isinstance(UpperCamelCase__ ,     (Dataset, IterableDataset)  ):
                     if isinstance(UpperCamelCase__ ,     (DatasetDict, IterableDatasetDict)  ):
                            if not dataset:
                                   raise ValueError(
                                       f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} "
                                       '''is an empty dataset dictionary.'''  )
                            raise ValueError(
                                f"Dataset at position {i} has at least one split: {list(UpperCamelCase__  )}\n"
                                f"Please pick one to interleave with the other datasets, for example: dataset['{next(iter(UpperCamelCase__  )  )}']"  )
                     raise ValueError(
                         f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} is a {type(UpperCamelCase__  ).__name__}."  )
              if i == 0:
                     A__					,	A__											=						(
                         (Dataset, IterableDataset) if isinstance(UpperCamelCase__ ,     UpperCamelCase__  ) else (IterableDataset, Dataset)
                     )
              elif not isinstance(UpperCamelCase__ ,     UpperCamelCase__  ):
                     raise ValueError(
                         f"Unable to interleave a {dataset_type.__name__} (at position 0) with a {other_type.__name__} (at position {i}). Expected a list of Dataset objects or a list of IterableDataset objects."  )
       if stopping_strategy not in ["first_exhausted", "all_exhausted"]:
              raise ValueError(f"{stopping_strategy} is not supported. Please enter a valid stopping_strategy."  )
       if dataset_type is Dataset:
              return _interleave_map_style_datasets(
                  UpperCamelCase__ ,     UpperCamelCase__ ,     UpperCamelCase__ ,     info=UpperCamelCase__ ,     split=UpperCamelCase__ ,     stopping_strategy=UpperCamelCase__  )
       else:
              return _interleave_iterable_datasets(
                  UpperCamelCase__ ,     UpperCamelCase__ ,     UpperCamelCase__ ,     info=UpperCamelCase__ ,     split=UpperCamelCase__ ,     stopping_strategy=UpperCamelCase__  )


def 	UpperCamelCase__(       UpperCamelCase__			:       List[DatasetType] ,     UpperCamelCase__			:       Optional[DatasetInfo] = None ,     UpperCamelCase__			:       Optional[NamedSplit] = None ,     UpperCamelCase__			:       int = 0 ,     )->DatasetType:

       if not dsets:
              raise ValueError('''Unable to concatenate an empty list of datasets.'''  )
       for i, dataset in enumerate(UpperCamelCase__  ):
              if not isinstance(UpperCamelCase__ ,     (Dataset, IterableDataset)  ):
                     if isinstance(UpperCamelCase__ ,     (DatasetDict, IterableDatasetDict)  ):
                            if not dataset:
                                   raise ValueError(
                                       f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} "
                                       '''is an empty dataset dictionary.'''  )
                            raise ValueError(
                                f"Dataset at position {i} has at least one split: {list(UpperCamelCase__  )}\n"
                                f"Please pick one to interleave with the other datasets, for example: dataset['{next(iter(UpperCamelCase__  )  )}']"  )
                     raise ValueError(
                         f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} is a {type(UpperCamelCase__  ).__name__}."  )
              if i == 0:
                     A__					,	A__											=						(
                         (Dataset, IterableDataset) if isinstance(UpperCamelCase__ ,     UpperCamelCase__  ) else (IterableDataset, Dataset)
                     )
              elif not isinstance(UpperCamelCase__ ,     UpperCamelCase__  ):
                     raise ValueError(
                         f"Unable to interleave a {dataset_type.__name__} (at position 0) with a {other_type.__name__} (at position {i}). Expected a list of Dataset objects or a list of IterableDataset objects."  )
       if dataset_type is Dataset:
              return _concatenate_map_style_datasets(UpperCamelCase__ ,     info=UpperCamelCase__ ,     split=UpperCamelCase__ ,     axis=UpperCamelCase__  )
       else:
              return _concatenate_iterable_datasets(UpperCamelCase__ ,     info=UpperCamelCase__ ,     split=UpperCamelCase__ ,     axis=UpperCamelCase__  )












from ..utils import DummyObject, requires_backends




class     SCREAMING_SNAKE_CASE__ (						metaclass=UpperCamelCase__      ):
 __SCREAMING_SNAKE_CASE							       =	['''keras_nlp''']



 def __init__(							self,*__lowerCamelCase,**__lowerCamelCase ):
        requires_backends(self,['''keras_nlp'''] )





