From cfaa2a892701e9aaa58bc02bc15e296b224e66df Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 15 Mar 2025 20:43:17 +0600 Subject: [PATCH] add alsoWithUnlockingOnSuccess and alsoWithUnlockingOnSuccessAsync --- CHANGELOG.md | 3 +++ .../coroutines/SmartRWLockerExtensions.kt | 23 +++++++++++++++++++ .../inmo/micro_utils/repos/cache/CacheRepo.kt | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartRWLockerExtensions.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index b55b2dc3453..bf7fc5ca09d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.25.3 +* `Coroutines`: + * Add extensions `SmartRWLocker.alsoWithUnlockingOnSuccessAsync` and `SmartRWLocker.alsoWithUnlockingOnSuccess` + ## 0.25.2 * `Versions`: diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartRWLockerExtensions.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartRWLockerExtensions.kt new file mode 100644 index 00000000000..f644a4f0206 --- /dev/null +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartRWLockerExtensions.kt @@ -0,0 +1,23 @@ +package dev.inmo.micro_utils.coroutines + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job + +suspend inline fun alsoWithUnlockingOnSuccess( + vararg lockers: SmartRWLocker, + block: suspend () -> Unit +): Result { + return runCatching { + block() + }.onSuccess { + lockers.forEach { it.unlockWrite() } + } +} + +fun alsoWithUnlockingOnSuccessAsync( + scope: CoroutineScope, + vararg lockers: SmartRWLocker, + block: suspend () -> Unit +): Job = scope.launchLoggingDropExceptions { + alsoWithUnlockingOnSuccess(*lockers, block = block) +} \ No newline at end of file diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CacheRepo.kt index bf709c4657a..ed4fc1e078b 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CacheRepo.kt @@ -1,7 +1,9 @@ package dev.inmo.micro_utils.repos.cache +import dev.inmo.micro_utils.coroutines.SmartRWLocker import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job interface InvalidatableRepo { /**