class_docstr: >>> import gast as ast
  >>> from pythran import passmanager, backend
  >>> node = ast.parse("""
  ... def foo(y):
  ...  return builtins.int == builtins.type(y)""")
  >>> pm = passmanager.PassManager("test")
  >>> _, node = pm.apply(NormalizeTypeIs, node)
  >>> print(pm.dump(backend.Python, node))
  def foo(y):
      return builtins.isinstance(y, builtins.int)
code: def visit_Compare(self, node):
      self.generic_visit(node)
      if not all(isinstance(op, (ast.Is, ast.Eq)) for op in node.ops):
          return node
  
      comparators = node.comparators + [node.left]
      comparators_are_typecall = [
          istypecall(expr) for expr in comparators
      ]
      if not any(comparators_are_typecall):
          return node
  
      self.update = True
  
      typecall_index = comparators_are_typecall.index(True)
      checked_value = comparators[typecall_index].args[0]
      typecalls = [
          expr
          for i, expr in enumerate(comparators)
          if i != typecall_index
      ]
      return reduce(
          lambda x, y: ast.BinOp(
              x,
              ast.BitAnd(),
              ast.Call(
                  ast.Attribute(
                      ast.Name("builtins", ast.Load(), None, None),
                      "isinstance",
                      ast.Load(),
                  ),
                  [checked_value, y],
                  [],
              ),
          ),
          typecalls[1:],
          ast.Call(
              ast.Attribute(
                  ast.Name("builtins", ast.Load(), None, None),
                  "isinstance",
                  ast.Load(),
              ),
              [checked_value, typecalls[0]],
              [],
          ),
      )
  
imports: from pythran.passmanager import Transformation
  import gast
  from functools import reduce
label_desc: Use image node_id 1 for calling the NormalizeTypeIs obj's underlying member method code with example usage: obj.visit_Compare(node) and returns: reduce, node, node