from typing import Any



class  UpperCamelCase				:

     '''simple docstring'''

     def __init__(					self				,				A_						) ->				Dict:






           """simple docstring"""
           _lowerCamelCase			    =				data
           _lowerCamelCase			    =				None





     def __repr__(					self						) ->				str:






           """simple docstring"""
           return F'Node({self.data})'





class  UpperCamelCase				:

     '''simple docstring'''

     def __init__(					self						) ->				int:






           """simple docstring"""
           _lowerCamelCase			    =				None



     def __iter__(					self						) ->				Any:






           """simple docstring"""
           _lowerCamelCase			    =				self.head
           while node:
                 yield node.data
                 _lowerCamelCase			    =				node.next



     def __len__(					self						) ->				int:






           """simple docstring"""
           return sum(1 for _ in self						)



     def __repr__(					self						) ->				str:






           """simple docstring"""
           return "->".join([str(A_						) for item in self]						)



     def __getitem__(					self				,				A_						) ->				Any:






           """simple docstring"""
           if not 0 <= index < len(self						):
                 raise ValueError('''list index out of range.'''						)
           for i, node in enumerate(self						):
                 if i == index:
                       return node
           return None



     def __setitem__(					self				,				A_				,				A_						) ->				None:






           """simple docstring"""
           if not 0 <= index < len(self						):
                 raise ValueError('''list index out of range.'''						)
           _lowerCamelCase			    =				self.head
           for _ in range(A_						):
                 _lowerCamelCase			    =				current.next
           _lowerCamelCase			    =				data



     def 		UpperCamelCase_						(					self				,				A_						) ->				None:






           """simple docstring"""
           self.insert_nth(len(self						)				,				A_						)



     def 		UpperCamelCase_						(					self				,				A_						) ->				None:






           """simple docstring"""
           self.insert_nth(0				,				A_						)



     def 		UpperCamelCase_						(					self				,				A_				,				A_						) ->				None:






           """simple docstring"""
           if not 0 <= index <= len(self						):
                 raise IndexError('''list index out of range'''						)
           _lowerCamelCase			    =				Node(A_						)
           if self.head is None:
                 _lowerCamelCase			    =				new_node
           elif index == 0:
                 _lowerCamelCase			    =				self.head  # link new_node to head
                 _lowerCamelCase			    =				new_node
           else:
                 _lowerCamelCase			    =				self.head
                 for _ in range(index - 1						):
                       _lowerCamelCase			    =				temp.next
                 _lowerCamelCase			    =				temp.next
                 _lowerCamelCase			    =				new_node



     def 		UpperCamelCase_						(					self						) ->				None:  # print every node data






           """simple docstring"""
           print(self						)



     def 		UpperCamelCase_						(					self						) ->				Any:






           """simple docstring"""
           return self.delete_nth(0						)



     def 		UpperCamelCase_						(					self						) ->				Any:  # delete from tail






           """simple docstring"""
           return self.delete_nth(len(self						) - 1						)



     def 		UpperCamelCase_						(					self				,				A_ = 0						) ->				Any:






           """simple docstring"""
           if not 0 <= index <= len(self						) - 1:  # test if index is valid
                 raise IndexError('''List index out of range.'''						)
           _lowerCamelCase			    =				self.head  # default first node
           if index == 0:
                 _lowerCamelCase			    =				self.head.next
           else:
                 _lowerCamelCase			    =				self.head
                 for _ in range(index - 1						):
                       _lowerCamelCase			    =				temp.next
                 _lowerCamelCase			    =				temp.next
                 _lowerCamelCase			    =				temp.next.next
           return delete_node.data



     def 		UpperCamelCase_						(					self						) ->				bool:






           """simple docstring"""
           return self.head is None





     def 		UpperCamelCase_						(					self						) ->				None:






           """simple docstring"""
           _lowerCamelCase			    =				None
           _lowerCamelCase			    =				self.head

           while current:
                 # Store the current node's next node.
                 _lowerCamelCase			    =				current.next
                 # Make the current node's next point backwards
                 _lowerCamelCase			    =				prev
                 # Make the previous node be the current node
                 _lowerCamelCase			    =				current
                 # Make the current node the next node (to progress iteration)
                 _lowerCamelCase			    =				next_node
           # Return prev in order to put the head at the end
           _lowerCamelCase			    =				prev





