code: def __diff(self, level, parents_ids=frozenset({})):
          
          if level.t1 is level.t2:
              return
  
          if self.__skip_this(level):
              return
  
          if get_type(level.t1) != get_type(level.t2):
              report_type_change = True
              for type_group in self.ignore_type_in_groups:
                  if self.type_check_func(level.t1, type_group) and self.type_check_func(level.t2, type_group):
                      report_type_change = False
                      break
              if report_type_change:
                  self.__diff_types(level)
                  return
  
          if isinstance(level.t1, strings):
              self.__diff_str(level)
  
          elif isinstance(level.t1, numbers):
              self.__diff_numbers(level)
  
          elif isinstance(level.t1, Mapping):
              self.__diff_dict(level, parents_ids)
  
          elif isinstance(level.t1, tuple):
              self.__diff_tuple(level, parents_ids)
  
          elif isinstance(level.t1, (set, frozenset, OrderedSet)):
              self.__diff_set(level)
  
          elif isinstance(level.t1, Iterable):
              if self.ignore_order:
                  self.__diff_iterable_with_deephash(level)
              else:
                  self.__diff_iterable(level, parents_ids)
  
          else:
              self.__diff_obj(level, parents_ids)
docs: The main diff method