package com.linkedin.parseq.promise;
import com.linkedin.parseq.function.Function1;
public class PromiseTransformer<S, T> implements PromisePropagator<S, T> {
private final Function1<? super S, ? extends T> _transform;
public PromiseTransformer(Function1<? super S, ? extends T> transform) {
_transform = transform;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public <R> PromisePropagator<S, R> compose(final PromisePropagator<T, R> propagator) {
if (propagator instanceof PromiseTransformer) {
return doCompose((PromiseTransformer) propagator);
} else {
return PromisePropagator.super.compose(propagator);
}
}
private <R> PromiseTransformer<S, R> doCompose(final PromiseTransformer<T, R> propagator) {
return new PromiseTransformer<S, R>(_transform.andThen(propagator._transform));
}
@Override
public void accept(Promise<S> src, Settable<T> dst) {
if (src.isFailed()) {
dst.fail(src.getError());
} else {
try {
dst.done(_transform.apply(src.get()));
} catch (Throwable t) {
dst.fail(t);
}
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static final PromiseTransformer IDENTITY = new PromiseTransformer(Function1.identity());
@SuppressWarnings("unchecked")
public static <R> PromiseTransformer<R, R> identity() {
return (PromiseTransformer<R, R>) IDENTITY;
}
}