# Copyright 2023 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_torch_available,
    is_vision_available,
)


lowerCamelCase__           =				{
    'configuration_tvlt': ['TVLT_PRETRAINED_CONFIG_ARCHIVE_MAP', 'TvltConfig'],
    'feature_extraction_tvlt': ['TvltFeatureExtractor'],
    'processing_tvlt': ['TvltProcessor'],
}

try:
		if not is_torch_available():
				raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
		pass
else:
		lowerCamelCase__           =				[
		    'TVLT_PRETRAINED_MODEL_ARCHIVE_LIST',
		    'TvltModel',
		    'TvltForPreTraining',
		    'TvltForAudioVisualClassification',
		    'TvltPreTrainedModel',
		]

try:
		if not is_vision_available():
				raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
		pass
else:
		lowerCamelCase__           =				['TvltImageProcessor']


if TYPE_CHECKING:
		from .configuration_tvlt import TVLT_PRETRAINED_CONFIG_ARCHIVE_MAP, TvltConfig
		from .processing_tvlt import TvltProcessor
		from .feature_extraction_tvlt import TvltFeatureExtractor

		try:
				if not is_torch_available():
						raise OptionalDependencyNotAvailable()
		except OptionalDependencyNotAvailable:
				pass
		else:
				from .modeling_tvlt import (
				    TVLT_PRETRAINED_MODEL_ARCHIVE_LIST,
				    TvltForAudioVisualClassification,
				    TvltForPreTraining,
				    TvltModel,
				    TvltPreTrainedModel,
				)

		try:
				if not is_vision_available():
						raise OptionalDependencyNotAvailable()
		except OptionalDependencyNotAvailable:
				pass
		else:
				from .image_processing_tvlt import TvltImageProcessor


else:
		import sys

		lowerCamelCase__           =				_LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)






from __future__ import annotations

from collections.abc import Iterable
from dataclasses import dataclass
from typing import Any




class 					UpperCamelCase	:
					__UpperCamelCase						=   ("""_front""", """_back""", """_len""")




					@dataclass
					class 					UpperCamelCase	:
										__UpperCamelCase						=   None
										__UpperCamelCase						=   None
										__UpperCamelCase						=   None




					class 					UpperCamelCase	:
										__UpperCamelCase						=   ("""_cur""",)




										def __init__( self :					Dict      ,_lowerCAmelCase :					Deque._Node | None						):


												"""simple docstring"""




												__snake_case		       =     cur




										def __iter__( self :					Dict						):


												"""simple docstring"""




												return self







										def 							UpperCamelCase_						( self :					Optional[Any]						):


												"""simple docstring"""




												if self._cur is None:
														# finished iterating
														raise StopIteration
												__snake_case		       =     self._cur.val
												__snake_case		       =     self._cur.next_node

												return val




					def __init__( self :					Optional[int]      ,_lowerCAmelCase :					Iterable[Any] | None = None						):


							"""simple docstring"""




							__snake_case		       =     None
							__snake_case		       =     None
							__snake_case		       =     0

							if iterable is not None:
									# append every value to the deque
									for val in iterable:
											self.append(_lowerCAmelCase						)




					def 							UpperCamelCase_						( self :					int      ,_lowerCAmelCase :					Any						):


							"""simple docstring"""




							__snake_case		       =     self._Node(_lowerCAmelCase      ,_lowerCAmelCase      ,_lowerCAmelCase						)
							if self.is_empty():
									# front = back
									__snake_case		       =     __snake_case		       =     node
									__snake_case		       =     1
							else:
									# connect nodes
									__snake_case		       =     node
									__snake_case		       =     self._back
									__snake_case		       =     node  # assign new back to the new node

									self._len += 1

									# make sure there were no errors
									assert not self.is_empty(), "Error on appending value."




					def 							UpperCamelCase_						( self :					Any      ,_lowerCAmelCase :					Any						):


							"""simple docstring"""




							__snake_case		       =     self._Node(_lowerCAmelCase      ,_lowerCAmelCase      ,_lowerCAmelCase						)
							if self.is_empty():
									# front = back
									__snake_case		       =     __snake_case		       =     node
									__snake_case		       =     1
							else:
									# connect nodes
									__snake_case		       =     self._front
									__snake_case		       =     node
									__snake_case		       =     node  # assign new front to the new node

									self._len += 1

									# make sure there were no errors
									assert not self.is_empty(), "Error on appending value."




					def 							UpperCamelCase_						( self :					int      ,_lowerCAmelCase :					Iterable[Any]						):


							"""simple docstring"""




							for val in iterable:
									self.append(_lowerCAmelCase						)




					def 							UpperCamelCase_						( self :					Optional[int]      ,_lowerCAmelCase :					Iterable[Any]						):


							"""simple docstring"""




							for val in iterable:
									self.appendleft(_lowerCAmelCase						)




					def 							UpperCamelCase_						( self :					List[Any]						):


							"""simple docstring"""




							assert not self.is_empty(), "Deque is empty."

							__snake_case		       =     self._back
							__snake_case		       =     self._back.prev_node  # set new back
							# drop the last node - python will deallocate memory automatically
							__snake_case		       =     None

							self._len -= 1

							return topop.val




					def 							UpperCamelCase_						( self :					List[str]						):


							"""simple docstring"""




							assert not self.is_empty(), "Deque is empty."

							__snake_case		       =     self._front
							__snake_case		       =     self._front.next_node  # set new front and drop the first node
							__snake_case		       =     None

							self._len -= 1

							return topop.val




					def 							UpperCamelCase_						( self :					int						):


							"""simple docstring"""




							return self._front is None




					def __len__( self :					Tuple						):


							"""simple docstring"""




							return self._len




					def __eq__( self :					Union[str, Any]      ,_lowerCAmelCase :					object						):


							"""simple docstring"""




							if not isinstance(_lowerCAmelCase      ,_lowerCAmelCase						):
									return NotImplemented

							__snake_case		       =     self._front
							__snake_case		       =     other._front

							# if the length of the dequeues are not the same, they are not equal
							if len(self						) != len(_lowerCAmelCase						):
									return False

							while me is not None and oth is not None:
									# compare every value
									if me.val != oth.val:
											return False
									__snake_case		       =     me.next_node
									__snake_case		       =     oth.next_node

							return True




					def __iter__( self :					Tuple						):


							"""simple docstring"""




							return Deque._Iterator(self._front						)







					def __repr__( self :					List[Any]						):


							"""simple docstring"""




							__snake_case		       =     []
							__snake_case		       =     self._front
							while aux is not None:
									# append the values in a list to display
									values_list.append(aux.val						)
									__snake_case		       =     aux.next_node

							return F"""[{", ".join(repr(_lowerCAmelCase						) for val in values_list						)}]"""


if __name__ == "__main__":
		import doctest

		doctest.testmod()





