ChainHandler.kt

  1. package com.hexagonkt.handlers

  2. data class ChainHandler<T : Any>(
  3.     val handlers: List<Handler<T>>,
  4.     override val predicate: (Context<T>) -> Boolean = { true },
  5. ) : Handler<T> {

  6.     override val callback: (Context<T>) -> Context<T> = { it }

  7.     constructor(
  8.         filter: (Context<T>) -> Boolean,
  9.         vararg handlers: Handler<T>,
  10.     ) : this(handlers.toList(), filter)

  11.     constructor(vararg handlers: Handler<T>) : this(handlers.toList(), { true })

  12.     override fun process(context: Context<T>): Context<T> {
  13.         val nestedContext = context.with(nextHandlers = handlers, nextHandler = 0)
  14.         val nestedResult = nestedContext.next()
  15.         val followUpContext = nestedResult.with(
  16.             predicate = predicate,
  17.             nextHandlers = context.nextHandlers,
  18.             nextHandler = context.nextHandler
  19.         )
  20.         return followUpContext.next()
  21.     }
  22. }