docs: public <T> T invoke(Runnable r, T result) throws Exception {
          if (canProceed()) {
              r.run();
              return result;
          }
          else {
              throw mapException(new FlowRateExceededException());
          }
      }