package eventDemo.libs.event import io.github.oshai.kotlinlogging.KotlinLogging import java.util.Queue import java.util.concurrent.ConcurrentLinkedQueue /** * An In-Memory implementation of an event stream. * * All methods are implemented. */ class EventStreamInMemory, ID : AggregateId>( override val aggregateId: ID, ) : EventStream { private val logger = KotlinLogging.logger {} private val events: Queue = ConcurrentLinkedQueue() override fun publish(event: E) { if (event.aggregateId != aggregateId) { throw EventStreamPublishException( "You cannot publish this event in this stream because it has a different aggregateId!", ) } if (events.none { it.eventId == event.eventId }) { events.add(event) logger.info { "Event published" } } } override fun readAll(): Set = events.toSet() override fun readVersionBetween(version: IntRange): Set = events .filter { version.contains(it.version) } .toSet() }