Skip to content

Commit 83e02d9

Browse files
committed
Avoid unnecessary map instance creations on Presences
1 parent 080f2cc commit 83e02d9

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

yorkie/src/main/kotlin/dev/yorkie/core/Presences.kt

+11-7
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,34 @@ import dev.yorkie.document.time.ActorID
55
public typealias P = Map<String, String>
66

77
public class Presences private constructor(
8-
private val map: MutableMap<ActorID, MutableMap<String, String>>,
8+
private val map: Map<ActorID, Map<String, String>>,
99
) : Map<ActorID, P> by map {
1010

11-
internal constructor() : this(mutableMapOf())
12-
1311
public operator fun plus(presenceInfo: Pair<ActorID, P>): Presences {
1412
val (actorID, presence) = presenceInfo
1513
val newPresence = map[actorID].orEmpty() + presence
16-
return (map + (actorID to newPresence)).asPresences()
14+
return Presences(map + (actorID to newPresence))
1715
}
1816

19-
public operator fun minus(actorID: ActorID): Presences = (map - actorID).asPresences()
17+
public operator fun minus(actorID: ActorID): Presences {
18+
return Presences(map - actorID)
19+
}
2020

2121
override fun toString(): String {
2222
return map.entries.toString()
2323
}
2424

2525
companion object {
2626
public fun Map<ActorID, P>.asPresences(): Presences {
27-
return Presences(mapValues { it.value.toMutableMap() }.toMutableMap())
27+
return if (this is Presences) {
28+
Presences(map)
29+
} else {
30+
Presences(this)
31+
}
2832
}
2933

3034
public fun Pair<ActorID, P>.asPresences(): Presences {
31-
return Presences(mutableMapOf(first to second.toMutableMap()))
35+
return Presences(mapOf(this))
3236
}
3337

3438
internal val UninitializedPresences = Presences(

yorkie/src/main/kotlin/dev/yorkie/document/Document.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public class Document(
111111
public val presences: StateFlow<Presences> =
112112
combine(_presences, onlineClients) { presences, onlineClients ->
113113
presences.filterKeys { it in onlineClients + changeID.actor }.asPresences()
114-
}.stateIn(scope, SharingStarted.Eagerly, _presences.value.asPresences()).also {
114+
}.stateIn(scope, SharingStarted.Eagerly, _presences.value).also {
115115
scope.launch {
116116
it.collect { presences ->
117117
presenceEventQueue.addAll(pendingPresenceEvents)

0 commit comments

Comments
 (0)