code: def NewType(name, tp):
      
  
      def new_type(x):
          return x
  
      new_type.__name__ = name
      new_type.__supertype__ = tp
      return new_type
docs: NewType creates simple unique types with almost zero
      runtime overhead. NewType(name, tp) is considered a subtype of tp
      by static type checkers. At runtime, NewType(name, tp) returns
      a dummy function that simply returns its argument. Usage::
  
          UserId = NewType('UserId', int)
  
          def name_by_id(user_id: UserId) -> str:
              ...
  
          UserId('user')          # Fails type check
  
          name_by_id(42)          # Fails type check
          name_by_id(UserId(42))  # OK
  
          num = UserId(5) + 1     # type: int