package eventDemo.libs.event import io.github.oshai.kotlinlogging.KotlinLogging import java.util.Queue import java.util.concurrent.ConcurrentLinkedQueue import kotlin.reflect.KClass /** * An In-Memory implementation of an event stream. * * All methods are implemented. */ class EventStreamInMemory, ID : AggregateId> : EventStream { private val logger = KotlinLogging.logger {} private val events: Queue = ConcurrentLinkedQueue() override fun publish(event: E) { events.add(event) logger.atInfo { message = "Event published: $event" payload = mapOf("event" to event) } } override fun publish(vararg events: E) { events.forEach { publish(it) } } override fun readLast(aggregateId: ID): E? = events.lastOrNull() override fun readLastOf( aggregateId: ID, eventType: KClass, ): R? = events .filterIsInstance(eventType.java) .lastOrNull { it.aggregateId == aggregateId } override fun readAll(aggregateId: ID): Set = events .filter { it.aggregateId == aggregateId } .toSet() } inline fun , ID : AggregateId> EventStream.readLastOf(aggregateId: ID): R? = readLastOf(aggregateId, R::class)