ChainHandler.kt
package com.hexagonkt.handlers
data class ChainHandler<T : Any>(
val handlers: List<Handler<T>>,
override val predicate: (Context<T>) -> Boolean = { true },
) : Handler<T> {
override val callback: (Context<T>) -> Context<T> = { it }
constructor(
filter: (Context<T>) -> Boolean,
vararg handlers: Handler<T>,
) : this(handlers.toList(), filter)
constructor(vararg handlers: Handler<T>) : this(handlers.toList(), { true })
override fun process(context: Context<T>): Context<T> {
val nestedContext = context.with(nextHandlers = handlers, nextHandler = 0)
val nestedResult = nestedContext.next()
val followUpContext = nestedResult.with(
predicate = predicate,
nextHandlers = context.nextHandlers,
nextHandler = context.nextHandler
)
return followUpContext.next()
}
}