package reactor.core.publisher;
import java.util.Objects;
import java.util.function.BiFunction;
import org.reactivestreams.Publisher;
import reactor.core.CoreSubscriber;
import reactor.core.Fuseable;
import reactor.core.Scannable;
import reactor.util.annotation.Nullable;
final class GroupedLiftFuseable<K, I, O> extends GroupedFlux<K, O>
implements Scannable, Fuseable {
final BiFunction<Publisher, ? super CoreSubscriber<? super O>, ? extends CoreSubscriber<? super I>>
lifter;
final GroupedFlux<K, I> source;
GroupedLiftFuseable(GroupedFlux<K, I> p,
BiFunction<Publisher, ? super CoreSubscriber<? super O>, ? extends CoreSubscriber<? super I>> lifter) {
this.source = Objects.requireNonNull(p, "source");
this.lifter = lifter;
}
@Override
public int getPrefetch() {
return source.getPrefetch();
}
@Override
public K key() {
return source.key();
}
@Override
@Nullable
public Object scanUnsafe(Attr key) {
if (key == Attr.PARENT) {
return source;
}
if (key == Attr.PREFETCH) {
return getPrefetch();
}
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 Scannable.super.stepName();
}
@Override
public void subscribe(CoreSubscriber<? super O> actual) {
CoreSubscriber<? super I> input =
lifter.apply(source, actual);
Objects.requireNonNull(input, "Lifted subscriber MUST NOT be null");
if (actual instanceof Fuseable.QueueSubscription
&& !(input instanceof QueueSubscription)) {
input = new FluxHide.SuppressFuseableSubscriber<>(input);
}
source.subscribe(input);
}
}