code: def visit_UnaryOp(self, node):
          
          res = self.visit(node.operand)
          if isinstance(node.op, ast.Not):
              res = Interval(0, 1)
          elif(isinstance(node.op, ast.Invert) and
               isinstance(res.high, int) and
               isinstance(res.low, int)):
              res = Interval(~res.high, ~res.low)
          elif isinstance(node.op, ast.UAdd):
              pass
          elif isinstance(node.op, ast.USub):
              res = Interval(-res.high, -res.low)
          else:
              res = UNKNOWN_RANGE
          return self.add(node, res)
docs: Update range with given unary operation.
  
          >>> import gast as ast
          >>> from pythran import passmanager, backend
          >>> node = ast.parse('''
          ... def foo():
          ...     a = 2
          ...     c = -a
          ...     d = ~a
          ...     f = +a
          ...     e = not a''')
          >>> pm = passmanager.PassManager("test")
          >>> res = pm.gather(RangeValues, node)
          >>> res['f']
          Interval(low=2, high=2)
          >>> res['c']
          Interval(low=-2, high=-2)
          >>> res['d']
          Interval(low=-3, high=-3)
          >>> res['e']
          Interval(low=0, high=1)