Guest User

Untitled

a guest
Jan 20th, 2021
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.87 KB | None | 0 0
  1. class EventBus {
  2.  
  3.     private val map = HashMap<KClass<Event>, PriorityQueue<EventQueueElement>>()
  4.  
  5.     fun dispatchEvent(event: Event){
  6.         val list = map[event::class]
  7.         if(!list.isNullOrEmpty()){
  8.             list.forEach { element ->
  9.                 val listener = element.listener
  10.                 listener::class.members.forEach{ method ->
  11.                     if(method.hasAnnotation<EventHandler>() && method.parameters.size == 2){
  12.                         @Suppress("UNCHECKED_CAST")
  13.                         if(method.parameters[1].type.classifier as KClass<Event> == event::class){
  14.                             method.call(listener, event)
  15.                         }
  16.                     }
  17.                 }
  18.             }
  19.         }
  20.     }
  21.  
  22.     fun registerListener(eventListener: Listener, priority: EventPriority){
  23.         val hashSet = HashSet<KClass<Event>>()
  24.         eventListener::class.members.forEach{method ->
  25.             if(method.hasAnnotation<EventHandler>() && method.parameters.size == 2){
  26.                 @Suppress("UNCHECKED_CAST")
  27.                 val eventClass = method.parameters[1].type.classifier as KClass<Event>
  28.                 if(!hashSet.contains(eventClass)) {
  29.                     hashSet.add(eventClass)
  30.                     var list = map[eventClass]
  31.                     if(list.isNullOrEmpty()){
  32.                         list = PriorityQueue<EventQueueElement>()
  33.                     }
  34.                     list.add(EventQueueElement(eventListener, priority))
  35.                     map[eventClass] = list
  36.                 }
  37.             }
  38.         }
  39.     }
  40.  
  41.     private class EventQueueElement(val listener: Listener, val priority: EventPriority = EventPriority.NORMAL) : Comparable<EventQueueElement>{
  42.         override fun compareTo(other: EventQueueElement): Int {
  43.             return priority.compareTo(other.priority)
  44.         }
  45.     }
  46.  
  47. }
Advertisement
Add Comment
Please, Sign In to add comment