FactRegistry.kt
Branches > main > ba82e8d > 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))
}