def is_compatible(self, typevar, its_type):
        """
        Checks whether its_type conforms to typevar.
        If the typevar is not yet bound, it will be bound to its_type.
        The covariance/contravariance checking described in the respective section
        of PEP484 applies to declared types, but here we have actual types;
        therefore, (1) subtypes are always compatible, (2) we may have to
        rebind the type variable to supertypes of the current binding several
        times until the required most general binding is found.
        """
        result = True
        binding = self.binding_of(typevar)  # may or may not exist
        if binding is None:
            self.bind(typevar, its_type)  # initial binding, OK
        elif issubclass(binding, its_type):
            self.bind(typevar, its_type)  # rebind to supertype, OK
        elif not issubclass(its_type, binding):  # accept like TypeChecker
            return False
        binding = self.binding_of(typevar)  # will now exist
        if (typevar.__bound__ and
                not issubclass(binding, typevar.__bound__)):
            return False  # bound violation
        if (len(typevar.__constraints__) > 0 and
                not issubclass(binding, tg.Union[typevar.__constraints__])):
            return False  # constraint violation
        return True