code: def functional(ifunctional):
      
  
      @wraps(ifunctional)
      def wrapper(fn, *args, **kw):
  
          fn = ifunctional(fn)
          if args or kw:
              return fn(*args, **kw)
          else:
              return fn
  
      return wrapper
docs: fun(fn) -> function or
      fun(fn, args...) -> call of fn(args...)
      :param ifunctional: f
      :return: decorated function