Simple coroutine friendly event oriented programming for Kotlin.
2026-02-17 22:36:02 +01:00
gradle/wrapper Initial commit 2025-12-20 11:35:15 -05:00
src Update version on readme 2025-12-21 19:16:15 -05:00
.gitignore Add publishing configuration 2025-12-20 13:14:58 -05:00
build.gradle.kts Ensure all interrupted events are cleaned up, add interruptable example 2025-12-21 17:36:31 -05:00
gradle.properties Initial commit 2025-12-20 11:35:15 -05:00
gradlew Initial commit 2025-12-20 11:35:15 -05:00
gradlew.bat Initial commit 2025-12-20 11:35:15 -05:00
LICENSE Add LGPL v3 2025-12-20 11:40:14 -05:00
README.md Update README.md 2026-02-17 22:36:02 +01:00
settings.gradle.kts Initial commit 2025-12-20 11:35:15 -05:00

Effekt

Build Status

Event and effect system for Kotlin.

Installation

Effekt can be installed from the remlit.site releases repository.

repositories {
    mavenCentral()
    maven {
        url = uri("https://repo.remlit.site/releases")
    }
}

dependencies {
    implementation("site.remlit:effekt:0.1.4")
}

Using

To create an event, you can implement the Event interface. You can choose to add parameters that can be use in effects.

class MessageEvent(val message: String) : Event

You can create an effect of this event which prints the message.

effect<MessageEvent> { event ->
    println("Received message ${event.message}")
}

You can also set priority of events. The higher the priority, the sooner the effect executes when an event is called.

// Runs first
effect<MessageEvent>(EffectPriority.High) { event ->
    println("Received message ${event.message}")
}

// Runs last
effect<MessageEvent>(EffectPriority.Low) { event ->
    println("Received message ${event.message} again")
}

When an event is interruptable, you can prevent the remaining effects from running from within an effect.

class MessageEvent(val message: String) : InterruptableEvent

effect<MessageEvent>(EffectPriority.High) { event ->
	println("Received message ${event.message}")
	event.interrupt()
}

// Never runs
effect<MessageEvent>(EffectPriority.Low) { event ->
	println("Received message ${event.message} again")
}