code: def async_enterable(f):
      
      @functools.wraps(f)
      def wrapper(*args, **kwargs):
  
          class AsyncEnterableInstance:
  
              async def __aenter__(self):
                  self.context = await f(*args, **kwargs)
                  return await self.context.__aenter__()
  
              async def __aexit__(self, *args, **kwargs):
                  await self.context.__aexit__(*args, **kwargs)
  
              def __await__(self):
                  return f(*args, **kwargs).__await__()
  
          return AsyncEnterableInstance()
  
      return wrapper
docs: Decorator. Bring coroutine result up, so it can be used as async context
  
      ::
  
          >>> async def foo():
          ...
          ...     ...
          ...     return AsyncContextInstance(...)
          ...
          ... ctx = await foo()
          ... async with ctx:
          ...
          ...     # do
  
      ::
  
          >>> @async_enterable
          ... async def foo():
          ...
          ...     ...
          ...     return AsyncContextInstance(...)
          ...
          ... async with foo() as ctx:
          ...
          ...     # do
          ...
          ... ctx = await foo()
          ... async with ctx:
          ...
          ...     # do