FactRegistry.kt

Branches > main > 12c8471 > files / src / main / kotlin / net / bowmap / stormbow / FactRegistry.kt


package net.bowmap.stormbow

import kotlinx.collections.immutable.*
import net.bowmap.stormbow.fact.Fact
import net.bowmap.stormbow.effect.Effect
import kotlin.reflect.KClass

// TODO fact handlers can also yield more facts, which themselves need to be handled recursively!
typealias Handler = (Fact) -> PersistentList<Effect>

var registry: PersistentMap<KClass<out Fact>, PersistentList<Handler>> = persistentMapOf()

inline fun <reified T : Fact> handler(noinline handler: T.() -> PersistentList<Effect>) {
  val adapted: (Fact) -> PersistentList<Effect> = { fact ->
    handler(fact as T)
  }
  val list = registry[T::class] ?: persistentListOf()
  registry = registry.putting(T::class, list.adding(adapted))
}