28 lines
911 B
Kotlin
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) }
|
|
}
|
|
}
|