in ktor-utils/common/src/io/ktor/util/pipeline/Pipeline.kt [306:351]
public fun merge(from: Pipeline<TSubject, TContext>) {
if (fastPathMerge(from)) {
return
}
if (interceptorsQuantity == 0) {
setInterceptorsListFromAnotherPipeline(from)
} else {
resetInterceptorsList()
}
val fromPhases = from.phasesRaw
for (index in 0..fromPhases.lastIndex) {
val fromPhaseOrContent = fromPhases[index]
val fromPhase =
(fromPhaseOrContent as? PipelinePhase) ?: (fromPhaseOrContent as PhaseContent<*, *>).phase
if (!hasPhase(fromPhase)) {
val fromPhaseRelation = when {
fromPhaseOrContent === fromPhase -> PipelinePhaseRelation.Last
else -> (fromPhaseOrContent as PhaseContent<*, *>).relation
}
when (fromPhaseRelation) {
is PipelinePhaseRelation.Last -> addPhase(fromPhase)
is PipelinePhaseRelation.Before -> insertPhaseBefore(
fromPhaseRelation.relativeTo,
fromPhase
)
is PipelinePhaseRelation.After -> insertPhaseAfter(
fromPhaseRelation.relativeTo,
fromPhase
)
}
}
if (fromPhaseOrContent is PhaseContent<*, *> && !fromPhaseOrContent.isEmpty) {
@Suppress("UNCHECKED_CAST")
fromPhaseOrContent as PhaseContent<TSubject, TContext>
fromPhaseOrContent.addTo(findPhase(fromPhase)!!)
interceptorsQuantity += fromPhaseOrContent.size
}
}
}