ChainHandler.kt

  1. package com.hexagontk.handlers

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

  6.     constructor(
  7.         handlers: List<Handler<T>>,
  8.         filter: (Context<T>) -> Boolean = { true },
  9.     ) : this(handlers.toTypedArray(), filter)

  10.     constructor(
  11.         filter: (Context<T>) -> Boolean,
  12.         vararg handlers: Handler<T>,
  13.     ) : this(handlers as Array<Handler<T>>, filter)

  14.     constructor(vararg handlers: Handler<T>) : this(handlers as Array<Handler<T>>, { true })

  15.     override fun process(context: Context<T>): Context<T> {
  16.         val nextHandlers = context.nextHandlers
  17.         val nextHandler = context.nextHandler

  18.         val nestedContext = context.with(nextHandlers = handlers, nextHandler = 0)
  19.         val nestedResult = nestedContext.next()

  20.         val followUpContext = nestedResult.with(
  21.             predicate = predicate,
  22.             nextHandlers = nextHandlers,
  23.             nextHandler = nextHandler
  24.         )

  25.         return followUpContext.next()
  26.     }
  27. }