From 00d07f970a3174d2f06cc91c1249b6deaf619038 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 10 Sep 2025 21:42:25 +0200 Subject: [PATCH] Iterate on SpaceRoomCache thanks to SpaceRoomCacheTest --- .../matrix/impl/spaces/SpaceRoomCache.kt | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomCache.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomCache.kt index ce039b9471..8b7d1f5e1b 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomCache.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomCache.kt @@ -7,36 +7,29 @@ package io.element.android.libraries.matrix.impl.spaces +import io.element.android.libraries.core.coroutine.mapState import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.spaces.SpaceRoom import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import java.util.concurrent.ConcurrentHashMap +import kotlinx.coroutines.flow.update /** * An in memory cache of space rooms. * Only caches Rooms with roomType [io.element.android.libraries.matrix.api.room.RoomType.Space]. */ class SpaceRoomCache { - private val inMemoryCache = ConcurrentHashMap>() - private val mutex = Mutex() - + private val inMemoryCache = MutableStateFlow>(emptyMap()) fun getSpaceRoomFlow(roomId: RoomId): Flow { - return getMutableFlow(roomId).asStateFlow() + return inMemoryCache.mapState { it[roomId] } } - suspend fun update(spaceRooms: List) = mutex.withLock { - spaceRooms - .filter { it.isSpace } - .forEach { spaceRoom -> - getMutableFlow(spaceRoom.roomId).value = spaceRoom - } - } - - private fun getMutableFlow(roomId: RoomId): MutableStateFlow { - return inMemoryCache.getOrPut(roomId, { MutableStateFlow(null) }) + fun update(spaceRooms: List) { + inMemoryCache.update { currentValues -> + val newValues = spaceRooms + .filter { it.isSpace } + .associateBy { it.roomId } + currentValues + newValues + } } }