reactor-core/src/main/java/reactor/core/publisher/Operators.java
public static <I, O> Function<? super Publisher<I>, ? extends Publisher<O>> lift(BiFunction<Scannable, ? super CoreSubscriber<? super O>, ? extends CoreSubscriber<? super I>> lifter) {
		return LiftFunction.liftScannable(null, lifter);
	}
public static <I, O> Function<? super Publisher<I>, ? extends Publisher<O>> lift(BiFunction<Scannable, ? super CoreSubscriber<? super O>, ? extends CoreSubscriber<? super I>> lifter) {
		return LiftFunction.liftScannable(null, lifter);
	}
Create a function that can be used to support a custom operator via
{@link CoreSubscriber} decoration. The function is compatible with
{@link Flux#transform(Function)}, {@link Mono#transform(Function)},
{@link Hooks#onEachOperator(Function)} and {@link Hooks#onLastOperator(Function)},
but requires that the original {@link Publisher} be {@link Scannable}.
<p>
This variant attempts to expose the {@link Publisher} as a {@link Scannable} for
convenience of introspection. You should however avoid instanceof checks or any
other processing that depends on identity of the {@link Publisher}, as it might
get hidden if {@link Scannable#isScanAvailable()} returns {@code false}.
Use {@link #liftPublisher(BiFunction)} instead for that kind of use case.

@param lifter the bifunction taking {@link Scannable} from the enclosing
publisher (assuming it is compatible) and consuming {@link CoreSubscriber}.
It must return a receiving {@link CoreSubscriber} that will immediately subscribe
to the applied {@link Publisher}.

@param <I> the input type
@param <O> the output type

@return a new {@link Function}
@see #liftPublisher(BiFunction)