hibiscus/src/main/kotlin/codes/som/hibiscus/api/event/EventBus.kt

28 lines
911 B
Kotlin

package codes.som.hibiscus.api.event
import java.util.concurrent.CopyOnWriteArrayList
class EventBus {
private val listenerMap = mutableMapOf<Class<out Event>, MutableList<Listener<*>>>()
inline fun <reified T : Event> register(listener: Listener<T>) {
this.register(T::class.java, listener)
}
fun <T : Event> register(type: Class<T>, listener: Listener<T>) {
listenerMap.getOrPut(type, ::CopyOnWriteArrayList).add(listener)
}
inline fun <reified T : Event> unregister(listener: Listener<T>) =
unregister(T::class.java, listener)
fun <T : Event> unregister(type: Class<T>, listener: Listener<T>) =
listenerMap[type]?.remove(listener)
fun <T : Event> fire(event: T) {
@Suppress("UNCHECKED_CAST")
val listeners = (listenerMap[event.javaClass] ?: return) as List<Listener<T>>
listeners.forEach { it.on(event) }
}
}