package reactor.core.publisher;
import java.util.Objects;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import org.reactivestreams.Publisher;
import reactor.core.CoreSubscriber;
import reactor.core.Disposable;
import reactor.core.Fuseable;
import reactor.core.Scannable;
import reactor.util.annotation.Nullable;
final class ConnectableLiftFuseable<I, O> extends InternalConnectableFluxOperator<I, O>
implements Scannable, Fuseable {
final BiFunction<Publisher, ? super CoreSubscriber<? super O>, ? extends CoreSubscriber<? super I>>
lifter;
ConnectableLiftFuseable(ConnectableFlux<I> p,
BiFunction<Publisher, ? super CoreSubscriber<? super O>, ? extends CoreSubscriber<? super I>> lifter) {
super(Objects.requireNonNull(p, "source"));
this.lifter = lifter;
}
@Override
public int getPrefetch() {
return source.getPrefetch();
}
@Override
public void connect(Consumer<? super Disposable> cancelSupport) {
this.source.connect(cancelSupport);
}
@Override
@Nullable
public Object scanUnsafe(Attr key) {
if (key == Attr.PREFETCH) return source.getPrefetch();
if (key == Attr.PARENT) return source;
if (key == Attr.RUN_STYLE) return Scannable.from(source).scanUnsafe(key);
return null;
}
@Override
public String stepName() {
if (source instanceof Scannable) {
return Scannable.from(source).stepName();
}
return super.stepName();
}
@Override
public final CoreSubscriber<? super I> subscribeOrReturn(CoreSubscriber<? super O> actual) {
CoreSubscriber<? super I> input =
lifter.apply(source, actual);
Objects.requireNonNull(input, "Lifted subscriber MUST NOT be null");
if (actual instanceof QueueSubscription
&& !(input instanceof QueueSubscription)) {
input = new FluxHide.SuppressFuseableSubscriber<>(input);
}
return input;
}
}