docs: def threadpooled(  # noqa: F811
      func: typing.Optional[typing.Callable[..., typing.Union["typing.Awaitable[typing.Any]", typing.Any]]] = None,
      *,
      loop_getter: typing.Union[None, typing.Callable[..., asyncio.AbstractEventLoop], asyncio.AbstractEventLoop] = None,
      loop_getter_need_context: bool = False,
  ) -> typing.Union[
      ThreadPooled,
      typing.Callable[..., "typing.Union[concurrent.futures.Future[typing.Any], typing.Awaitable[typing.Any]]"],
  ]:
      """Post function to ThreadPoolExecutor.
  
      :param func: function to wrap
      :type func: typing.Optional[typing.Callable[..., typing.Union[typing.Awaitable, typing.Any]]]
      :param loop_getter: Method to get event loop, if wrap in asyncio task
      :type loop_getter: typing.Union[
                             None,
                             typing.Callable[..., asyncio.AbstractEventLoop],
                             asyncio.AbstractEventLoop
                         ]
      :param loop_getter_need_context: Loop getter requires function context
      :type loop_getter_need_context: bool
      :return: ThreadPooled instance, if called as function or argumented decorator, else callable wrapper
      :rtype: typing.Union[ThreadPooled, typing.Callable[..., typing.Union[concurrent.futures.Future, typing.Awaitable]]]
      """
      if func is None:
          return ThreadPooled(func=func, loop_getter=loop_getter, loop_getter_need_context=loop_getter_need_context)
      return ThreadPooled(  # type: ignore
          func=None, loop_getter=loop_getter, loop_getter_need_context=loop_getter_need_context
      )(func)