docs: def maybe(func):
      """Calls `f` in a try/except block, returning a `Fail` object if
      the call fails in any way. If any of the arguments to the call are Fail
      objects, the call is not attempted."""
  
      name = object_name(func)
  
      @wraps(func)
      def maybe_wrapped(*args, **kwargs):
          """@maybe wrapped version of ``func``."""
          fails = [
              (name, k, v)
              for k, v in chain(enumerate(args), kwargs.items())
              if isinstance(v, Fail)]
  
          if fails:
              return Fail(func, fails=fails)
  
          try:
              result = func(*args, **kwargs)
  
          except Exception as exc:
              return Fail(func, exception=exc)
  
          else:
              if isinstance(result, Fail):
                  result.add_call(func)
  
              return result
  
      return maybe_wrapped