@@ -5,35 +5,47 @@ import java.util.concurrent.ConcurrentHashMap
55import java.util.concurrent.ConcurrentSkipListSet
66import kotlin.reflect.KClass
77
8+ /* *
9+ * The [Subscriber] class is a specialized [ConcurrentHashMap]
10+ * that manages sets of [Listener]s for different [Event] types.
11+ *
12+ * It provides methods to [subscribe] and [unsubscribe] [Listener]s and other [Subscriber]s.
13+ * It also allows for the merging of [Subscriber] [Set]s.
14+ *
15+ * @property defaultListenerSet A [ConcurrentSkipListSet] of [Listener]s, sorted in reverse order.
16+ */
817class Subscriber : ConcurrentHashMap <KClass <* >, ConcurrentSkipListSet <Listener >>() {
18+ val defaultListenerSet: ConcurrentSkipListSet <Listener >
19+ get() = ConcurrentSkipListSet (Comparator .reverseOrder())
20+
21+
22+ /* * Allows a [Listener] to start receiving a specific type of [Event] */
923 inline fun <reified T : Event > subscribe (listener : Listener ) =
10- getOrPut(T ::class ) {
11- defaultListenerSet()
12- }.add(listener)
24+ getOrPut(T ::class ) { defaultListenerSet }.add(listener)
1325
26+
27+ /* * Forgets about every [Listener]s association to [eventType] */
1428 fun unsubscribe (eventType : KClass <* >) = remove(eventType)
1529
30+ /* * Allows a [Listener] to stop receiving a specific type of [Event] */
1631 fun unsubscribe (listener : Listener ) {
1732 values.forEach { listeners ->
1833 listeners.remove(listener)
1934 }
2035 }
2136
37+ /* * Allows a [Subscriber] to start receiving all [Event]s of another [Subscriber]. */
2238 infix fun subscribe (subscriber : Subscriber ) {
2339 subscriber.forEach { (eventType, listeners) ->
24- getOrPut(eventType) {
25- defaultListenerSet()
26- }.addAll(listeners)
40+ getOrPut(eventType) { defaultListenerSet }.addAll(listeners)
2741 }
2842 }
2943
44+ /* * Allows a [Subscriber] to stop receiving all [Event]s of another [Subscriber] */
3045 infix fun unsubscribe (subscriber : Subscriber ) {
3146 entries.removeAll { (eventType, listeners) ->
3247 subscriber[eventType]?.let { listeners.removeAll(it) }
3348 listeners.isEmpty()
3449 }
3550 }
36-
37- fun defaultListenerSet (): ConcurrentSkipListSet <Listener > =
38- ConcurrentSkipListSet (Comparator .reverseOrder())
3951}
0 commit comments