@Override public <B> Promise<B> flatMap(final Function<? super A, ? extends Promise<? extends B>> f) { final SettableFuture<B> result = SettableFuture.create(); final Effect<Throwable> failResult = reject(result); done(new Effect<A>() { @Override public void apply(A v) { try { @SuppressWarnings("unchecked") Promise<B> next = (Promise<B>) f.apply(v); next.done(new Effect<B>() { @Override public void apply(B t) { result.set(t); } }).fail(failResult); } catch (Throwable t) { result.setException(t); } } }).fail(failResult); return new Of<B>(result); }