FactRegistry.kt

Branches > main > d7463bf > 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()

// Pretty please make these the same type :)
fun <F : Fact> register(factClass: KClass<F>, handler: Handler) {
  val list = registry[factClass] ?: persistentListOf()
  registry = registry.putting(factClass, list.adding(handler))
}

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))
}