package eventDemo.app import io.github.oshai.kotlinlogging.KotlinLogging class EventStream { private val logger = KotlinLogging.logger {} private val eventBus: MutableMap>> = mutableMapOf() fun publish(event: Event) { eventBus.getOrPut(event.id) { mutableListOf() }.add(event) logger.atInfo { message = "Event published: $event" payload = mapOf("event" to event) } } fun publish(vararg events: Event) { events.forEach { publish(it) } } fun > read( aggregateId: ID, eventClass: Class, ): U? { return eventBus.get(aggregateId)?.filterIsInstance(eventClass)?.firstOrNull() } } inline fun , ID : AggregateId> EventStream.read(aggregateId: ID): U? { return this.read(aggregateId, U::class.java) }