docs: def _get_function_wrapper(
          self, func: typing.Callable[..., typing.Union["typing.Awaitable[typing.Any]", typing.Any]]
      ) -> typing.Callable[..., "typing.Union[concurrent.futures.Future[typing.Any], typing.Awaitable[typing.Any]]"]:
          """Here should be constructed and returned real decorator.
  
          :param func: Wrapped function
          :type func: typing.Callable
          :return: wrapped coroutine or function
          :rtype: typing.Callable[..., typing.Union[typing.Awaitable, concurrent.futures.Future]]
          """
          prepared = self._await_if_required(func)
  
          # noinspection PyMissingOrEmptyDocstring
          @functools.wraps(prepared)  # pylint: disable=missing-docstring
          def wrapper(
              *args: typing.Any, **kwargs: typing.Any
          ) -> typing.Union[
              "concurrent.futures.Future[typing.Any]",
              "typing.Awaitable[typing.Any]",
              typing.Callable[..., "typing.Union[concurrent.futures.Future[typing.Any], typing.Awaitable[typing.Any]]"],
          ]:
              loop: typing.Optional[asyncio.AbstractEventLoop] = self._get_loop(*args, **kwargs)
  
              if loop is None:
                  return self.executor.submit(prepared, *args, **kwargs)
  
              return loop.run_in_executor(self.executor, functools.partial(prepared, *args, **kwargs))
  
          return wrapper