@Override
  public ParSeqBasedCompletionStage<Void> runAfterEitherAsync(CompletionStage<?> other, Runnable action,
      Executor executor)
  {
    return produceEitherStageAsync("runAfterEitherAsync", cast(other, (v) -> null), (t) -> {
      action.run();
      return null;
    }, executor);
  }
@Test
  public void testRunAfterEitherAsync() throws Exception
  {
    Consumer<String> consumer = mock(Consumer.class);
    CountDownLatch waitLatch = new CountDownLatch(1);

    CompletionStage<String> completionStage = createTestStage(TESTVALUE1);
    CompletionStage<String> completionStage2 = createTestStage(TESTVALUE2);
    finish(completionStage.runAfterEitherAsync(completionStage2, () -> {
      assertEquals(THREAD_NAME_VALUE, Thread.currentThread().getName());
      waitLatch.countDown();
    }, _mockExecutor));

    assertTrue(waitLatch.await(1000, TimeUnit.MILLISECONDS));
  }