def       __magic_name__(  )						->    None:



      '''simple docstring'''

      _lowerCamelCase			    =				LinkedList()
      assert linked_list.is_empty() is True
      assert str(__UpperCAmelCase		) == ""

      try:
            linked_list.delete_head()
            raise AssertionError  # This should not happen.
      except IndexError:
            assert True  # This should happen.

      try:
            linked_list.delete_tail()
            raise AssertionError  # This should not happen.
      except IndexError:
            assert True  # This should happen.

      for i in range(10		):
            assert len(__UpperCAmelCase		) == i
            linked_list.insert_nth(__UpperCAmelCase ,						i + 1		)
      assert str(__UpperCAmelCase		) == "->".join(str(__UpperCAmelCase		) for i in range(1 ,						11		)		)

      linked_list.insert_head(0		)
      linked_list.insert_tail(11		)
      assert str(__UpperCAmelCase		) == "->".join(str(__UpperCAmelCase		) for i in range(0 ,						12		)		)

      assert linked_list.delete_head() == 0
      assert linked_list.delete_nth(9		) == 10
      assert linked_list.delete_tail() == 11
      assert len(__UpperCAmelCase		) == 9
      assert str(__UpperCAmelCase		) == "->".join(str(__UpperCAmelCase		) for i in range(1 ,						10		)		)

      assert all(linked_list[i] == i + 1 for i in range(0 ,						9		)		) is True

      for i in range(0 ,						9		):
            _lowerCamelCase			    =				-i
      assert all(linked_list[i] == -i for i in range(0 ,						9		)		) is True

      linked_list.reverse()
      assert str(__UpperCAmelCase		) == "->".join(str(__UpperCAmelCase		) for i in range(-8 ,						1		)		)




def       __magic_name__(  )						->    None:



      '''simple docstring'''

      _lowerCamelCase			    =				[
          -9,
          100,
          Node(7734_5112		),
          '''dlrow olleH''',
          7,
          5555,
          0,
          -192.5_5555,
          '''Hello, world!''',
          77.9,
          Node(10		),
          None,
          None,
          12.20,
      ]
      _lowerCamelCase			    =				LinkedList()

      for i in test_input:
            linked_list.insert_tail(__UpperCAmelCase		)

      # Check if it's empty or not
      assert linked_list.is_empty() is False
      assert (
          str(__UpperCAmelCase		) == "-9->100->Node(77345112)->dlrow olleH->7->5555->0->"
          "-192.55555->Hello, world!->77.9->Node(10)->None->None->12.2"
      )

      # Delete the head
      _lowerCamelCase			    =				linked_list.delete_head()
      assert result == -9
      assert (
          str(__UpperCAmelCase		) == "100->Node(77345112)->dlrow olleH->7->5555->0->-192.55555->"
          "Hello, world!->77.9->Node(10)->None->None->12.2"
      )

      # Delete the tail
      _lowerCamelCase			    =				linked_list.delete_tail()
      assert result == 12.2
      assert (
          str(__UpperCAmelCase		) == "100->Node(77345112)->dlrow olleH->7->5555->0->-192.55555->"
          "Hello, world!->77.9->Node(10)->None->None"
      )

      # Delete a node in specific location in linked list
      _lowerCamelCase			    =				linked_list.delete_nth(10		)
      assert result is None
      assert (
          str(__UpperCAmelCase		) == "100->Node(77345112)->dlrow olleH->7->5555->0->-192.55555->"
          "Hello, world!->77.9->Node(10)->None"
      )

      # Add a Node instance to its head
      linked_list.insert_head(Node('''Hello again, world!'''		)		)
      assert (
          str(__UpperCAmelCase		)
          == "Node(Hello again, world!)->100->Node(77345112)->dlrow olleH->"
          "7->5555->0->-192.55555->Hello, world!->77.9->Node(10)->None"
      )

      # Add None to its tail
      linked_list.insert_tail(__UpperCAmelCase		)
      assert (
          str(__UpperCAmelCase		)
          == "Node(Hello again, world!)->100->Node(77345112)->dlrow olleH->"
          "7->5555->0->-192.55555->Hello, world!->77.9->Node(10)->None->None"
      )

      # Reverse the linked list
      linked_list.reverse()
      assert (
          str(__UpperCAmelCase		)
          == "None->None->Node(10)->77.9->Hello, world!->-192.55555->0->5555->"
          "7->dlrow olleH->Node(77345112)->100->Node(Hello again, world!)"
      )




