docs: def greenlet(func, args=(), kwargs=None):
      """create a new greenlet from a function and arguments
  
      :param func: the function the new greenlet should run
      :type func: function
      :param args: any positional arguments for the function
      :type args: tuple
      :param kwargs: any keyword arguments for the function
      :type kwargs: dict or None
  
      the only major difference between this function and that of the basic
      greenlet api is that this one sets the new greenlet's parent to be the
      greenhouse main loop greenlet, which is a requirement for greenlets that
      will wind up in the greenhouse scheduler.
      """
      if args or kwargs:
          def target():
              return func(*args, **(kwargs or {}))
      else:
          target = func
      return compat.greenlet(target, state.mainloop)