def       __magic_name__(  )						->    Optional[Any]:



      '''simple docstring'''

      from doctest import testmod

      testmod()

      _lowerCamelCase			    =				LinkedList()
      linked_list.insert_head(input('''Inserting 1st at head '''		).strip()		)
      linked_list.insert_head(input('''Inserting 2nd at head '''		).strip()		)
      print('''\nPrint list:'''		)
      linked_list.print_list()
      linked_list.insert_tail(input('''\nInserting 1st at tail '''		).strip()		)
      linked_list.insert_tail(input('''Inserting 2nd at tail '''		).strip()		)
      print('''\nPrint list:'''		)
      linked_list.print_list()
      print('''\nDelete head'''		)
      linked_list.delete_head()
      print('''Delete tail'''		)
      linked_list.delete_tail()
      print('''\nPrint list:'''		)
      linked_list.print_list()
      print('''\nReverse linked list'''		)
      linked_list.reverse()
      print('''\nPrint list:'''		)
      linked_list.print_list()
      print('''\nString representation of linked list:'''		)
      print(__UpperCAmelCase		)
      print('''\nReading/changing Node data using indexing:'''		)
      print(F'Element at Position 1: {linked_list[1]}'		)
      _lowerCamelCase			    =				input('''Enter New Value: '''		).strip()
      print('''New list:'''		)
      print(__UpperCAmelCase		)
      print(F'length of linked_list is : {len(__UpperCAmelCase		)}'		)


if __name__ == "__main__":
     main()
from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


snake_case__				= {
    'configuration_whisper': ['WHISPER_PRETRAINED_CONFIG_ARCHIVE_MAP', 'WhisperConfig', 'WhisperOnnxConfig'],
    'feature_extraction_whisper': ['WhisperFeatureExtractor'],
    'processing_whisper': ['WhisperProcessor'],
    'tokenization_whisper': ['WhisperTokenizer'],
}

try:
     if not is_tokenizers_available():
          raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
     pass
else:
     snake_case__				= ['WhisperTokenizerFast']

try:
     if not is_torch_available():
          raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
     pass
else:
     snake_case__				= [
         'WHISPER_PRETRAINED_MODEL_ARCHIVE_LIST',
         'WhisperForConditionalGeneration',
         'WhisperModel',
         'WhisperPreTrainedModel',
         'WhisperForAudioClassification',
     ]

try:
     if not is_tf_available():
          raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
     pass
else:
     snake_case__				= [
         'TF_WHISPER_PRETRAINED_MODEL_ARCHIVE_LIST',
         'TFWhisperForConditionalGeneration',
         'TFWhisperModel',
         'TFWhisperPreTrainedModel',
     ]

try:
     if not is_flax_available():
          raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
     pass
else:
     snake_case__				= [
         'FlaxWhisperForConditionalGeneration',
         'FlaxWhisperModel',
         'FlaxWhisperPreTrainedModel',
         'FlaxWhisperForAudioClassification',
     ]


if TYPE_CHECKING:
     from .configuration_whisper import WHISPER_PRETRAINED_CONFIG_ARCHIVE_MAP, WhisperConfig, WhisperOnnxConfig
     from .feature_extraction_whisper import WhisperFeatureExtractor
     from .processing_whisper import WhisperProcessor
     from .tokenization_whisper import WhisperTokenizer

     try:
          if not is_tokenizers_available():
               raise OptionalDependencyNotAvailable()
     except OptionalDependencyNotAvailable:
          pass
     else:
          from .tokenization_whisper_fast import WhisperTokenizerFast

     try:
          if not is_torch_available():
               raise OptionalDependencyNotAvailable()
     except OptionalDependencyNotAvailable:
          pass
     else:
          from .modeling_whisper import (
              WHISPER_PRETRAINED_MODEL_ARCHIVE_LIST,
              WhisperForAudioClassification,
              WhisperForConditionalGeneration,
              WhisperModel,
              WhisperPreTrainedModel,
          )

     try:
          if not is_tf_available():
               raise OptionalDependencyNotAvailable()
     except OptionalDependencyNotAvailable:
          pass
     else:
          from .modeling_tf_whisper import (
              TF_WHISPER_PRETRAINED_MODEL_ARCHIVE_LIST,
              TFWhisperForConditionalGeneration,
              TFWhisperModel,
              TFWhisperPreTrainedModel,
          )

     try:
          if not is_flax_available():
               raise OptionalDependencyNotAvailable()
     except OptionalDependencyNotAvailable:
          pass
     else:
          from .modeling_flax_whisper import (
              FlaxWhisperForAudioClassification,
              FlaxWhisperForConditionalGeneration,
              FlaxWhisperModel,
              FlaxWhisperPreTrainedModel,
          )

else:
     import sys

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